diff Framework/Messages/IObserver.h @ 973:38409549db43 toa2019082903

Log with addresses + added fingerprint mechanism to avoid calling zombie objects where: - a message is sent with a receiver - the receiver dies - another receiver with the SAME address is created - the message reply is executed --> execution on the wrong object! (since their "identity" is their address. The fix is to identify them with an UUID stored at creation time)
author Benjamin Golinvaux <bgo@osimis.io>
date Thu, 29 Aug 2019 18:07:55 +0200
parents b70e9be013e4
children e75fd08d6c75
line wrap: on
line diff
--- a/Framework/Messages/IObserver.h	Thu Aug 29 13:12:03 2019 +0200
+++ b/Framework/Messages/IObserver.h	Thu Aug 29 18:07:55 2019 +0200
@@ -24,25 +24,37 @@
 #include "MessageBroker.h"
 #include "IMessage.h"
 
+#include <Core/Toolbox.h>
+
 namespace OrthancStone 
 {
   class IObserver : public boost::noncopyable
   {
   private:
     MessageBroker&  broker_;
-
+    // the following is a UUID that is used to disambiguate different observers
+    // that may have the same address
+    std::string     fingerprint_;
   public:
-    IObserver(MessageBroker& broker) :
-      broker_(broker)
+    IObserver(MessageBroker& broker)
+      : broker_(broker)
+      , fingerprint_(Orthanc::Toolbox::GenerateUuid())
     {
+      LOG(TRACE) << "IObserver(" << std::hex << this << std::dec << ")::IObserver : fingerprint_ == " << fingerprint_;
       broker_.Register(*this);
     }
 
     virtual ~IObserver()
     {
+      LOG(TRACE) << "IObserver(" << std::hex << this << std::dec << ")::~IObserver : fingerprint_ == " << fingerprint_;
       broker_.Unregister(*this);
     }
 
+    const std::string& GetFingerprint() const
+    {
+      return fingerprint_;
+    }
+
     MessageBroker& GetBroker() const
     {
       return broker_;