Pārlūkot izejas kodu

Fixed implicit sharing in ctkServiceRegistration.

Sascha Zelzer 14 gadi atpakaļ
vecāks
revīzija
a7d9ea3167

+ 3 - 3
Libs/PluginFramework/ctkServiceReferencePrivate.cpp

@@ -56,7 +56,7 @@ QObject* ctkServiceReferencePrivate::getService(QSharedPointer<ctkPlugin> plugin
         {
           try
           {
-            s = serviceFactory->getService(plugin, *(registration->q_func()));
+            s = serviceFactory->getService(plugin, ctkServiceRegistration(registration));
           }
           catch (const std::exception& pe)
           {
@@ -146,8 +146,8 @@ bool ctkServiceReferencePrivate::ungetService(QSharedPointer<ctkPlugin> plugin,
     {
       try
       {
-        qobject_cast<ctkServiceFactory*>(registration->getService())->ungetService(plugin,
-                                                                                   *(registration->q_func()), sfi);
+        qobject_cast<ctkServiceFactory*>(
+              registration->getService())->ungetService(plugin, ctkServiceRegistration(registration), sfi);
       }
       catch (const std::exception& e)
       {

+ 7 - 1
Libs/PluginFramework/ctkServiceRegistration.cpp

@@ -45,9 +45,15 @@ ctkServiceRegistration::ctkServiceRegistration(const ctkServiceRegistration& reg
   d_func()->ref.ref();
 }
 
+ctkServiceRegistration::ctkServiceRegistration(ctkServiceRegistrationPrivate* registrationPrivate)
+  : d_ptr(registrationPrivate)
+{
+  d_func()->ref.ref();
+}
+
 ctkServiceRegistration::ctkServiceRegistration(ctkPluginPrivate* plugin, QObject* service,
                     const ServiceProperties& props)
-  : d_ptr(new ctkServiceRegistrationPrivate(this, plugin, service, props))
+  : d_ptr(new ctkServiceRegistrationPrivate(plugin, service, props))
 {
 
 }

+ 3 - 0
Libs/PluginFramework/ctkServiceRegistration.h

@@ -148,9 +148,12 @@ public:
 protected:
 
   friend class ctkServices;
+  friend class ctkServiceReferencePrivate;
 
   friend uint qHash(const ctkServiceRegistration&);
 
+  ctkServiceRegistration(ctkServiceRegistrationPrivate* registrationPrivate);
+
   ctkServiceRegistration(ctkPluginPrivate* plugin, QObject* service,
                          const ServiceProperties& props);
 

+ 5 - 5
Libs/PluginFramework/ctkServiceRegistrationPrivate.cpp

@@ -22,11 +22,11 @@
 #include "ctkServiceRegistrationPrivate.h"
 
 
-ctkServiceRegistrationPrivate::ctkServiceRegistrationPrivate(ctkServiceRegistration* sr,
-                                                       ctkPluginPrivate* plugin, QObject* service,
-                                                       const ServiceProperties& props)
-                             : q_ptr(sr), ref(1), service(service), plugin(plugin), reference(this),
-                             properties(props), available(true), unregistering(false)
+ctkServiceRegistrationPrivate::ctkServiceRegistrationPrivate(
+  ctkPluginPrivate* plugin, QObject* service,
+  const ServiceProperties& props)
+  : ref(1), service(service), plugin(plugin), reference(this),
+    properties(props), available(true), unregistering(false)
 {
 
 }

+ 2 - 5
Libs/PluginFramework/ctkServiceRegistrationPrivate.h

@@ -38,7 +38,7 @@ class ctkServiceRegistrationPrivate
 
 protected:
 
-  ctkServiceRegistration* const q_ptr;
+  friend class ctkServiceRegistration;
 
   /**
    * Reference count for implicitly shared private implementation.
@@ -52,9 +52,6 @@ protected:
 
 public:
 
-  Q_DECLARE_PUBLIC(ctkServiceRegistration);
-
-
   /**
    * Plugin registering this service.
    */
@@ -101,7 +98,7 @@ public:
 
   QMutex propsLock;
 
-  ctkServiceRegistrationPrivate(ctkServiceRegistration* sr, ctkPluginPrivate* plugin, QObject* service,
+  ctkServiceRegistrationPrivate(ctkPluginPrivate* plugin, QObject* service,
                                 const ServiceProperties& props);
 
   virtual ~ctkServiceRegistrationPrivate();