+bool ProviderHandler::__idle()
+{
+ return __subscribeRequests.empty() && __readRequests.empty();
+}
+
+void ProviderHandler::__scheduleToDelete()
+{
+ if (!__deleteScheduled && __idle()) {
+ __deleteScheduled = true;
+ g_timeout_add_seconds(DELETE_DELAY, __deletor, this);
+ _D("Delete scheduled for '%s' (%#x)", __subject.c_str(), this);
+ }
+}
+
+gboolean ProviderHandler::__deletor(gpointer data)
+{
+ ProviderHandler *handle = static_cast<ProviderHandler*>(data);
+
+ if (handle->__idle()) {
+ __instanceMap.erase(handle->__subject);
+ delete handle;
+ return FALSE;
+ }
+
+ handle->__deleteScheduled = false;
+ return FALSE;
+}
+