From c88ce89e6142d19e92815455a026eecbd84d6c6a Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 14:01:29 +0100 Subject: [PATCH 1/9] Checkpoint --- cpp/include/Glacier2/SessionHelper.h | 4 +- cpp/include/IceUtil/Monitor.h | 1 + cpp/include/IceUtil/Thread.h | 5 +- cpp/src/Glacier2Lib/SessionHelper.cpp | 70 +++++++++++++-------------- cpp/src/Ice/ImplicitContextI.cpp | 22 ++++----- cpp/src/Ice/Thread.cpp | 16 +++--- 6 files changed, 60 insertions(+), 58 deletions(-) diff --git a/cpp/include/Glacier2/SessionHelper.h b/cpp/include/Glacier2/SessionHelper.h index 2b6b69256fc..c419f3f30b9 100644 --- a/cpp/include/Glacier2/SessionHelper.h +++ b/cpp/include/Glacier2/SessionHelper.h @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -21,6 +20,7 @@ #include #include +#include namespace Glacier2 { @@ -283,7 +283,7 @@ class GLACIER2_API SessionFactoryHelper : public std::enable_shared_from_this #include #include +#include namespace IceUtil { diff --git a/cpp/include/IceUtil/Thread.h b/cpp/include/IceUtil/Thread.h index 18a6f04fa07..87aae224865 100644 --- a/cpp/include/IceUtil/Thread.h +++ b/cpp/include/IceUtil/Thread.h @@ -8,7 +8,8 @@ #include #include #include -#include + +#include namespace IceUtil { @@ -131,7 +132,7 @@ class ICE_API Thread : public virtual IceUtil::Shared protected: const std::string _name; - Mutex _stateMutex; + mutable std::mutex _stateMutex; bool _started; bool _running; diff --git a/cpp/src/Glacier2Lib/SessionHelper.cpp b/cpp/src/Glacier2Lib/SessionHelper.cpp index 039ea00d963..7c2c17b950a 100644 --- a/cpp/src/Glacier2Lib/SessionHelper.cpp +++ b/cpp/src/Glacier2Lib/SessionHelper.cpp @@ -109,7 +109,7 @@ class SessionHelperI : public Glacier2::SessionHelper, public std::enable_shared void dispatchCallback(const Ice::DispatcherCallPtr&, const Ice::ConnectionPtr&); void dispatchCallbackAndWait(const Ice::DispatcherCallPtr&, const Ice::ConnectionPtr&); - IceUtil::Mutex _mutex; + mutable std::mutex _mutex; Ice::CommunicatorPtr _communicator; Ice::ObjectAdapterPtr _adapter; Glacier2::RouterPrxPtr _router; @@ -210,7 +210,7 @@ SessionHelperI::SessionHelperI(const Glacier2::SessionThreadCallbackPtr& threadC void SessionHelperI::destroy() { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); if(_destroy) { return; @@ -244,14 +244,14 @@ SessionHelperI::destroy() Ice::CommunicatorPtr SessionHelperI::communicator() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _communicator; } string SessionHelperI::categoryForClient() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); if(!_router) { throw Glacier2::SessionNotExistException(); @@ -262,7 +262,7 @@ SessionHelperI::categoryForClient() const Ice::ObjectPrxPtr SessionHelperI::addWithUUID(const Ice::ObjectPtr& servant) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); if(!_router) { throw Glacier2::SessionNotExistException(); @@ -276,21 +276,21 @@ SessionHelperI::addWithUUID(const Ice::ObjectPtr& servant) Glacier2::SessionPrxPtr SessionHelperI::session() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _session; } bool SessionHelperI::isConnected() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _connected; } Ice::ObjectAdapterPtr SessionHelperI::objectAdapter() { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return internalObjectAdapter(); } @@ -373,14 +373,14 @@ class ConnectStrategyUserPassword final : public ConnectStrategy void SessionHelperI::connect(const map& context) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); connectImpl(make_shared(context)); } void SessionHelperI::connect(const string& user, const string& password, const map& context) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); connectImpl(make_shared(user, password, context)); } @@ -391,7 +391,7 @@ SessionHelperI::destroyInternal(const Ice::DispatcherCallPtr& disconnected) Ice::CommunicatorPtr communicator; Glacier2::RouterPrxPtr router; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); router = _router; _router = nullptr; _connected = false; @@ -442,7 +442,7 @@ SessionHelperI::destroyCommunicator() { Ice::CommunicatorPtr communicator; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); communicator = _communicator; } @@ -457,7 +457,7 @@ SessionHelperI::connectFailed() { Ice::CommunicatorPtr communicator; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); communicator = _communicator; } @@ -540,14 +540,14 @@ class ConnectThread : public IceUtil::Thread Ice::CommunicatorPtr communicator; try { - IceUtil::Mutex::Lock sync(_session->_mutex); + lock_guard lock(_session->_mutex); communicator = Ice::initialize(_session->_initData); _session->_communicator = communicator; } catch(const Ice::LocalException& ex) { { - IceUtil::Mutex::Lock sync(_session->_mutex); + lock_guard lock(_session->_mutex); _session->_destroy = true; } _session->dispatchCallback(new ConnectFailed(_callback, _session, ex), nullptr); @@ -718,7 +718,7 @@ SessionHelperI::connected(const Glacier2::RouterPrxPtr& router, const Glacier2:: bool destroy; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _router = router; destroy = _destroy; @@ -878,7 +878,7 @@ Glacier2::SessionFactoryHelper::SessionFactoryHelper(const Ice::PropertiesPtr& p Glacier2::SessionFactoryHelper::~SessionFactoryHelper() { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); if(!_threads.empty() && Ice::getProcessLogger()) { Ice::Warning warn(Ice::getProcessLogger()); @@ -894,7 +894,7 @@ Glacier2::SessionFactoryHelper::addThread(const SessionHelper* session, const Ic // currently registered thread for the same session must be finished, so // we just replace it. Caller must join returned thread. // - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); IceUtil::ThreadPtr previous; map::iterator p = _threads.find(session); if(p != _threads.end()) @@ -912,7 +912,7 @@ Glacier2::SessionFactoryHelper::addThread(const SessionHelper* session, const Ic void Glacier2::SessionFactoryHelper::destroy() { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); for(map::iterator p = _threads.begin(); p != _threads.end(); ++p) { p->second->getThreadControl().join(); @@ -923,28 +923,28 @@ Glacier2::SessionFactoryHelper::destroy() void Glacier2::SessionFactoryHelper::setRouterIdentity(const Ice::Identity& identity) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _identity = identity; } Ice::Identity Glacier2::SessionFactoryHelper::getRouterIdentity() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _identity; } void Glacier2::SessionFactoryHelper::setRouterHost(const string& hostname) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _routerHost = hostname; } string Glacier2::SessionFactoryHelper::getRouterHost() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _routerHost; } @@ -963,7 +963,7 @@ Glacier2::SessionFactoryHelper::getSecure() const void Glacier2::SessionFactoryHelper::setProtocol(const string& protocol) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); if(protocol != "tcp" && protocol != "ssl" && protocol != "ws" && @@ -977,35 +977,35 @@ Glacier2::SessionFactoryHelper::setProtocol(const string& protocol) string Glacier2::SessionFactoryHelper::getProtocol() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _protocol; } void Glacier2::SessionFactoryHelper::setTimeout(int timeout) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _timeout = timeout; } int Glacier2::SessionFactoryHelper::getTimeout() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _timeout; } void Glacier2::SessionFactoryHelper::setPort(int port) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _port = port; } int Glacier2::SessionFactoryHelper::getPort() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return getPortInternal(); } @@ -1019,28 +1019,28 @@ Glacier2::SessionFactoryHelper::getPortInternal() const Ice::InitializationData Glacier2::SessionFactoryHelper::getInitializationData() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _initData; } void Glacier2::SessionFactoryHelper::setConnectContext(const map& context) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _context = context; } void Glacier2::SessionFactoryHelper::setUseCallbacks(bool useCallbacks) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _useCallbacks = useCallbacks; } bool Glacier2::SessionFactoryHelper::getUseCallbacks() const { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); return _useCallbacks; } @@ -1050,7 +1050,7 @@ Glacier2::SessionFactoryHelper::connect() SessionHelperIPtr session; map context; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); session = make_shared(make_shared(shared_from_this()), _callback, createInitData(), @@ -1068,7 +1068,7 @@ Glacier2::SessionFactoryHelper::connect(const string& user, const string& passw SessionHelperIPtr session; map context; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); session = make_shared(make_shared(shared_from_this()), _callback, createInitData(), diff --git a/cpp/src/Ice/ImplicitContextI.cpp b/cpp/src/Ice/ImplicitContextI.cpp index 4ab4b26ab08..ca457ffe07c 100644 --- a/cpp/src/Ice/ImplicitContextI.cpp +++ b/cpp/src/Ice/ImplicitContextI.cpp @@ -31,7 +31,7 @@ class SharedImplicitContext : public ImplicitContextI private: Context _context; - IceUtil::Mutex _mutex; + mutable std::mutex _mutex; }; class PerThreadImplicitContext : public ImplicitContextI @@ -142,21 +142,21 @@ ImplicitContextI::cleanupThread() Context SharedImplicitContext::getContext() const { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); return _context; } void SharedImplicitContext::setContext(const Context& newContext) { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); _context = newContext; } bool SharedImplicitContext::containsKey(const string& k) const { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); Context::const_iterator p = _context.find(k); return p != _context.end(); } @@ -164,7 +164,7 @@ SharedImplicitContext::containsKey(const string& k) const string SharedImplicitContext::get(const string& k) const { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); Context::const_iterator p = _context.find(k); if(p == _context.end()) { @@ -176,7 +176,7 @@ SharedImplicitContext::get(const string& k) const string SharedImplicitContext::put(const string& k, const string& v) { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); string& val = _context[k]; string oldVal = val; @@ -187,7 +187,7 @@ SharedImplicitContext::put(const string& k, const string& v) string SharedImplicitContext::remove(const string& k) { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); Context::iterator p = _context.find(k); if(p == _context.end()) { @@ -204,21 +204,21 @@ SharedImplicitContext::remove(const string& k) void SharedImplicitContext::write(const Context& proxyCtx, ::Ice::OutputStream* s) const { - IceUtil::Mutex::Lock lock(_mutex); + unique_lock lock(_mutex); if(proxyCtx.size() == 0) { s->write(_context); } else if(_context.size() == 0) { - lock.release(); + lock.unlock(); s->write(proxyCtx); } else { Context combined = proxyCtx; combined.insert(_context.begin(), _context.end()); - lock.release(); + lock.unlock(); s->write(combined); } } @@ -226,7 +226,7 @@ SharedImplicitContext::write(const Context& proxyCtx, ::Ice::OutputStream* s) co void SharedImplicitContext::combine(const Context& proxyCtx, Context& ctx) const { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); if(proxyCtx.size() == 0) { ctx = _context; diff --git a/cpp/src/Ice/Thread.cpp b/cpp/src/Ice/Thread.cpp index 529a4ad074d..450989d1f86 100644 --- a/cpp/src/Ice/Thread.cpp +++ b/cpp/src/Ice/Thread.cpp @@ -193,7 +193,7 @@ IceUtil::Thread::start(size_t stackSize, int priority) // IceUtil::ThreadPtr keepMe = this; - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); if(_started) { @@ -246,7 +246,7 @@ IceUtil::Thread::start(size_t stackSize, int priority) IceUtil::ThreadControl IceUtil::Thread::getThreadControl() const { - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); if(!_started) { throw ThreadNotStartedException(__FILE__, __LINE__); @@ -269,14 +269,14 @@ IceUtil::Thread::operator<(const Thread& rhs) const bool IceUtil::Thread::isAlive() const { - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); return _running; } void IceUtil::Thread::_done() { - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); _running = false; } @@ -444,7 +444,7 @@ IceUtil::Thread::start(size_t stackSize, bool realtimeScheduling, int priority) // IceUtil::ThreadPtr keepMe = this; - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); if(_started) { @@ -526,7 +526,7 @@ IceUtil::Thread::start(size_t stackSize, bool realtimeScheduling, int priority) IceUtil::ThreadControl IceUtil::Thread::getThreadControl() const { - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); if(!_started) { throw ThreadNotStartedException(__FILE__, __LINE__); @@ -549,14 +549,14 @@ IceUtil::Thread::operator<(const Thread& rhs) const bool IceUtil::Thread::isAlive() const { - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); return _running; } void IceUtil::Thread::_done() { - IceUtil::Mutex::Lock lock(_stateMutex); + lock_guard lock(_stateMutex); _running = false; } From 8a45ee7236bca2568fa70d79715e30eb9b7b36bf Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 14:32:23 +0100 Subject: [PATCH 2/9] Checkpoint --- cpp/src/Ice/LoggerAdminI.cpp | 32 ++--- cpp/src/IceDiscovery/LookupI.cpp | 18 +-- cpp/src/IceDiscovery/LookupI.h | 5 +- cpp/src/IceSSL/OpenSSLEngine.cpp | 165 +----------------------- cpp/src/IceSSL/SChannelCertificateI.cpp | 6 +- 5 files changed, 32 insertions(+), 194 deletions(-) diff --git a/cpp/src/Ice/LoggerAdminI.cpp b/cpp/src/Ice/LoggerAdminI.cpp index 86a01ba57f9..d697eb9ce38 100644 --- a/cpp/src/Ice/LoggerAdminI.cpp +++ b/cpp/src/Ice/LoggerAdminI.cpp @@ -51,7 +51,7 @@ class LoggerAdminI : public Ice::LoggerAdmin, bool removeRemoteLogger(const RemoteLoggerPrxPtr&); - IceUtil::Mutex _mutex; + std::mutex _mutex; list _queue; int _logCount; // non-trace messages const int _maxLogCount; @@ -150,7 +150,8 @@ class LoggerAdminLoggerI : public IceInternal::LoggerAdminLogger, public std::en LoggerPtr _localLogger; const LoggerAdminIPtr _loggerAdmin; - IceUtil::Monitor _monitor; + std::mutex _mutex; + std::condition_variable _conditionVariable; bool _destroyed; IceUtil::ThreadPtr _sendLogThread; @@ -333,7 +334,7 @@ LoggerAdminI::attachRemoteLogger(shared_ptr prx, Filters filters(messageTypes, categories); LogMessageSeq initLogMessages; { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); if(!_sendLogCommunicator) { @@ -440,7 +441,7 @@ LoggerAdminI::getLog(LogMessageTypeSeq messageTypes, StringSeq categories, { LogMessageSeq logMessages; { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); if(messageMax != 0) { @@ -465,7 +466,7 @@ LoggerAdminI::destroy() { CommunicatorPtr sendLogCommunicator; { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); if(!_destroyed) { _destroyed = true; @@ -489,7 +490,7 @@ LoggerAdminI::log(const LogMessage& logMessage) { vector remoteLoggers; - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); // // Put message in _queue @@ -594,7 +595,7 @@ LoggerAdminI::deadRemoteLogger(const RemoteLoggerPrxPtr& remoteLogger, bool LoggerAdminI::removeRemoteLogger(const RemoteLoggerPrxPtr& remoteLogger) { - IceUtil::Mutex::Lock lock(_mutex); + lock_guard lock(_mutex); return _remoteLoggerMap.erase(remoteLogger) > 0; } @@ -685,7 +686,7 @@ LoggerAdminLoggerI::log(const LogMessage& logMessage) if(!remoteLoggers.empty()) { - IceUtil::Monitor::Lock lock(_monitor); + lock_guard lock(_mutex); if(!_sendLogThread) { @@ -694,7 +695,7 @@ LoggerAdminLoggerI::log(const LogMessage& logMessage) } _jobQueue.push_back(new Job(remoteLoggers, logMessage)); - _monitor.notifyAll(); + _conditionVariable.notify_all(); } } @@ -704,7 +705,7 @@ LoggerAdminLoggerI::destroy() IceUtil::ThreadControl sendLogThreadControl; bool joinThread = false; { - IceUtil::Monitor::Lock lock(_monitor); + lock_guard lock(_mutex); if(_sendLogThread) { @@ -712,7 +713,7 @@ LoggerAdminLoggerI::destroy() sendLogThreadControl = _sendLogThread->getThreadControl(); _sendLogThread = 0; _destroyed = true; - _monitor.notifyAll(); + _conditionVariable.notify_all(); } } @@ -736,11 +737,12 @@ LoggerAdminLoggerI::run() for(;;) { - IceUtil::Monitor::Lock lock(_monitor); - while(!_destroyed && _jobQueue.empty()) + unique_lock lock(_mutex); + while (!_destroyed && _jobQueue.empty()) { - _monitor.wait(); + _conditionVariable.wait(lock); } + if(_destroyed) { break; // for(;;) @@ -749,7 +751,7 @@ LoggerAdminLoggerI::run() assert(!_jobQueue.empty()); JobPtr job = _jobQueue.front(); _jobQueue.pop_front(); - lock.release(); + lock.unlock(); for(vector::const_iterator p = job->remoteLoggers.begin(); p != job->remoteLoggers.end(); ++p) { diff --git a/cpp/src/IceDiscovery/LookupI.cpp b/cpp/src/IceDiscovery/LookupI.cpp index ab6c658d13a..9b4792305de 100644 --- a/cpp/src/IceDiscovery/LookupI.cpp +++ b/cpp/src/IceDiscovery/LookupI.cpp @@ -207,7 +207,7 @@ LookupI::~LookupI() void LookupI::destroy() { - Lock sync(*this); + lock_guard lock(_mutex); for(map::const_iterator p = _objectRequests.begin(); p != _objectRequests.end(); ++p) { p->second->finished(0); @@ -309,7 +309,7 @@ LookupI::findAdapterById(string domainId, string adapterId, LookupReplyPrxPtr re void LookupI::findObject(const ObjectCB& cb, const Ice::Identity& id) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _objectRequests.find(id); if(p == _objectRequests.end()) { @@ -336,7 +336,7 @@ LookupI::findObject(const ObjectCB& cb, const Ice::Identity& id) void LookupI::findAdapter(const AdapterCB& cb, const std::string& adapterId) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _adapterRequests.find(adapterId); if(p == _adapterRequests.end()) { @@ -363,7 +363,7 @@ LookupI::findAdapter(const AdapterCB& cb, const std::string& adapterId) void LookupI::foundObject(const Ice::Identity& id, const string& requestId, const Ice::ObjectPrxPtr& proxy) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _objectRequests.find(id); if(p != _objectRequests.end() && p->second->getRequestId() == requestId) // Ignore responses from old requests { @@ -377,7 +377,7 @@ void LookupI::foundAdapter(const string& adapterId, const string& requestId, const Ice::ObjectPrxPtr& proxy, bool isReplicaGroup) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _adapterRequests.find(adapterId); if(p != _adapterRequests.end() && p->second->getRequestId() == requestId) // Ignore responses from old requests { @@ -392,7 +392,7 @@ LookupI::foundAdapter(const string& adapterId, const string& requestId, const Ic void LookupI::objectRequestTimedOut(const ObjectRequestPtr& request) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _objectRequests.find(request->getId()); if(p == _objectRequests.end() || p->second.get() != request.get()) { @@ -420,7 +420,7 @@ LookupI::objectRequestTimedOut(const ObjectRequestPtr& request) void LookupI::adapterRequestException(const AdapterRequestPtr& request, const LocalException& ex) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _adapterRequests.find(request->getId()); if(p == _adapterRequests.end() || p->second.get() != request.get()) { @@ -443,7 +443,7 @@ LookupI::adapterRequestException(const AdapterRequestPtr& request, const LocalEx void LookupI::adapterRequestTimedOut(const AdapterRequestPtr& request) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _adapterRequests.find(request->getId()); if(p == _adapterRequests.end() || p->second.get() != request.get()) { @@ -471,7 +471,7 @@ LookupI::adapterRequestTimedOut(const AdapterRequestPtr& request) void LookupI::objectRequestException(const ObjectRequestPtr& request, const LocalException& ex) { - Lock sync(*this); + lock_guard lock(_mutex); map::iterator p = _objectRequests.find(request->getId()); if(p == _objectRequests.end() || p->second.get() != request.get()) { diff --git a/cpp/src/IceDiscovery/LookupI.h b/cpp/src/IceDiscovery/LookupI.h index 6ff50157e46..eebf2524f9d 100644 --- a/cpp/src/IceDiscovery/LookupI.h +++ b/cpp/src/IceDiscovery/LookupI.h @@ -125,9 +125,7 @@ class AdapterRequest : public RequestT, public std::enab }; using AdapterRequestPtr = std::shared_ptr; -class LookupI : public Lookup, - public std::enable_shared_from_this, - private IceUtil::Mutex +class LookupI : public Lookup, public std::enable_shared_from_this { public: @@ -181,6 +179,7 @@ class LookupI : public Lookup, std::map _objectRequests; std::map _adapterRequests; + std::mutex _mutex; }; class LookupReplyI : public LookupReply diff --git a/cpp/src/IceSSL/OpenSSLEngine.cpp b/cpp/src/IceSSL/OpenSSLEngine.cpp index edf37dec236..4f6ff2bf31f 100644 --- a/cpp/src/IceSSL/OpenSSLEngine.cpp +++ b/cpp/src/IceSSL/OpenSSLEngine.cpp @@ -44,61 +44,10 @@ mutex staticMutex; int instanceCount = 0; bool initOpenSSL = false; -#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) -IceUtil::Mutex* locks = 0; -#endif - } extern "C" { -// -// OpenSSL 1.1.0 introduces a new thread API and removes -// the need to use a custom thread callback. -// -#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) -// -// OpenSSL mutex callback. -// -void -IceSSL_opensslLockCallback(int mode, int n, const char* /*file*/, int /*line*/) -{ - assert(locks); - if(mode & CRYPTO_LOCK) - { - locks[n].lock(); - } - else - { - locks[n].unlock(); - } -} - -// -// OpenSSL thread id callback. -// -unsigned long -IceSSL_opensslThreadIdCallback() -{ -# if defined(_WIN32) - return static_cast(GetCurrentThreadId()); -# elif defined(__FreeBSD__) || defined(__APPLE__) || defined(__osf1__) - // - // On some platforms, pthread_t is a pointer to a per-thread structure. - // - return reinterpret_cast(pthread_self()); -# elif defined(__linux__) || defined(__sun) || defined(__hpux) || defined(_AIX) || defined(__GLIBC__) - // - // On Linux, Solaris, HP-UX and AIX, pthread_t is an integer. - // - return static_cast(pthread_self()); -# else -# error "Unknown platform" -# endif -} - -#endif - int IceSSL_opensslPasswordCallback(char* buf, int size, int flag, void* userData) { @@ -129,11 +78,7 @@ IceSSL_opensslPasswordCallback(char* buf, int size, int flag, void* userData) DH* IceSSL_opensslDHCallback(SSL* ssl, int /*isExport*/, int keyLength) { -# if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) SSL_CTX* ctx = SSL_get_SSL_CTX(ssl); -# else - SSL_CTX* ctx = ssl->ctx; -# endif OpenSSL::SSLEngine* p = reinterpret_cast(SSL_CTX_get_ex_data(ctx, 0)); return p->dhParams(keyLength); } @@ -144,33 +89,6 @@ IceSSL_opensslDHCallback(SSL* ssl, int /*isExport*/, int keyLength) namespace { -// OpenSSL 1.1.0 introduces a new thread API and removes the need to use a custom thread callback. -#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) -class Init -{ -public: - - ~Init() - { - if(CRYPTO_get_locking_callback() == IceSSL_opensslLockCallback) - { - assert(locks); - CRYPTO_set_locking_callback(0); - delete[] locks; - locks = 0; - } - - if(CRYPTO_get_id_callback() == IceSSL_opensslThreadIdCallback) - { - CRYPTO_set_id_callback(0); - } - } -}; - -Init init; - -#endif - bool passwordError() { @@ -215,43 +133,6 @@ OpenSSL::SSLEngine::SSLEngine(const CommunicatorPtr& communicator) : initOpenSSL = properties->getPropertyAsIntWithDefault("IceSSL.InitOpenSSL", 1) > 0; if(initOpenSSL) { - - // - // OpenSSL 1.1.0 remove the need for library initialization and cleanup. - // -#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) - if(!CRYPTO_get_id_callback()) - { - CRYPTO_set_id_callback(IceSSL_opensslThreadIdCallback); - } - - // - // Create the mutexes and set the callbacks. - // - if(!CRYPTO_get_locking_callback()) - { - assert(!locks); - locks = new IceUtil::Mutex[CRYPTO_num_locks()]; - CRYPTO_set_locking_callback(IceSSL_opensslLockCallback); - } - - // - // Load human-readable error messages. - // - SSL_load_error_strings(); - - // - // Initialize the SSL library. - // - SSL_library_init(); - - // - // This is necessary to allow programs that use OpenSSL 0.9.x to - // load private key files generated by OpenSSL 1.x. - // - OpenSSL_add_all_algorithms(); -#endif - // // Initialize the PRNG. // @@ -336,32 +217,6 @@ OpenSSL::SSLEngine::cleanup() // Must be called with the static mutex locked. // --instanceCount; - // - // OpenSSL 1.1.0 remove the need for library initialization and cleanup. We - // still need to decrement instanceCount - // -#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) - // - // Clean up OpenSSL resources. - // - if(instanceCount == 0 && initOpenSSL) - { - // - // NOTE: We can't destroy the locks here: threads which might have called openssl methods - // might access openssl locks upon termination (from DllMain/THREAD_DETACHED). Instead, - // we release the locks in the ~Init() static destructor. See bug #4156. - // - //CRYPTO_set_locking_callback(0); - //CRYPTO_set_id_callback(0); - //delete[] locks; - //locks = 0; - - CRYPTO_cleanup_all_ex_data(); - RAND_cleanup(); - ERR_free_strings(); - EVP_cleanup(); - } -#endif } OpenSSL::SSLEngine::~SSLEngine() @@ -422,7 +277,6 @@ OpenSSL::SSLEngine::initialize() "IceSSL: unable to create SSL context:\n" + sslErrors()); } -#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) int securityLevel = properties->getPropertyAsIntWithDefault(propPrefix + "SecurityLevel", -1); if(securityLevel != -1) { @@ -433,7 +287,7 @@ OpenSSL::SSLEngine::initialize() "IceSSL: unable to set SSL security level:\n" + sslErrors()); } } -#endif + // // Check for a default directory. We look in this directory for // files mentioned in the configuration. @@ -1067,24 +921,7 @@ OpenSSL::SSLEngine::parseProtocols(const StringSeq& protocols) const SSL_METHOD* OpenSSL::SSLEngine::getMethod(int /*protocols*/) { -#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER) SSL_METHOD* meth = const_cast(TLS_method()); -#else - // - // Despite its name, the SSLv23 method can negotiate SSL3, TLS1.0, TLS1.1, and TLS1.2. - // We use the const_cast for backward compatibility with older OpenSSL releases. - // - SSL_METHOD* meth = const_cast(SSLv23_method()); - - /* - * Early versions of OpenSSL 1.0.1 would not negotiate a TLS1.2 connection using - * the SSLv23 method. You can enable the code below to override the method. - if(protocols & TLSv1_2) - { - meth = const_cast(TLSv1_2_method()); - } - */ -#endif return meth; } diff --git a/cpp/src/IceSSL/SChannelCertificateI.cpp b/cpp/src/IceSSL/SChannelCertificateI.cpp index f0733f96da5..3dd54255c76 100644 --- a/cpp/src/IceSSL/SChannelCertificateI.cpp +++ b/cpp/src/IceSSL/SChannelCertificateI.cpp @@ -59,8 +59,7 @@ class SCHannelX509ExtensionI : public X509Extension class SChannelCertificateI : public SChannel::Certificate, public CertificateI, - public IceSSL::CertificateExtendedInfo, - public IceUtil::Mutex + public IceSSL::CertificateExtendedInfo { public: @@ -96,6 +95,7 @@ class SChannelCertificateI : public SChannel::Certificate, CERT_SIGNED_CONTENT_INFO* _cert; CERT_INFO* _certInfo; CertInfoHolderPtr _certInfoHolder; + std::mutex _mutex; }; const Ice::Long TICKS_PER_MSECOND = 10000LL; @@ -523,7 +523,7 @@ SChannelCertificateI::getCert() const void SChannelCertificateI::loadX509Extensions() const { - IceUtil::Mutex::Lock sync(*this); + lock_guard lock(_mutex); if(_extensions.empty()) { for(size_t i = 0; i < _certInfo->cExtension; ++i) From 7c5bad8b72c0c47bf59e688d8610bef847a8a0b6 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 15:27:26 +0100 Subject: [PATCH 3/9] Checkpoint --- cpp/src/Ice/IncomingAsync.cpp | 24 +++---------- cpp/src/Ice/Instance.cpp | 6 ++-- cpp/src/Ice/Instance.h | 2 +- cpp/src/Ice/Selector.cpp | 26 +++++++------- cpp/src/Ice/Selector.h | 3 +- cpp/src/Ice/Service.cpp | 17 +++++----- cpp/src/IceBT/DBus.cpp | 45 ++++++++++++------------- cpp/src/IceGrid/Client.cpp | 2 +- cpp/src/IceLocatorDiscovery/Plugin.h | 5 +-- cpp/src/IceLocatorDiscovery/PluginI.cpp | 35 +++++++++---------- cpp/src/IcePatch2Lib/ClientUtil.cpp | 32 +++++++++--------- cpp/src/IceSSL/OpenSSLCertificateI.cpp | 8 ++--- 12 files changed, 93 insertions(+), 112 deletions(-) diff --git a/cpp/src/Ice/IncomingAsync.cpp b/cpp/src/Ice/IncomingAsync.cpp index 2dac5b24a47..1c1d1c208e8 100644 --- a/cpp/src/Ice/IncomingAsync.cpp +++ b/cpp/src/Ice/IncomingAsync.cpp @@ -12,6 +12,8 @@ #include #include +#include + using namespace std; using namespace Ice; using namespace IceInternal; @@ -19,25 +21,7 @@ using namespace IceInternal; namespace { -IceUtil::Mutex* globalMutex = 0; - -class Init -{ -public: - - Init() - { - globalMutex = new IceUtil::Mutex; - } - - ~Init() - { - delete globalMutex; - globalMutex = 0; - } -}; - -Init init; +std::mutex globalMutex; } @@ -119,7 +103,7 @@ IceInternal::IncomingAsync::completed(exception_ptr ex) void IceInternal::IncomingAsync::checkResponseSent() { - IceUtil::Mutex::Lock sync(*globalMutex); + lock_guard lock(globalMutex); if(_responseSent) { throw ResponseSentException(__FILE__, __LINE__); diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp index 924e95387a7..8a86751c604 100644 --- a/cpp/src/Ice/Instance.cpp +++ b/cpp/src/Ice/Instance.cpp @@ -1763,7 +1763,7 @@ IceInternal::Instance::updateThreadObservers() BufSizeWarnInfo IceInternal::Instance::getBufSizeWarn(Short type) { - IceUtil::Mutex::Lock lock(_setBufSizeWarnMutex); + lock_guard lock(_setBufSizeWarnMutex); return getBufSizeWarnInternal(type); } @@ -1791,7 +1791,7 @@ IceInternal::Instance::getBufSizeWarnInternal(Short type) void IceInternal::Instance::setSndBufSizeWarn(Short type, int size) { - IceUtil::Mutex::Lock lock(_setBufSizeWarnMutex); + lock_guard lock(_setBufSizeWarnMutex); BufSizeWarnInfo info = getBufSizeWarnInternal(type); info.sndWarn = true; @@ -1802,7 +1802,7 @@ IceInternal::Instance::setSndBufSizeWarn(Short type, int size) void IceInternal::Instance::setRcvBufSizeWarn(Short type, int size) { - IceUtil::Mutex::Lock lock(_setBufSizeWarnMutex); + lock_guard lock(_setBufSizeWarnMutex); BufSizeWarnInfo info = getBufSizeWarnInternal(type); info.rcvWarn = true; diff --git a/cpp/src/Ice/Instance.h b/cpp/src/Ice/Instance.h index d3276e0aeb7..1f9bdb5ef43 100644 --- a/cpp/src/Ice/Instance.h +++ b/cpp/src/Ice/Instance.h @@ -195,7 +195,7 @@ class Instance : public IceUtil::Shared, public IceUtil::Monitor _adminFacetFilter; IceInternal::MetricsAdminIPtr _metricsAdmin; std::map _setBufSizeWarn; - IceUtil::Mutex _setBufSizeWarnMutex; + std::mutex _setBufSizeWarnMutex; }; class ProcessI : public Ice::Process diff --git a/cpp/src/Ice/Selector.cpp b/cpp/src/Ice/Selector.cpp index 88c973283bc..35c3654dee5 100644 --- a/cpp/src/Ice/Selector.cpp +++ b/cpp/src/Ice/Selector.cpp @@ -182,22 +182,20 @@ Selector::getNextHandler(SocketOperation& status, int timeout) } return reinterpret_cast(key); #else - IceUtil::Monitor::Lock lock(_monitor); - while(_events.empty()) + unique_lock lock(_mutex); + if(timeout > 0) { - if(timeout > 0) + _monitor.wait_until(lock, chrono::steady_clock::now() + chrono::seconds(timeout)); + if(_events.empty()) { - _monitor.timedWait(IceUtil::Time::seconds(timeout)); - if(_events.empty()) - { - throw SelectorTimeoutException(); - } - } - else - { - _monitor.wait(); + throw SelectorTimeoutException(); } } + else + { + _conditionVariable.wait(lock, [this] { return !_events.empty(); }); + } + assert(!_events.empty()); IceInternal::EventHandlerPtr handler = _events.front().handler; const SelectEvent& event = _events.front(); @@ -222,9 +220,9 @@ Selector::completed(EventHandler* handler, SocketOperation op) throw Ice::SocketException(__FILE__, __LINE__, GetLastError()); } #else - IceUtil::Monitor::Lock lock(_monitor); + lock_guard lock(_mutex); _events.push_back(SelectEvent(handler->shared_from_this(), op)); - _monitor.notify(); + _conditionVariable.notify_one(); #endif } diff --git a/cpp/src/Ice/Selector.h b/cpp/src/Ice/Selector.h index 704fdfb0d33..c44f6ac28c8 100644 --- a/cpp/src/Ice/Selector.h +++ b/cpp/src/Ice/Selector.h @@ -83,7 +83,8 @@ class Selector #ifdef ICE_USE_IOCP HANDLE _handle; #else - IceUtil::Monitor _monitor; + std::mutex _mutex; + std::condition_variable _conditionVariable; std::deque _events; #endif }; diff --git a/cpp/src/Ice/Service.cpp b/cpp/src/Ice/Service.cpp index bbc7ed7b6b4..9d26cd367e8 100644 --- a/cpp/src/Ice/Service.cpp +++ b/cpp/src/Ice/Service.cpp @@ -79,7 +79,7 @@ Ice_Service_CtrlHandler(DWORD ctrl) namespace { -class ServiceStatusManager : public IceUtil::Monitor +class ServiceStatusManager { public: @@ -134,6 +134,7 @@ class ServiceStatusManager : public IceUtil::Monitor SERVICE_STATUS _status; IceUtil::ThreadPtr _thread; bool _stopped; + std::mutex _mutex; }; static ServiceStatusManager* serviceStatusManager; @@ -1445,7 +1446,7 @@ ServiceStatusManager::ServiceStatusManager(SERVICE_STATUS_HANDLE handle) : void ServiceStatusManager::startUpdate(DWORD state) { - Lock sync(*this); + lock_guard lock(_mutex); assert(state == SERVICE_START_PENDING || state == SERVICE_STOP_PENDING); assert(!_thread); @@ -1465,7 +1466,7 @@ ServiceStatusManager::stopUpdate() IceUtil::ThreadPtr thread; { - Lock sync(*this); + lock_guard lock(_mutex); if(_thread) { @@ -1485,7 +1486,7 @@ ServiceStatusManager::stopUpdate() void ServiceStatusManager::changeStatus(DWORD state, DWORD controlsAccepted) { - Lock sync(*this); + lock_guard lock(_mutex); _status.dwCurrentState = state; _status.dwControlsAccepted = controlsAccepted; @@ -1496,7 +1497,7 @@ ServiceStatusManager::changeStatus(DWORD state, DWORD controlsAccepted) void ServiceStatusManager::reportStatus() { - Lock sync(*this); + lock_guard lock(_mutex); SetServiceStatus(_handle, &_status); } @@ -1504,9 +1505,9 @@ ServiceStatusManager::reportStatus() void ServiceStatusManager::run() { - Lock sync(*this); + unique_lock lock(_mutex); - IceUtil::Time delay = IceUtil::Time::milliSeconds(1000); + auto delay = chrono::milliseconds(1000); _status.dwWaitHint = 2000; _status.dwCheckPoint = 0; @@ -1514,7 +1515,7 @@ ServiceStatusManager::run() { _status.dwCheckPoint++; SetServiceStatus(_handle, &_status); - timedWait(delay); + _conditionVariable.wait_until(chrono::system_clock::now() + delay); } } diff --git a/cpp/src/IceBT/DBus.cpp b/cpp/src/IceBT/DBus.cpp index 114a86df31c..b452b460899 100644 --- a/cpp/src/IceBT/DBus.cpp +++ b/cpp/src/IceBT/DBus.cpp @@ -4,11 +4,12 @@ #include #include -#include -#include #include + #include +#include +#include using namespace std; using namespace IceBT::DBus; @@ -838,7 +839,7 @@ class AsyncResultI : public AsyncResult // bool complete; { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); complete = (::dbus_pending_call_get_completed(_call) && _status == StatusPending); } @@ -855,29 +856,26 @@ class AsyncResultI : public AsyncResult virtual bool isPending() const { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); return _status == StatusPending; } virtual bool isComplete() const { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); return _status == StatusComplete; } virtual MessagePtr waitUntilFinished() const { - IceUtil::Monitor::Lock lock(_lock); - while(_status == StatusPending) - { - _lock.wait(); - } + unique_lock lock(_mutex); + _conditionVariable.wait(lock, [this] { return _status != StatusPending; }); return _reply; } virtual MessagePtr getReply() const { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); return _reply; } @@ -886,7 +884,7 @@ class AsyncResultI : public AsyncResult bool call = false; { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); _callback = cb; if(_status == StatusComplete) { @@ -913,7 +911,7 @@ class AsyncResultI : public AsyncResult AsyncCallbackPtr cb; { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); // // Make sure we haven't already handled the reply (see constructor). @@ -925,7 +923,7 @@ class AsyncResultI : public AsyncResult _reply = MessageI::adopt(m); _status = StatusComplete; cb = _callback; - _lock.notifyAll(); + _conditionVariable.notify_all(); } } @@ -943,7 +941,8 @@ class AsyncResultI : public AsyncResult private: - IceUtil::Monitor _lock; + std::mutex _mutex; + std::condition_variable _conditionVariable; DBusPendingCall* _call; AsyncCallbackPtr _callback; @@ -995,14 +994,14 @@ class ConnectionI : public Connection virtual void addFilter(const FilterPtr& f) { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); _filters.push_back(f); } virtual void removeFilter(const FilterPtr& f) { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); for(vector::iterator p = _filters.begin(); p != _filters.end(); ++p) { @@ -1016,7 +1015,7 @@ class ConnectionI : public Connection virtual void addService(const string& path, const ServicePtr& s) { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); map::iterator p = _services.find(path); if(p != _services.end()) @@ -1028,7 +1027,7 @@ class ConnectionI : public Connection virtual void removeService(const string& path) { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); map::iterator p = _services.find(path); if(p != _services.end()) @@ -1080,7 +1079,7 @@ class ConnectionI : public Connection ; { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); _closed = true; _services.clear(); } @@ -1128,7 +1127,7 @@ class ConnectionI : public Connection vector filters; map services; { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); filters = _filters; services = _services; } @@ -1175,7 +1174,7 @@ class ConnectionI : public Connection { while(::dbus_connection_read_write_dispatch(_connection, 200)) { - IceUtil::Monitor::Lock lock(_lock); + lock_guard lock(_mutex); if(_closed) { break; @@ -1206,7 +1205,7 @@ class ConnectionI : public Connection DBusConnection* _connection; IceUtil::ThreadPtr _thread; - IceUtil::Monitor _lock; + std::mutex _mutex; bool _closed; vector _filters; map _services; diff --git a/cpp/src/IceGrid/Client.cpp b/cpp/src/IceGrid/Client.cpp index 4d6d9570a21..6bfc9f0b555 100644 --- a/cpp/src/IceGrid/Client.cpp +++ b/cpp/src/IceGrid/Client.cpp @@ -352,7 +352,7 @@ run(const Ice::StringSeq& args) auto plugin = dynamic_pointer_cast(pluginObj); plugin->initialize(); - auto locators = plugin->getLocators(instanceName, IceUtil::Time::milliSeconds(300)); + auto locators = plugin->getLocators(instanceName, chrono::milliseconds(300)); if(locators.size() > 1) { consoleOut << "found " << locators.size() << " Ice locators:" << endl; diff --git a/cpp/src/IceLocatorDiscovery/Plugin.h b/cpp/src/IceLocatorDiscovery/Plugin.h index 5bb2c8b5ffb..19467bbae28 100644 --- a/cpp/src/IceLocatorDiscovery/Plugin.h +++ b/cpp/src/IceLocatorDiscovery/Plugin.h @@ -8,7 +8,8 @@ #include #include #include -#include + +#include // // Automatically link IceLocatorDiscovery[D|++11|++11D].lib with Visual C++ @@ -38,7 +39,7 @@ class ICE_LOCATOR_DISCOVERY_API Plugin : public Ice::Plugin { public: - virtual std::vector getLocators(const std::string&, const IceUtil::Time&) const = 0; + virtual std::vector getLocators(const std::string&, const std::chrono::milliseconds&) const = 0; }; using PluginPtr = std::shared_ptr; diff --git a/cpp/src/IceLocatorDiscovery/PluginI.cpp b/cpp/src/IceLocatorDiscovery/PluginI.cpp index 3753850513b..0f0a57365b9 100644 --- a/cpp/src/IceLocatorDiscovery/PluginI.cpp +++ b/cpp/src/IceLocatorDiscovery/PluginI.cpp @@ -59,7 +59,6 @@ using RequestPtr = std::shared_ptr; class LocatorI : public Ice::BlobjectArrayAsync, public IceUtil::TimerTask, - private IceUtil::Monitor, public std::enable_shared_from_this { public: @@ -75,7 +74,7 @@ class LocatorI : public Ice::BlobjectArrayAsync, void foundLocator(const Ice::LocatorPrxPtr&); void invoke(const Ice::LocatorPrxPtr&, const RequestPtr&); - vector getLocators(const string&, const IceUtil::Time&); + vector getLocators(const string&, const chrono::milliseconds&); void exception(const Ice::LocalException&); @@ -103,6 +102,8 @@ class LocatorI : public Ice::BlobjectArrayAsync, size_t _failureCount; bool _warnOnce; vector _pendingRequests; + std::mutex _mutex; + std::condition_variable _conditionVariable; }; using LocatorIPtr = std::shared_ptr; @@ -161,7 +162,7 @@ class PluginI : public Plugin virtual void initialize(); virtual void destroy(); - virtual vector getLocators(const string&, const IceUtil::Time&) const; + virtual vector getLocators(const string&, const chrono::milliseconds&) const; private: @@ -289,7 +290,7 @@ PluginI::initialize() } vector -PluginI::getLocators(const string& instanceName, const IceUtil::Time& waitTime) const +PluginI::getLocators(const string& instanceName, const chrono::milliseconds& waitTime) const { return _locator->getLocators(instanceName, waitTime); } @@ -512,13 +513,13 @@ LocatorI::ice_invokeAsync(pair inParams, } vector -LocatorI::getLocators(const string& instanceName, const IceUtil::Time& waitTime) +LocatorI::getLocators(const string& instanceName, const chrono::milliseconds& waitTime) { // // Clear locators from previous search // { - Lock sync(*this); + lock_guard lock(_mutex); _locators.clear(); } @@ -532,21 +533,21 @@ LocatorI::getLocators(const string& instanceName, const IceUtil::Time& waitTime) // if(instanceName.empty()) { - IceUtil::ThreadControl::sleep(waitTime); + std::this_thread::sleep_for(waitTime); } else { - Lock sync(*this); + unique_lock lock(_mutex); while(_locators.find(instanceName) == _locators.end() && _pending) { - timedWait(waitTime); + _conditionVariable.wait_until(lock, chrono::steady_clock::now() + waitTime); } } // // Return found locators // - Lock sync(*this); + lock_guard lock(_mutex); vector locators; for(map::const_iterator p = _locators.begin(); p != _locators.end(); ++p) { @@ -558,7 +559,7 @@ LocatorI::getLocators(const string& instanceName, const IceUtil::Time& waitTime) void LocatorI::foundLocator(const Ice::LocatorPrxPtr& locator) { - Lock sync(*this); + lock_guard lock(_mutex); if(!locator) { @@ -659,7 +660,7 @@ LocatorI::foundLocator(const Ice::LocatorPrxPtr& locator) if(_pendingRequests.empty()) { _locators[locator->ice_getIdentity().category] = l; - notify(); + _conditionVariable.notify_one(); } else { @@ -683,7 +684,7 @@ LocatorI::foundLocator(const Ice::LocatorPrxPtr& locator) void LocatorI::invoke(const Ice::LocatorPrxPtr& locator, const RequestPtr& request) { - Lock sync(*this); + lock_guard lock(_mutex); if(request && _locator && _locator != locator) { request->invoke(_locator); @@ -763,7 +764,7 @@ LocatorI::invoke(const Ice::LocatorPrxPtr& locator, const RequestPtr& request) void LocatorI::exception(const Ice::LocalException& ex) { - Lock sync(*this); + lock_guard lock(_mutex); if(++_failureCount == _lookups.size() && _pending) { // @@ -793,7 +794,7 @@ LocatorI::exception(const Ice::LocalException& ex) if(_pendingRequests.empty()) { - notify(); + _conditionVariable.notify_one(); } else { @@ -809,7 +810,7 @@ LocatorI::exception(const Ice::LocalException& ex) void LocatorI::runTimerTask() { - Lock sync(*this); + lock_guard lock(_mutex); if(!_pending) { assert(_pendingRequests.empty()); @@ -871,7 +872,7 @@ LocatorI::runTimerTask() if(_pendingRequests.empty()) { - notify(); + _conditionVariable.notify_one(); } else { diff --git a/cpp/src/IcePatch2Lib/ClientUtil.cpp b/cpp/src/IcePatch2Lib/ClientUtil.cpp index 93faf697ab2..285c55f5559 100644 --- a/cpp/src/IcePatch2Lib/ClientUtil.cpp +++ b/cpp/src/IcePatch2Lib/ClientUtil.cpp @@ -30,7 +30,7 @@ IcePatch2::PatcherFeedback::~PatcherFeedback() namespace { -class Decompressor : public IceUtil::Thread, public IceUtil::Monitor +class Decompressor : public IceUtil::Thread { public: @@ -51,6 +51,8 @@ class Decompressor : public IceUtil::Thread, public IceUtil::Monitor _files; LargeFileInfoSeq _filesDone; bool _destroy; + mutable std::mutex _mutex; + std::condition_variable _conditionVariable; }; typedef IceUtil::Handle DecompressorPtr; @@ -105,27 +107,27 @@ Decompressor::~Decompressor() void Decompressor::destroy() { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); _destroy = true; - notify(); + _conditionVariable.notify_one(); } void Decompressor::add(const LargeFileInfo& info) { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); if(!_exception.empty()) { throw runtime_error(_exception); } _files.push_back(info); - notify(); + _conditionVariable.notify_one(); } void Decompressor::exception() const { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); if(!_exception.empty()) { throw runtime_error(_exception); @@ -135,7 +137,7 @@ Decompressor::exception() const void Decompressor::log(FILE* fp) { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); for(LargeFileInfoSeq::const_iterator p = _filesDone.begin(); p != _filesDone.end(); ++p) { @@ -156,27 +158,23 @@ Decompressor::run() while(true) { { - IceUtil::Monitor::Lock sync(*this); + unique_lock lock(_mutex); if(!info.path.empty()) { _filesDone.push_back(info); } - while(!_destroy && _files.empty()) + _conditionVariable.wait(lock, [this] { return _destroy || !_files.empty(); }); + if(_files.empty()) { - wait(); + return; } - - if(!_files.empty()) + else { info = _files.front(); _files.pop_front(); } - else - { - return; - } } try @@ -187,7 +185,7 @@ Decompressor::run() } catch(const std::exception& ex) { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); _destroy = true; _exception = ex.what(); return; diff --git a/cpp/src/IceSSL/OpenSSLCertificateI.cpp b/cpp/src/IceSSL/OpenSSLCertificateI.cpp index d7b6defd45e..8e2e51dc21b 100644 --- a/cpp/src/IceSSL/OpenSSLCertificateI.cpp +++ b/cpp/src/IceSSL/OpenSSLCertificateI.cpp @@ -8,8 +8,6 @@ #include #include -#include - #include #include @@ -223,8 +221,7 @@ class OpenSSLX509ExtensionI : public IceSSL::X509Extension class OpenSSLCertificateI : public IceSSL::OpenSSL::Certificate, public CertificateI, - public IceSSL::CertificateExtendedInfo, - public IceUtil::Mutex + public IceSSL::CertificateExtendedInfo { public: @@ -257,6 +254,7 @@ class OpenSSLCertificateI : public IceSSL::OpenSSL::Certificate, private: x509_st* _cert; + std::mutex _mutex; }; } // end anonymous namespace @@ -471,7 +469,7 @@ OpenSSLCertificateI::getCert() const void OpenSSLCertificateI::loadX509Extensions() const { - IceUtil::Mutex::Lock sync(*this); + lock_guard lock(_mutex); if(_extensions.empty()) { int sz = X509_get_ext_count(_cert); From 7bfffd82543b4988e9d8008e0f02a920be106a9e Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 16:31:21 +0100 Subject: [PATCH 4/9] Checkpoint --- cpp/src/Ice/Instance.cpp | 6 ++-- cpp/src/Ice/Instance.h | 1 - cpp/src/Ice/ThreadPool.cpp | 59 ++++++++++++++++--------------- cpp/src/Ice/ThreadPool.h | 6 ++-- cpp/src/Ice/ios/Notifications.mm | 11 +++--- cpp/src/IceDiscovery/LocatorI.cpp | 8 ++--- cpp/src/IceDiscovery/LocatorI.h | 3 +- 7 files changed, 49 insertions(+), 45 deletions(-) diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp index 8a86751c604..223b2287e82 100644 --- a/cpp/src/Ice/Instance.cpp +++ b/cpp/src/Ice/Instance.cpp @@ -203,7 +203,7 @@ class Timer : public IceUtil::Timer virtual void runTimerTask(const IceUtil::TimerTaskPtr&); - IceUtil::Mutex _mutex; + std::mutex _mutex; std::atomic _hasObserver; ObserverHelperT _observer; }; @@ -213,7 +213,7 @@ class Timer : public IceUtil::Timer void Timer::updateObserver(const Ice::Instrumentation::CommunicatorObserverPtr& obsv) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); assert(obsv); _observer.attach(obsv->getThreadObserver("Communicator", "Ice.Timer", @@ -229,7 +229,7 @@ Timer::runTimerTask(const IceUtil::TimerTaskPtr& task) { Ice::Instrumentation::ThreadObserverPtr threadObserver; { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); threadObserver = _observer.get(); } if(threadObserver) diff --git a/cpp/src/Ice/Instance.h b/cpp/src/Ice/Instance.h index 1f9bdb5ef43..9c7235d0bf0 100644 --- a/cpp/src/Ice/Instance.h +++ b/cpp/src/Ice/Instance.h @@ -7,7 +7,6 @@ #include #include -#include #include #include #include diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp index 19d9a31ffb2..504513ac12a 100644 --- a/cpp/src/Ice/ThreadPool.cpp +++ b/cpp/src/Ice/ThreadPool.cpp @@ -170,7 +170,7 @@ IceInternal::ThreadPoolWorkQueue::ThreadPoolWorkQueue(ThreadPool& threadPool) : void IceInternal::ThreadPoolWorkQueue::destroy() { - //Lock sync(*this); Called with the thread pool locked + //lock_guard lock(_mutex); Called with the thread pool locked assert(!_destroyed); _destroyed = true; #if defined(ICE_USE_IOCP) @@ -183,7 +183,7 @@ IceInternal::ThreadPoolWorkQueue::destroy() void IceInternal::ThreadPoolWorkQueue::queue(const ThreadPoolWorkItemPtr& item) { - //Lock sync(*this); Called with the thread pool locked + //lock_guard lock(_mutex); Called with the thread pool locked _workItems.push_back(item); #if defined(ICE_USE_IOCP) _threadPool._selector.completed(this, SocketOperationRead); @@ -216,7 +216,7 @@ IceInternal::ThreadPoolWorkQueue::message(ThreadPoolCurrent& current) { ThreadPoolWorkItemPtr workItem; { - IceUtil::Monitor::Lock sync(_threadPool); + lock_guard lock(_threadPool._mutex); if(!_workItems.empty()) { workItem = _workItems.front(); @@ -458,7 +458,7 @@ IceInternal::ThreadPool::~ThreadPool() void IceInternal::ThreadPool::destroy() { - Lock sync(*this); + lock_guard lock(_mutex); if(_destroyed) { return; @@ -470,7 +470,7 @@ IceInternal::ThreadPool::destroy() void IceInternal::ThreadPool::updateObservers() { - Lock sync(*this); + lock_guard lock(_mutex); for(set::iterator p = _threads.begin(); p != _threads.end(); ++p) { (*p)->updateObserver(); @@ -480,7 +480,7 @@ IceInternal::ThreadPool::updateObservers() void IceInternal::ThreadPool::initialize(const EventHandlerPtr& handler) { - Lock sync(*this); + lock_guard lock(_mutex); assert(!_destroyed); _selector.initialize(handler.get()); @@ -510,7 +510,7 @@ IceInternal::ThreadPool::initialize(const EventHandlerPtr& handler) void IceInternal::ThreadPool::update(const EventHandlerPtr& handler, SocketOperation remove, SocketOperation add) { - Lock sync(*this); + lock_guard lock(_mutex); assert(!_destroyed); // Don't remove what needs to be added @@ -530,7 +530,7 @@ IceInternal::ThreadPool::update(const EventHandlerPtr& handler, SocketOperation bool IceInternal::ThreadPool::finish(const EventHandlerPtr& handler, bool closeNow) { - Lock sync(*this); + lock_guard lock(_mutex); assert(!_destroyed); #if !defined(ICE_USE_IOCP) closeNow = _selector.finish(handler.get(), closeNow); // This must be called before! @@ -556,7 +556,7 @@ IceInternal::ThreadPool::finish(const EventHandlerPtr& handler, bool closeNow) void IceInternal::ThreadPool::ready(const EventHandlerPtr& handler, SocketOperation op, bool value) { - Lock sync(*this); + lock_guard lock(_mutex); if(_destroyed) { return; @@ -610,7 +610,7 @@ IceInternal::ThreadPool::dispatchFromThisThread(const DispatchWorkItemPtr& workI void IceInternal::ThreadPool::dispatch(const DispatchWorkItemPtr& workItem) { - Lock sync(*this); + lock_guard lock(_mutex); if(_destroyed) { throw CommunicatorDestroyedException(__FILE__, __LINE__); @@ -695,7 +695,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) } catch(const ThreadPoolDestroyedException&) { - Lock sync(*this); + lock_guard lock(_mutex); --_inUse; thread->setState(ThreadState::ThreadStateIdle); return; @@ -720,7 +720,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) } catch(const SelectorTimeoutException&) { - Lock sync(*this); + lock_guard lock(_mutex); if(!_destroyed && _inUse == 0) { _workQueue->queue(new ShutdownWorkItem(_instance)); // Select timed-out. @@ -730,7 +730,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) } { - Lock sync(*this); + unique_lock lock(_mutex); if(!current._handler) { if(select) @@ -739,7 +739,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) _nextHandler = _handlers.begin(); select = false; } - else if(!current._leader && followerWait(current)) + else if(!current._leader && followerWait(current, lock)) { return; // Wait timed-out. } @@ -768,7 +768,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) --_inUse; } - if(!current._leader && followerWait(current)) + if(!current._leader && followerWait(current, lock)) { return; // Wait timed-out. } @@ -843,7 +843,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) { if(_sizeMax > 1) { - Lock sync(*this); + lock_guard lock(_mutex); if(_destroyed) { @@ -886,7 +886,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) } catch(const SelectorTimeoutException&) { - Lock sync(*this); + lock_guard lock(_mutex); if(!_destroyed) { _workQueue->queue(new ShutdownWorkItem(_instance)); @@ -896,7 +896,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) } { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); thread->setState(ThreadState::ThreadStateInUseForIO); } @@ -921,7 +921,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) } { - Lock sync(*this); + lock_guard lock(_mutex); if(_sizeMax > 1 && current._ioCompleted) { assert(_inUse > 0); @@ -936,7 +936,7 @@ IceInternal::ThreadPool::run(const EventHandlerThreadPtr& thread) bool IceInternal::ThreadPool::ioCompleted(ThreadPoolCurrent& current) { - IceUtil::Monitor::Lock sync(*this); + lock_guard lock(_mutex); current._ioCompleted = true; // Set the IO completed flag to specifiy that ioCompleted() has been called. @@ -965,7 +965,7 @@ IceInternal::ThreadPool::ioCompleted(ThreadPoolCurrent& current) } else if(_promote && (_nextHandler != _handlers.end() || _inUseIO == 0)) { - notify(); + _conditionVariable.notify_one(); } #endif @@ -1036,7 +1036,7 @@ IceInternal::ThreadPool::startMessage(ThreadPoolCurrent& current) current._handler->_pending = static_cast(current._handler->_pending & ~current.operation); if(!current._handler->_pending && current._handler->_finish) { - Lock sync(*this); + lock_guard lock(_mutex); _workQueue->queue(new FinishedWorkItem(current._handler, false)); _selector.finish(current._handler.get()); } @@ -1055,7 +1055,7 @@ IceInternal::ThreadPool::startMessage(ThreadPoolCurrent& current) current._handler->_pending = static_cast(current._handler->_pending & ~current.operation); if(!current._handler->_pending && current._handler->_finish) { - Lock sync(*this); + lock_guard lock(_mutex); _workQueue->queue(new FinishedWorkItem(current._handler, false)); _selector.finish(current._handler.get()); } @@ -1079,7 +1079,7 @@ IceInternal::ThreadPool::startMessage(ThreadPoolCurrent& current) current._handler->_pending = static_cast(current._handler->_pending & ~current.operation); if(!current._handler->_pending && current._handler->_finish) { - Lock sync(*this); + lock_guard lock(_mutex); _workQueue->queue(new FinishedWorkItem(current._handler, false)); _selector.finish(current._handler.get()); } @@ -1115,7 +1115,7 @@ IceInternal::ThreadPool::finishMessage(ThreadPoolCurrent& current) if(!current._handler->_pending && current._handler->_finish) { // There are no more pending async operations, it's time to call finish. - Lock sync(*this); + lock_guard lock(_mutex); _workQueue->queue(new FinishedWorkItem(current._handler, false)); _selector.finish(current._handler.get()); } @@ -1128,13 +1128,13 @@ IceInternal::ThreadPool::promoteFollower(ThreadPoolCurrent& current) _promote = true; if(_inUseIO < _sizeIO && (_nextHandler != _handlers.end() || _inUseIO == 0)) { - notify(); + _conditionVariable.notify_one(); } current._leader = false; } bool -IceInternal::ThreadPool::followerWait(ThreadPoolCurrent& current) +IceInternal::ThreadPool::followerWait(ThreadPoolCurrent& current, unique_lock& lock) { assert(!current._leader); @@ -1156,7 +1156,8 @@ IceInternal::ThreadPool::followerWait(ThreadPoolCurrent& current) { if(_threadIdleTime) { - if(!timedWait(IceUtil::Time::seconds(_threadIdleTime))) + if(_conditionVariable.wait_until(lock, chrono::steady_clock::now() + chrono::seconds(_threadIdleTime)) != + cv_status::no_timeout) { if(!_destroyed && (!_promote || _inUseIO == _sizeIO || (_nextHandler == _handlers.end() && _inUseIO > 0))) @@ -1175,7 +1176,7 @@ IceInternal::ThreadPool::followerWait(ThreadPoolCurrent& current) } else { - wait(); + _conditionVariable.wait(lock); } } current._leader = true; // The current thread has become the leader. diff --git a/cpp/src/Ice/ThreadPool.h b/cpp/src/Ice/ThreadPool.h index 66bee9fb612..297b128f990 100644 --- a/cpp/src/Ice/ThreadPool.h +++ b/cpp/src/Ice/ThreadPool.h @@ -61,7 +61,7 @@ class DispatchWorkItem : public ThreadPoolWorkItem, public Ice::DispatcherCall }; typedef IceUtil::Handle DispatchWorkItemPtr; -class ThreadPool : public IceUtil::Shared, private IceUtil::Monitor +class ThreadPool : public IceUtil::Shared { class EventHandlerThread : public IceUtil::Thread { @@ -126,7 +126,7 @@ class ThreadPool : public IceUtil::Shared, private IceUtil::Monitor&); #endif std::string nextThreadId(); @@ -167,6 +167,8 @@ class ThreadPool : public IceUtil::Shared, private IceUtil::Monitor #include +#include using namespace std; using namespace IceInternal; @@ -62,7 +63,7 @@ bool add(const IncomingConnectionFactoryPtr& factory) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); if(_background) { factory->stopAcceptor(); @@ -78,14 +79,14 @@ void remove(const IncomingConnectionFactoryPtr& factory) { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); _factories.erase(factory); } void didEnterBackground() { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); // // Notify all the incoming connection factories that we are @@ -101,7 +102,7 @@ void willEnterForeground() { - IceUtil::Mutex::Lock sync(_mutex); + lock_guard lock(_mutex); // // Notify all the incoming connection factories that we are @@ -116,7 +117,7 @@ private: - IceUtil::Mutex _mutex; + mutex _mutex; bool _background; id _backgroundObserver; id _foregroundObserver; diff --git a/cpp/src/IceDiscovery/LocatorI.cpp b/cpp/src/IceDiscovery/LocatorI.cpp index c706a557249..f458691491d 100644 --- a/cpp/src/IceDiscovery/LocatorI.cpp +++ b/cpp/src/IceDiscovery/LocatorI.cpp @@ -29,7 +29,7 @@ LocatorRegistryI::setAdapterDirectProxyAsync(string adapterId, function, const Ice::Current&) { - Lock sync(*this); + lock_guard lock(_mutex); if(proxy) { _adapters[adapterId] = proxy; @@ -49,7 +49,7 @@ LocatorRegistryI::setReplicatedAdapterDirectProxyAsync(string adapterId, function, const Ice::Current&) { - Lock sync(*this); + lock_guard lock(_mutex); if(proxy) { _adapters[adapterId] = proxy; @@ -89,7 +89,7 @@ LocatorRegistryI::setServerProcessProxyAsync(string, Ice::ObjectPrxPtr LocatorRegistryI::findObject(const Ice::Identity& id) const { - Lock sync(*this); + lock_guard lock(_mutex); if(id.name.empty()) { return 0; @@ -139,7 +139,7 @@ LocatorRegistryI::findObject(const Ice::Identity& id) const Ice::ObjectPrxPtr LocatorRegistryI::findAdapter(const string& adapterId, bool& isReplicaGroup) const { - Lock sync(*this); + lock_guard lock(_mutex); map::const_iterator p = _adapters.find(adapterId); if(p != _adapters.end()) diff --git a/cpp/src/IceDiscovery/LocatorI.h b/cpp/src/IceDiscovery/LocatorI.h index b7a8f55299a..d3baff0d27c 100644 --- a/cpp/src/IceDiscovery/LocatorI.h +++ b/cpp/src/IceDiscovery/LocatorI.h @@ -13,7 +13,7 @@ namespace IceDiscovery { -class LocatorRegistryI : public Ice::LocatorRegistry, private IceUtil::Mutex +class LocatorRegistryI : public Ice::LocatorRegistry { public: @@ -48,6 +48,7 @@ class LocatorRegistryI : public Ice::LocatorRegistry, private IceUtil::Mutex const Ice::ObjectPrxPtr _wellKnownProxy; std::map _adapters; std::map > _replicaGroups; + mutable std::mutex _mutex; }; using LocatorRegistryIPtr = std::shared_ptr; From 0c63bc9b2f37a2cb904c6f9e75f225c6317fdb34 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 17:10:47 +0100 Subject: [PATCH 5/9] Break loop on timeout --- cpp/src/IceLocatorDiscovery/PluginI.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cpp/src/IceLocatorDiscovery/PluginI.cpp b/cpp/src/IceLocatorDiscovery/PluginI.cpp index 0f0a57365b9..76faa815415 100644 --- a/cpp/src/IceLocatorDiscovery/PluginI.cpp +++ b/cpp/src/IceLocatorDiscovery/PluginI.cpp @@ -538,9 +538,12 @@ LocatorI::getLocators(const string& instanceName, const chrono::milliseconds& wa else { unique_lock lock(_mutex); - while(_locators.find(instanceName) == _locators.end() && _pending) + while (_locators.find(instanceName) == _locators.end() && _pending) { - _conditionVariable.wait_until(lock, chrono::steady_clock::now() + waitTime); + if (_conditionVariable.wait_until(lock, chrono::steady_clock::now() + waitTime) == cv_status::timeout) + { + break; + } } } From 31eca5b15d8066a3ba22c127324d7940442fb6e8 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 17:30:26 +0100 Subject: [PATCH 6/9] Fix build failures --- cpp/src/Ice/Service.cpp | 5 +++-- cpp/src/IceSSL/OpenSSLCertificateI.cpp | 2 +- cpp/src/IceSSL/SChannelCertificateI.cpp | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cpp/src/Ice/Service.cpp b/cpp/src/Ice/Service.cpp index 9d26cd367e8..aaaeeb2a25a 100644 --- a/cpp/src/Ice/Service.cpp +++ b/cpp/src/Ice/Service.cpp @@ -135,6 +135,7 @@ class ServiceStatusManager IceUtil::ThreadPtr _thread; bool _stopped; std::mutex _mutex; + std::condition_variable _conditionVariable; }; static ServiceStatusManager* serviceStatusManager; @@ -1471,7 +1472,7 @@ ServiceStatusManager::stopUpdate() if(_thread) { _stopped = true; - notify(); + _conditionVariable.notify_one(); thread = _thread; _thread = 0; } @@ -1515,7 +1516,7 @@ ServiceStatusManager::run() { _status.dwCheckPoint++; SetServiceStatus(_handle, &_status); - _conditionVariable.wait_until(chrono::system_clock::now() + delay); + _conditionVariable.wait_until(lock, chrono::system_clock::now() + delay); } } diff --git a/cpp/src/IceSSL/OpenSSLCertificateI.cpp b/cpp/src/IceSSL/OpenSSLCertificateI.cpp index 8e2e51dc21b..121fc28b692 100644 --- a/cpp/src/IceSSL/OpenSSLCertificateI.cpp +++ b/cpp/src/IceSSL/OpenSSLCertificateI.cpp @@ -254,7 +254,7 @@ class OpenSSLCertificateI : public IceSSL::OpenSSL::Certificate, private: x509_st* _cert; - std::mutex _mutex; + mutable std::mutex _mutex; }; } // end anonymous namespace diff --git a/cpp/src/IceSSL/SChannelCertificateI.cpp b/cpp/src/IceSSL/SChannelCertificateI.cpp index 3dd54255c76..803f7fac13a 100644 --- a/cpp/src/IceSSL/SChannelCertificateI.cpp +++ b/cpp/src/IceSSL/SChannelCertificateI.cpp @@ -95,7 +95,7 @@ class SChannelCertificateI : public SChannel::Certificate, CERT_SIGNED_CONTENT_INFO* _cert; CERT_INFO* _certInfo; CertInfoHolderPtr _certInfoHolder; - std::mutex _mutex; + mutable std::mutex _mutex; }; const Ice::Long TICKS_PER_MSECOND = 10000LL; From 16a5cabed9ccf41760f1b2758e42a8a0865f2cd8 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 17:46:14 +0100 Subject: [PATCH 7/9] Review fixes --- cpp/src/Ice/LoggerAdminI.cpp | 5 +---- cpp/src/Ice/Selector.cpp | 2 +- cpp/src/Ice/Service.cpp | 2 +- cpp/src/Ice/ThreadPool.cpp | 3 +-- cpp/src/IceLocatorDiscovery/PluginI.cpp | 2 +- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/cpp/src/Ice/LoggerAdminI.cpp b/cpp/src/Ice/LoggerAdminI.cpp index d697eb9ce38..92126e26048 100644 --- a/cpp/src/Ice/LoggerAdminI.cpp +++ b/cpp/src/Ice/LoggerAdminI.cpp @@ -738,10 +738,7 @@ LoggerAdminLoggerI::run() for(;;) { unique_lock lock(_mutex); - while (!_destroyed && _jobQueue.empty()) - { - _conditionVariable.wait(lock); - } + _conditionVariable.wait(lock, [this] { return _destroyed || !_jobQueue.empty(); }); if(_destroyed) { diff --git a/cpp/src/Ice/Selector.cpp b/cpp/src/Ice/Selector.cpp index 35c3654dee5..601786a9898 100644 --- a/cpp/src/Ice/Selector.cpp +++ b/cpp/src/Ice/Selector.cpp @@ -185,7 +185,7 @@ Selector::getNextHandler(SocketOperation& status, int timeout) unique_lock lock(_mutex); if(timeout > 0) { - _monitor.wait_until(lock, chrono::steady_clock::now() + chrono::seconds(timeout)); + _monitor.wait_for(lock, chrono::seconds(timeout)); if(_events.empty()) { throw SelectorTimeoutException(); diff --git a/cpp/src/Ice/Service.cpp b/cpp/src/Ice/Service.cpp index aaaeeb2a25a..728692dd9a9 100644 --- a/cpp/src/Ice/Service.cpp +++ b/cpp/src/Ice/Service.cpp @@ -1516,7 +1516,7 @@ ServiceStatusManager::run() { _status.dwCheckPoint++; SetServiceStatus(_handle, &_status); - _conditionVariable.wait_until(lock, chrono::system_clock::now() + delay); + _conditionVariable.wait_for(lock, delay); } } diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp index 504513ac12a..944ee236c9b 100644 --- a/cpp/src/Ice/ThreadPool.cpp +++ b/cpp/src/Ice/ThreadPool.cpp @@ -1156,8 +1156,7 @@ IceInternal::ThreadPool::followerWait(ThreadPoolCurrent& current, unique_lock 0))) diff --git a/cpp/src/IceLocatorDiscovery/PluginI.cpp b/cpp/src/IceLocatorDiscovery/PluginI.cpp index 76faa815415..396c152c285 100644 --- a/cpp/src/IceLocatorDiscovery/PluginI.cpp +++ b/cpp/src/IceLocatorDiscovery/PluginI.cpp @@ -540,7 +540,7 @@ LocatorI::getLocators(const string& instanceName, const chrono::milliseconds& wa unique_lock lock(_mutex); while (_locators.find(instanceName) == _locators.end() && _pending) { - if (_conditionVariable.wait_until(lock, chrono::steady_clock::now() + waitTime) == cv_status::timeout) + if (_conditionVariable.wait_for(lock, waitTime) == cv_status::timeout) { break; } From 833db6a2d6b4ab0316bf1cdf14737ecf20216343 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 17:51:17 +0100 Subject: [PATCH 8/9] missing header --- cpp/src/IceLocatorDiscovery/PluginI.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpp/src/IceLocatorDiscovery/PluginI.cpp b/cpp/src/IceLocatorDiscovery/PluginI.cpp index 396c152c285..b711cae8d3d 100644 --- a/cpp/src/IceLocatorDiscovery/PluginI.cpp +++ b/cpp/src/IceLocatorDiscovery/PluginI.cpp @@ -10,6 +10,8 @@ #include #include +#include + using namespace std; using namespace IceLocatorDiscovery; From 7069eb1571afa51342cae3de30f358720e7ee8b4 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 6 Feb 2024 18:20:15 +0100 Subject: [PATCH 9/9] Fix IceBT build failures --- cpp/src/IceBT/DBus.cpp | 4 ++-- cpp/src/IceBT/Engine.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/src/IceBT/DBus.cpp b/cpp/src/IceBT/DBus.cpp index b452b460899..a9bfcc04a44 100644 --- a/cpp/src/IceBT/DBus.cpp +++ b/cpp/src/IceBT/DBus.cpp @@ -941,8 +941,8 @@ class AsyncResultI : public AsyncResult private: - std::mutex _mutex; - std::condition_variable _conditionVariable; + mutable std::mutex _mutex; + mutable std::condition_variable _conditionVariable; DBusPendingCall* _call; AsyncCallbackPtr _callback; diff --git a/cpp/src/IceBT/Engine.cpp b/cpp/src/IceBT/Engine.cpp index 4c02b4f482c..9f5ed614c4f 100644 --- a/cpp/src/IceBT/Engine.cpp +++ b/cpp/src/IceBT/Engine.cpp @@ -1256,7 +1256,7 @@ class BluetoothService : public DBus::Filter, public std::enable_shared_from_thi ConnectCallbackPtr _cb; }; - std::mutex _mutex; + mutable std::mutex _mutex; DBus::ConnectionPtr _dbusConnection; AdapterMap _adapters;