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 f7d0f6d8c654033ababf55bdddc57e9a45b2d8e5..cb3382beaa1cf0356dc8798a10c035c02b4e1004 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 ec82dd22bd2ea97e34cfe55c0c2f25f083c5bb73..6947f28130fa5d27e4b83038246626c0a1b1ba9a 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 656885aa1059595043af199bcf1adb103b6623d2..b1ce7af689fc85b6e2afd430247acc5aa668c516 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);