From 7a3af47051267cad9c934343b7788db3ef30e86a Mon Sep 17 00:00:00 2001 From: cxl Date: Fri, 2 Mar 2012 12:51:32 +0000 Subject: [PATCH] Core: FileStream NOWRITESHARE implemented for Linux,BSD using flock git-svn-id: svn://ultimatepp.org/upp/trunk@4641 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/BlockStream.cpp | 19 +++++++++++++++++++ uppsrc/Core/Core.h | 1 + uppsrc/Core/Stream.h | 6 ++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/uppsrc/Core/BlockStream.cpp b/uppsrc/Core/BlockStream.cpp index a498abd44..d74976b7e 100644 --- a/uppsrc/Core/BlockStream.cpp +++ b/uppsrc/Core/BlockStream.cpp @@ -473,6 +473,11 @@ bool FileStream::Open(const char *name, dword mode, mode_t tmode) { O_RDWR|O_CREAT, tmode); if(handle >= 0) { + if((mode & NOWRITESHARE) && flock(handle, LOCK_EX|LOCK_NB) < 0) { + close(handle); + handle = -1; + return false; + } int64 fsz = LSEEK64_(handle, 0, SEEK_END); if(fsz >= 0) { OpenInit(mode, fsz); @@ -508,6 +513,20 @@ FileStream::~FileStream() { Close(); } +#ifdef PLATFORM_POSIX +bool FileOut::Open(const char *fn, mode_t acm) +{ + return FileStream::Open(fn, FileStream::CREATE|FileStream::NOWRITESHARE, acm); +} +#endif + +#ifdef PLATFORM_WIN32 +bool FileOut::Open(const char *fn) +{ + return FileStream::Open(fn, FileStream::CREATE|FileStream::NOWRITESHARE); +} +#endif + #endif END_UPP_NAMESPACE diff --git a/uppsrc/Core/Core.h b/uppsrc/Core/Core.h index 5db329024..cda6a4504 100644 --- a/uppsrc/Core/Core.h +++ b/uppsrc/Core/Core.h @@ -60,6 +60,7 @@ #include #include #include + #include #include #include #include diff --git a/uppsrc/Core/Stream.h b/uppsrc/Core/Stream.h index 62770b064..4186dccbf 100644 --- a/uppsrc/Core/Stream.h +++ b/uppsrc/Core/Stream.h @@ -418,14 +418,12 @@ public: class FileOut : public FileStream { public: #ifdef PLATFORM_POSIX - bool Open(const char *fn, mode_t acm = 0644) - { return FileStream::Open(fn, FileStream::CREATE, acm); } + bool Open(const char *fn, mode_t acm = 0644); #endif #ifdef PLATFORM_WIN32 - bool Open(const char *fn) { return FileStream::Open(fn, FileStream::CREATE|FileStream::NOWRITESHARE); } + bool Open(const char *fn); #endif - FileOut(const char *fn) { Open(fn); } FileOut() {} };