summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-25 02:03:13 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-25 02:03:13 +0100
commit7d344b1ecad24ee573c9da06d454e696a8149e5a (patch)
tree4062b81fd2043f5cd5d4828edddeacd82a1ea411 /src/lib
parent8c3eac75cc3717371dce1132bf10093f5ec3a26f (diff)
Try to directly call UI callbacks if we're already in the UI thread; call wake_ui() where required.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ui_signaller.h14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/lib/ui_signaller.h b/src/lib/ui_signaller.h
index 0797d911e..9de1b736d 100644
--- a/src/lib/ui_signaller.h
+++ b/src/lib/ui_signaller.h
@@ -22,17 +22,26 @@
#include <boost/bind.hpp>
#include <boost/asio.hpp>
+#include <boost/thread.hpp>
class UISignaller
{
public:
+ /** Create a UISignaller. Must be called from the UI thread */
UISignaller ()
: _work (_service)
- {}
+ {
+ _ui_thread = boost::this_thread::get_id ();
+ }
template <typename T>
void emit (T f) {
- _service.post (f);
+ if (boost::this_thread::get_id() == _ui_thread) {
+ f ();
+ } else {
+ _service.post (f);
+ wake_ui ();
+ }
}
void ui_idle () {
@@ -44,6 +53,7 @@ public:
private:
boost::asio::io_service _service;
boost::asio::io_service::work _work;
+ boost::thread::id _ui_thread;
};
extern UISignaller* ui_signaller;