diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ConnectionI.cpp | 73 | ||||
-rw-r--r-- | cpp/src/Ice/ConnectionI.h | 2 |
2 files changed, 43 insertions, 32 deletions
diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp index 6e807000c36..df2aef8affd 100644 --- a/cpp/src/Ice/ConnectionI.cpp +++ b/cpp/src/Ice/ConnectionI.cpp @@ -1177,36 +1177,58 @@ Ice::ConnectionI::flushAsyncBatchRequests(const BatchOutgoingAsyncPtr& outAsync) void Ice::ConnectionI::setCallback(const ConnectionCallbackPtr& callback) { - bool closed = false; { IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); if(_state >= StateClosed) { - closed = true; - return; + if(callback) + { + class CallbackWorkItem : public DispatchWorkItem + { + public: + + CallbackWorkItem(const ConnectionIPtr& connection, const ConnectionCallbackPtr& callback) : + _connection(connection), + _callback(callback) + { + } + + virtual void run() + { + _connection->closeCallback(_callback); + } + + private: + + const ConnectionIPtr _connection; + const ConnectionCallbackPtr _callback; + }; + _threadPool->dispatch(new CallbackWorkItem(this, callback)); + } } else { _callback = callback; } } +} - if(closed && callback) +void +Ice::ConnectionI::closeCallback(const ConnectionCallbackPtr& callback) +{ + try { - try - { - callback->closed(this); - } - catch(const std::exception& ex) - { - Error out(_instance->initializationData().logger); - out << "connection callback exception:\n" << ex << '\n' << _desc; - } - catch(...) - { - Error out(_instance->initializationData().logger); - out << "connection callback exception:\nunknown c++ exception" << '\n' << _desc; - } + callback->closed(this); + } + catch(const std::exception& ex) + { + Error out(_instance->initializationData().logger); + out << "connection callback exception:\n" << ex << '\n' << _desc; + } + catch(...) + { + Error out(_instance->initializationData().logger); + out << "connection callback exception:\nunknown c++ exception" << '\n' << _desc; } } @@ -2178,20 +2200,7 @@ Ice::ConnectionI::finish() if(_callback) { - try - { - _callback->closed(this); - } - catch(const std::exception& ex) - { - Error out(_instance->initializationData().logger); - out << "connection callback exception:\n" << ex << '\n' << _desc; - } - catch(...) - { - Error out(_instance->initializationData().logger); - out << "connection callback exception:\nunknown c++ exception" << '\n' << _desc; - } + closeCallback(_callback); _callback = 0; } diff --git a/cpp/src/Ice/ConnectionI.h b/cpp/src/Ice/ConnectionI.h index 4d0f6caf4f4..32c474d20da 100644 --- a/cpp/src/Ice/ConnectionI.h +++ b/cpp/src/Ice/ConnectionI.h @@ -229,6 +229,8 @@ public: const ConnectionCallbackPtr&, IceInternal::BasicStream&); void finish(); + void closeCallback(const ConnectionCallbackPtr&); + private: enum State |