diff --git a/Foundation/include/Poco/Event_POSIX.h b/Foundation/include/Poco/Event_POSIX.h index b7eb83aa6..19b7438ff 100644 --- a/Foundation/include/Poco/Event_POSIX.h +++ b/Foundation/include/Poco/Event_POSIX.h @@ -22,6 +22,7 @@ #include "Poco/Exception.h" #include #include +#include namespace Poco { @@ -38,10 +39,10 @@ protected: void resetImpl(); private: - bool _auto; - volatile bool _state; - pthread_mutex_t _mutex; - pthread_cond_t _cond; + bool _auto; + std::atomic _state; + pthread_mutex_t _mutex; + pthread_cond_t _cond; }; @@ -50,7 +51,7 @@ private: // inline void EventImpl::setImpl() { - if (pthread_mutex_lock(&_mutex)) + if (pthread_mutex_lock(&_mutex)) throw SystemException("cannot signal event (lock)"); _state = true; if (pthread_cond_broadcast(&_cond)) diff --git a/Foundation/include/Poco/Event_WIN32.h b/Foundation/include/Poco/Event_WIN32.h index 07fdb0984..b8c2bef17 100644 --- a/Foundation/include/Poco/Event_WIN32.h +++ b/Foundation/include/Poco/Event_WIN32.h @@ -21,7 +21,7 @@ #include "Poco/Foundation.h" #include "Poco/Exception.h" #include "Poco/UnWindows.h" - +#include namespace Poco { @@ -37,7 +37,7 @@ protected: void resetImpl(); private: - HANDLE _event; + std::atomic _event; }; diff --git a/Foundation/src/Event_POSIX.cpp b/Foundation/src/Event_POSIX.cpp index 50fb6f78a..833dddff5 100644 --- a/Foundation/src/Event_POSIX.cpp +++ b/Foundation/src/Event_POSIX.cpp @@ -92,7 +92,10 @@ EventImpl::EventImpl(bool autoReset): _auto(autoReset), _state(false) EventImpl::~EventImpl() { - pthread_cond_destroy(&_cond); + if (0 == pthread_mutex_lock(&_mutex)) + pthread_cond_destroy(&_cond); + else poco_unexpected(); + pthread_mutex_unlock(&_mutex); pthread_mutex_destroy(&_mutex); }