diff --git a/Foundation/include/Poco/NamedMutex_UNIX.h b/Foundation/include/Poco/NamedMutex_UNIX.h index 559530adb..da77a32ee 100644 --- a/Foundation/include/Poco/NamedMutex_UNIX.h +++ b/Foundation/include/Poco/NamedMutex_UNIX.h @@ -46,6 +46,7 @@ private: sem_t* _sem; #else int _semid; // semaphore id + bool _owned; #endif }; diff --git a/Foundation/src/NamedMutex_UNIX.cpp b/Foundation/src/NamedMutex_UNIX.cpp index 34b05ca7a..e3c2255b8 100644 --- a/Foundation/src/NamedMutex_UNIX.cpp +++ b/Foundation/src/NamedMutex_UNIX.cpp @@ -72,12 +72,17 @@ NamedMutexImpl::NamedMutexImpl(const std::string& name): union semun arg; arg.val = 1; semctl(_semid, 0, SETVAL, arg); + _owned = true; + return; } else if (errno == EEXIST) { _semid = semget(key, 1, 0); + _owned = false; + if (_semid >= 0) return; } - else throw SystemException(Poco::format("cannot create named mutex %s (semget() failed, errno=%d)", fileName, errno), _name); + + throw SystemException(Poco::format("cannot create named mutex %s (semget() failed, errno=%d)", fileName, errno), _name); #endif // defined(sun) || defined(__APPLE__) || defined(__osf__) || defined(__QNX__) || defined(_AIX) } @@ -86,6 +91,8 @@ NamedMutexImpl::~NamedMutexImpl() { #if defined(sun) || defined(__APPLE__) || defined(__osf__) || defined(__QNX__) || defined(_AIX) sem_close(_sem); +#else + if (_owned) semctl(_semid, 0, IPC_RMID, 0); #endif }