# HG changeset patch # User Sebastien Jodogne # Date 1571315991 -7200 # Node ID 81b29bc7c3d453518302c6bfd71232d24b7c3d6a # Parent 229ea1389845741056bd9e331139a70b26049c65 cont diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Loaders/LoaderStateMachine.cpp --- a/Framework/Loaders/LoaderStateMachine.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Loaders/LoaderStateMachine.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -97,7 +97,8 @@ ") < simultaneousDownloads_ (" << simultaneousDownloads_ << ") --> will Schedule command addr " << std::hex << nextCommand << std::dec; - oracle_.Schedule(*this, nextCommand); + boost::shared_ptr observer(GetSharedObserver()); + oracle_.Schedule(observer, nextCommand); pendingCommands_.pop_front(); activeCommands_++; diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp --- a/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -292,7 +292,9 @@ } command->SetPayload(new Orthanc::SingleValueObject(sliceIndex)); - oracle_.Schedule(*this, command.release()); + + boost::shared_ptr observer(GetSharedObserver()); + oracle_.Schedule(observer, command.release()); } else { @@ -479,7 +481,8 @@ command->SetUri("/series/" + seriesId + "/instances-tags"); // LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries about to call oracle_.Schedule"; - oracle_.Schedule(*this, command.release()); + boost::shared_ptr observer(GetSharedObserver()); + oracle_.Schedule(observer, command.release()); // LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries called oracle_.Schedule"; } } diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Messages/IMessageEmitter.h --- a/Framework/Messages/IMessageEmitter.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Messages/IMessageEmitter.h Thu Oct 17 14:39:51 2019 +0200 @@ -24,6 +24,8 @@ #include "IObserver.h" #include "IMessage.h" +#include + namespace OrthancStone { /** @@ -39,7 +41,7 @@ { } - virtual void EmitMessage(const IObserver& observer, + virtual void EmitMessage(boost::weak_ptr& observer, const IMessage& message) = 0; }; } diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Messages/IObservable.cpp --- a/Framework/Messages/IObservable.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Messages/IObservable.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -94,11 +94,16 @@ } - void IObservable::EmitMessage(const IObserver& observer, + void IObservable::EmitMessage(boost::weak_ptr& observer, const IMessage& message) { LOG(TRACE) << "IObservable::EmitMessage observer = " << std::hex << &observer << std::dec; - EmitMessageInternal(&observer, message); + + boost::shared_ptr lock(observer.lock()); + if (lock) + { + EmitMessageInternal(lock.get(), message); + } } } diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Messages/IObservable.h --- a/Framework/Messages/IObservable.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Messages/IObservable.h Thu Oct 17 14:39:51 2019 +0200 @@ -48,7 +48,7 @@ void BroadcastMessage(const IMessage& message); - void EmitMessage(const IObserver& observer, + void EmitMessage(boost::weak_ptr& observer, const IMessage& message); }; } diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Messages/LockingEmitter.cpp --- a/Framework/Messages/LockingEmitter.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Messages/LockingEmitter.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -24,7 +24,7 @@ namespace OrthancStone { - void LockingEmitter::EmitMessage(IObserver& observer, + void LockingEmitter::EmitMessage(boost::weak_ptr& observer, const IMessage& message) { try diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Messages/LockingEmitter.h --- a/Framework/Messages/LockingEmitter.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Messages/LockingEmitter.h Thu Oct 17 14:39:51 2019 +0200 @@ -45,7 +45,7 @@ IObservable oracleObservable_; public: - virtual void EmitMessage(IObserver& observer, + virtual void EmitMessage(boost::weak_ptr& observer, const IMessage& message) ORTHANC_OVERRIDE; diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/GetOrthancImageCommand.cpp --- a/Framework/Oracle/GetOrthancImageCommand.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/GetOrthancImageCommand.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -83,7 +83,7 @@ } void GetOrthancImageCommand::ProcessHttpAnswer(IMessageEmitter& emitter, - const IObserver& receiver, + boost::weak_ptr& receiver, const std::string& answer, const HttpHeaders& answerHeaders) const { diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/GetOrthancImageCommand.h --- a/Framework/Oracle/GetOrthancImageCommand.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/GetOrthancImageCommand.h Thu Oct 17 14:39:51 2019 +0200 @@ -112,7 +112,7 @@ } void ProcessHttpAnswer(IMessageEmitter& emitter, - const IObserver& receiver, + boost::weak_ptr& receiver, const std::string& answer, const HttpHeaders& answerHeaders) const; }; diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp --- a/Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -77,7 +77,7 @@ void GetOrthancWebViewerJpegCommand::ProcessHttpAnswer(IMessageEmitter& emitter, - const IObserver& receiver, + boost::weak_ptr& receiver, const std::string& answer) const { // This code comes from older "OrthancSlicesLoader::ParseSliceImageJpeg()" diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/GetOrthancWebViewerJpegCommand.h --- a/Framework/Oracle/GetOrthancWebViewerJpegCommand.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/GetOrthancWebViewerJpegCommand.h Thu Oct 17 14:39:51 2019 +0200 @@ -129,7 +129,7 @@ std::string GetUri() const; void ProcessHttpAnswer(IMessageEmitter& emitter, - const IObserver& receiver, + boost::weak_ptr& receiver, const std::string& answer) const; }; } diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/IOracle.h --- a/Framework/Oracle/IOracle.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/IOracle.h Thu Oct 17 14:39:51 2019 +0200 @@ -33,7 +33,7 @@ { } - virtual void Schedule(const IObserver& receiver, + virtual void Schedule(boost::shared_ptr& receiver, IOracleCommand* command) = 0; // Takes ownership }; } diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/ThreadedOracle.cpp --- a/Framework/Oracle/ThreadedOracle.cpp Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/ThreadedOracle.cpp Thu Oct 17 14:39:51 2019 +0200 @@ -39,11 +39,11 @@ class ThreadedOracle::Item : public Orthanc::IDynamicObject { private: - const IObserver& receiver_; + boost::weak_ptr receiver_; std::auto_ptr command_; public: - Item(const IObserver& receiver, + Item(boost::weak_ptr receiver, IOracleCommand* command) : receiver_(receiver), command_(command) @@ -54,7 +54,7 @@ } } - const IObserver& GetReceiver() const + boost::weak_ptr& GetReceiver() { return receiver_; } @@ -73,12 +73,12 @@ class Item { private: - const IObserver& receiver_; + boost::weak_ptr receiver_; std::auto_ptr command_; boost::posix_time::ptime expiration_; public: - Item(const IObserver& receiver, + Item(boost::weak_ptr& receiver, SleepOracleCommand* command) : receiver_(receiver), command_(command) @@ -123,7 +123,7 @@ } } - void Add(const IObserver& receiver, + void Add(boost::weak_ptr& receiver, SleepOracleCommand* command) // Takes ownership { boost::mutex::scoped_lock lock(mutex_); @@ -213,7 +213,7 @@ static void Execute(IMessageEmitter& emitter, - const IObserver& receiver, + boost::weak_ptr& receiver, const HttpCommand& command) { Orthanc::HttpClient client; @@ -242,7 +242,7 @@ static void Execute(IMessageEmitter& emitter, const Orthanc::WebServiceParameters& orthanc, - const IObserver& receiver, + boost::weak_ptr& receiver, const OrthancRestApiCommand& command) { Orthanc::HttpClient client(orthanc, command.GetUri()); @@ -270,7 +270,7 @@ static void Execute(IMessageEmitter& emitter, const Orthanc::WebServiceParameters& orthanc, - const IObserver& receiver, + boost::weak_ptr& receiver, const GetOrthancImageCommand& command) { Orthanc::HttpClient client(orthanc, command.GetUri()); @@ -290,7 +290,7 @@ static void Execute(IMessageEmitter& emitter, const Orthanc::WebServiceParameters& orthanc, - const IObserver& receiver, + boost::weak_ptr& receiver, const GetOrthancWebViewerJpegCommand& command) { Orthanc::HttpClient client(orthanc, command.GetUri()); @@ -563,7 +563,7 @@ } - void ThreadedOracle::Schedule(const IObserver& receiver, + void ThreadedOracle::Schedule(boost::shared_ptr& receiver, IOracleCommand* command) { queue_.Enqueue(new Item(receiver, command)); diff -r 229ea1389845 -r 81b29bc7c3d4 Framework/Oracle/ThreadedOracle.h --- a/Framework/Oracle/ThreadedOracle.h Thu Oct 17 13:48:52 2019 +0200 +++ b/Framework/Oracle/ThreadedOracle.h Thu Oct 17 14:39:51 2019 +0200 @@ -88,7 +88,7 @@ StopInternal(); } - virtual void Schedule(const IObserver& receiver, + virtual void Schedule(boost::shared_ptr& receiver, IOracleCommand* command); }; }