diff options
author | Robin Gareus <robin@gareus.org> | 2015-03-01 19:59:50 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-03-01 20:49:55 +0100 |
commit | d7727a77e0b19ecb2d1957d1e13d554dbed58243 (patch) | |
tree | b4bf35e94e2670c8e62a290cb5e364fa0b5b7a05 /libs/pbd/pbd/crossthread.h | |
parent | 60388f975c7731fbfa69327c2374cf83f39d85ce (diff) |
Xthread: blocking read + non-blocking write mode.
Needed for switching the butler to use Crossthreads.
Diffstat (limited to 'libs/pbd/pbd/crossthread.h')
-rw-r--r-- | libs/pbd/pbd/crossthread.h | 19 |
1 files changed, 12 insertions, 7 deletions
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<bool,Glib::IOCondition> s); - void attach (Glib::RefPtr<Glib::MainContext>); + void set_receive_handler (sigc::slot<bool,Glib::IOCondition> s); + void attach (Glib::RefPtr<Glib::MainContext>); private: friend gboolean cross_thread_channel_call_receive_slot (GIOChannel*, GIOCondition condition, void *data); GIOChannel* receive_channel; - GSource* receive_source; - sigc::slot<bool,Glib::IOCondition> receive_slot; + GSource* receive_source; + sigc::slot<bool,Glib::IOCondition> receive_slot; + + bool poll_for_request(); #ifndef PLATFORM_WINDOWS int fds[2]; // current implementation uses a pipe/fifo |