From d7727a77e0b19ecb2d1957d1e13d554dbed58243 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 1 Mar 2015 19:59:50 +0100 Subject: Xthread: blocking read + non-blocking write mode. Needed for switching the butler to use Crossthreads. --- libs/pbd/pbd/crossthread.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'libs/pbd/pbd/crossthread.h') diff --git a/libs/pbd/pbd/crossthread.h b/libs/pbd/pbd/crossthread.h index 6167c664db..d48f1bfe68 100644 --- a/libs/pbd/pbd/crossthread.h +++ b/libs/pbd/pbd/crossthread.h @@ -43,7 +43,7 @@ */ class LIBPBD_API CrossThreadChannel { - public: +public: /** if @a non_blocking is true, the channel will not cause blocking * when used in an event loop based on poll/select or the glib main * loop. @@ -62,13 +62,16 @@ class LIBPBD_API CrossThreadChannel { * because there is no way to know which byte value will be used * for ::wakeup() */ - int deliver (char msg); + int deliver (char msg); /** if using ::deliver() to wakeup the listening thread, then * the listener should call ::receive() to fetch the message * type from the channel. + * + * wait = true only make sense for non_blocking channels, + * it polls for data to become available. */ - int receive (char& msg); + int receive (char& msg, bool wait = false); /** empty the channel of all requests. * Typically this is done as soon as input @@ -79,15 +82,17 @@ class LIBPBD_API CrossThreadChannel { */ void drain (); - void set_receive_handler (sigc::slot s); - void attach (Glib::RefPtr); + void set_receive_handler (sigc::slot s); + void attach (Glib::RefPtr); private: friend gboolean cross_thread_channel_call_receive_slot (GIOChannel*, GIOCondition condition, void *data); GIOChannel* receive_channel; - GSource* receive_source; - sigc::slot receive_slot; + GSource* receive_source; + sigc::slot receive_slot; + + bool poll_for_request(); #ifndef PLATFORM_WINDOWS int fds[2]; // current implementation uses a pipe/fifo -- cgit v1.2.3