Unregister callbacks for dbus signals on client object destroy 60/208960/1
authorOskar Chodowicz <o.chodowicz@samsung.com>
Mon, 1 Jul 2019 11:47:33 +0000 (13:47 +0200)
committerOskar Chodowicz <o.chodowicz@samsung.com>
Mon, 1 Jul 2019 11:47:33 +0000 (13:47 +0200)
Change-Id: I95e05e9983d431d3a3b27fe2bffd05823e178b79

src/model/AddSwitchPageModel.cpp
src/service/DBus.cpp

index 0af40616c465bd7b059b4106ac178ad42feb17f7..5a6c93987988a6adc25acccccf54907138cbaaae 100644 (file)
@@ -6,10 +6,9 @@ AddSwitchPageModel::AddSwitchPageModel()
 {
        dBusClient_ = DBus::DBusClient(BUS, PATH, IFACE, DBus::ConnectionType::SESSION);
        synchronizeProviders();
-       // temporary fix to defend against segfault because dbus signals doesn't unregister on object destroy
-       // dBusClient_.addSignal<void()>(std::string{"switchesConfigurationChanged"}, [this]() {
-       //      this->switchesConfigurationChanged_ = std::chrono::system_clock::now();
-       // });
+       dBusClient_.addSignal<void()>(std::string{"switchesConfigurationChanged"}, [this]() {
+               this->switchesConfigurationChanged_ = std::chrono::system_clock::now();
+       });
 }
 
 void AddSwitchPageModel::synchronizeProviders()
index 8563c6e33bf25a5a1f9cdff988a9117eec5f0ac5..f58dcd7a277401d08fe689a2ecc612dabc7ab24e 100644 (file)
@@ -234,7 +234,21 @@ struct DefaultDBusWrapper : public DBusWrapper
        DEFINE_GS(Connection, Eldbus_Connection, )
        DEFINE_GS(MessageIter, Eldbus_Message_Iter, )
        DEFINE_TYPE(Message, Eldbus_Message, eldbus_message_unref(Value))
-       DEFINE_TYPE(Proxy, Eldbus_Proxy, )
+       // DEFINE_TYPE(Proxy, Eldbus_Proxy, )
+       struct ProxyImpl : public Proxy
+       {
+               Eldbus_Proxy *Value = nullptr;
+               bool EraseOnExit = false;
+               std::vector<std::function<void()>> destructors;
+               ProxyImpl(Eldbus_Proxy *Value, bool EraseOnExit = false) : Value(Value), EraseOnExit(EraseOnExit) {}
+               ~ProxyImpl()
+               {
+                       for (auto &it : destructors)
+                               if (it)
+                                       it();
+               }
+       };
+       DEFINE_GS(Proxy, Eldbus_Proxy, )
        DEFINE_TYPE(Object, Eldbus_Object, eldbus_object_unref(Value))
        DEFINE_TYPE(Pending, Eldbus_Pending, )
        DEFINE_TYPE(EventPropertyChanged, Eldbus_Proxy_Event_Property_Changed, )
@@ -391,9 +405,13 @@ struct DefaultDBusWrapper : public DBusWrapper
                                cb(create(msg, false));
                        }};
                auto handler = eldbus_proxy_signal_handler_add(get(proxy), member.c_str(), listenerCallback, tmp);
-               if (handler)
-                       eldbus_proxy_free_cb_add(get(proxy), listenerCallbackFree, tmp);
-               else
+               if (handler) {
+                       static_cast<ProxyImpl *>(proxy.get())->destructors.push_back([tmp, handler]() {
+                               eldbus_signal_handler_del(handler);
+                               delete tmp;
+                       });
+                       // eldbus_proxy_free_cb_add(get(proxy), listenerCallbackFree, tmp);
+               } else
                        delete tmp;
        }
        std::string eldbus_message_iter_signature_get_impl(const MessageIterPtr &iter) override