diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-12-03 20:47:27 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-12-03 20:47:27 -0500 |
commit | 5c51b302cec5942a37f468903c4183b0a6c50695 (patch) | |
tree | d62466a4edb2dcd717c01915a423cfd3296db6e4 /libs/pbd/pbd/crossthread.h | |
parent | 888bf2d551d633e8f5731e95af3cc48980221df1 (diff) |
manually merge new CrossThreadChannel implementation for windows from Tracks
Diffstat (limited to 'libs/pbd/pbd/crossthread.h')
-rw-r--r-- | libs/pbd/pbd/crossthread.h | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/libs/pbd/pbd/crossthread.h b/libs/pbd/pbd/crossthread.h index d172c9c60f..fd9c9f8eeb 100644 --- a/libs/pbd/pbd/crossthread.h +++ b/libs/pbd/pbd/crossthread.h @@ -28,6 +28,11 @@ #include "pbd/libpbd_visibility.h" +#ifdef PLATFORM_WINDOWS +#include <Windows.h> +#endif // PLATFORM_WINDOWS + + /** A simple abstraction of a mechanism of signalling one thread from another. * The signaller calls ::wakeup() to tell the signalled thread to check for * work to be done. @@ -57,13 +62,13 @@ 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. */ - int receive (char& msg); + int receive (char& msg); /** empty the channel of all requests. * Typically this is done as soon as input @@ -73,33 +78,26 @@ class LIBPBD_API CrossThreadChannel { * in the channel will not be important. */ void drain (); - static void drain (int fd); - /** File descriptor that can be used with poll/select to - * detect when wakeup() has been called on this channel. - * It be marked as readable/input-ready when this condition - * is true. It has already been marked non-blocking. - */ - int selectable() const { return fds[0]; } - - /* glibmm 2.22 and earlier has a terrifying bug that will - cause crashes whenever a Source is removed from - a MainContext (including the destruction of the MainContext), - because the Source is destroyed "out from under the nose of" - the RefPtr. I (Paul) have fixed this (https://bugzilla.gnome.org/show_bug.cgi?id=561885) - but in the meantime, we need a hack to get around the issue. - */ - Glib::RefPtr<Glib::IOSource> ios(); - void drop_ios (); - - /** returns true if the CrossThreadChannel was - * correctly constructed. - */ - bool ok() const { return fds[0] >= 0 && fds[1] >= 0; } + 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); - private: - Glib::RefPtr<Glib::IOSource>* _ios; // lazily constructed + GIOChannel* receive_channel; + GSource* receive_source; + sigc::slot<bool,Glib::IOCondition> receive_slot; + +#ifndef PLATFORM_WINDOWS int fds[2]; // current implementation uses a pipe/fifo +#else + + SOCKET send_socket; + SOCKET receive_socket; + struct sockaddr_in recv_address; +#endif + }; #endif /* __pbd__crossthread_h__ */ |