From 2f214183b3f7bda64036a217252f9ce0d1a03db7 Mon Sep 17 00:00:00 2001
From: pierre-luc <pierre-luc@aqra.ca>
Date: Thu, 16 Jul 2009 10:34:24 -0400
Subject: [PATCH] [#1859] An unnamed pipe monitored by poll() was added. When
 we want to leave, we call terminate() and data is written to that pipe. That
 way, poll() unblocks and the application exits instantaneously.

---
 .../dbus-c++/include/dbus-c++/eventloop.h     |  5 ++++
 .../dbus-c++/src/eventloop-integration.cpp    |  1 +
 .../libs/dbus-c++/src/eventloop.cpp           | 25 ++++++++++++++++---
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h b/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h
index f7d0f6d8c6..cb3382beaa 100644
--- a/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h
+++ b/sflphone-common/libs/dbus-c++/include/dbus-c++/eventloop.h
@@ -30,6 +30,7 @@
 
 #include "api.h"
 #include "util.h"
+#include "error.h"
 
 namespace DBus {
 
@@ -149,6 +150,8 @@ public:
 
 	virtual void dispatch();
 
+    virtual void terminate();
+    
 private:
 
 	DefaultMutex _mutex_t;
@@ -156,6 +159,8 @@ private:
 
 	DefaultMutex _mutex_w;
 	DefaultWatches _watches;
+	
+	int _terminateFd[2];
 
 friend class DefaultTimeout;
 friend class DefaultWatch;
diff --git a/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp b/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp
index ec82dd22bd..6947f28130 100644
--- a/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp
+++ b/sflphone-common/libs/dbus-c++/src/eventloop-integration.cpp
@@ -86,6 +86,7 @@ void BusDispatcher::enter()
 void BusDispatcher::leave()
 {
     _running = false;
+    terminate();
 }
 
 void BusDispatcher::do_iteration()
diff --git a/sflphone-common/libs/dbus-c++/src/eventloop.cpp b/sflphone-common/libs/dbus-c++/src/eventloop.cpp
index 656885aa10..b1ce7af689 100644
--- a/sflphone-common/libs/dbus-c++/src/eventloop.cpp
+++ b/sflphone-common/libs/dbus-c++/src/eventloop.cpp
@@ -30,6 +30,8 @@
 
 #include <sys/poll.h>
 #include <sys/time.h>
+#include <unistd.h> 
+#include <cstdio>
 
 #include <dbus/dbus.h>
 
@@ -97,6 +99,9 @@ void DefaultMutex::unlock()
 
 DefaultMainLoop::DefaultMainLoop()
 {
+    if(pipe(_terminateFd) < 0) {
+        throw ErrorFailed ("unable to create unamed pipe");
+    }  
 }
 
 DefaultMainLoop::~DefaultMainLoop()
@@ -129,15 +134,23 @@ DefaultMainLoop::~DefaultMainLoop()
         ti = tmp;
     }
 
+    close(_terminateFd[0]);
+    close(_terminateFd[1]);
+    
     _mutex_t.unlock();
 }
 
-void DefaultMainLoop::dispatch()
+void DefaultMainLoop::terminate() 
 {
-    _mutex_w.lock();
+    write(_terminateFd[1], " ", 1);
+}
 
-    int nfd = _watches.size();
+void DefaultMainLoop::dispatch()
+{    
+    _mutex_w.lock();
 
+    int nfd = _watches.size() + 1;
+    
     pollfd fds[nfd];
 
     DefaultWatches::iterator wi = _watches.begin();
@@ -152,6 +165,10 @@ void DefaultMainLoop::dispatch()
         }
     }
 
+    fds[nfd].fd = _terminateFd[0];
+    fds[nfd].events = POLLIN;
+    fds[nfd].revents = 0;
+        
     _mutex_w.unlock();
 
     int wait_min = 10000;
@@ -167,7 +184,7 @@ void DefaultMainLoop::dispatch()
 
     _mutex_t.unlock();
 
-    poll (fds, nfd, wait_min);
+    poll (fds, nfd+1, wait_min);
 
     timeval now;
     gettimeofday (&now, NULL);
-- 
GitLab