{
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()
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, )
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