Use PBD::GlibSemaphore in Butler to signal requests on windows
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 11 Jul 2013 18:41:08 +0000 (14:41 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 11 Jul 2013 18:41:08 +0000 (14:41 -0400)
libs/ardour/ardour/butler.h
libs/ardour/butler.cc

index 8799899004a2afd5680ee14d8d53c6d513a0f79e..81159f7d3c65b7b1980e760e1982f8da18a5e8f9 100644 (file)
 
 #include <glibmm/threads.h>
 
+#ifdef WIN32
+#include "pbd/glib_semaphore.h"
+#endif
+
 #include "pbd/ringbuffer.h"
 #include "pbd/pool.h"
 #include "ardour/types.h"
 #include "ardour/session_handle.h"
 
+
+
 namespace ARDOUR {
 
 /**
@@ -71,17 +77,25 @@ class Butler : public SessionHandleRef
         Glib::Threads::Cond   paused;
        bool         should_run;
        mutable gint should_do_transport_work;
-       int          request_pipe[2];
        framecnt_t   audio_dstream_capture_buffer_size;
        framecnt_t   audio_dstream_playback_buffer_size;
        uint32_t     midi_dstream_buffer_size;
        RingBuffer<CrossThreadPool*> pool_trash;
 
+#ifdef WIN32
+       PBD::atomic_counter m_request_state;
+       PBD::GlibSemaphore   m_request_sem;
+#else
+       int          request_pipe[2];
+#endif
+
 private:
        void empty_pool_trash ();
        void config_changed (std::string);
 
+#ifndef WIN32
        int setup_request_pipe ();
+#endif
 
        /**
         * return true if there are requests to be processed
index ad54e7dee7699c4e55408e5530e73bf06809c0ad..2998314443ec49b6d228c80c36a61bcc6ed1fd5c 100644 (file)
 #include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
+
+#ifndef WIN32
 #include <poll.h>
+#endif
+
 #include "pbd/error.h"
 #include "pbd/pthread_utils.h"
 #include "ardour/butler.h"
@@ -38,7 +42,7 @@ namespace ARDOUR {
 
 Butler::Butler(Session& s)
        : SessionHandleRef (s)
-       , thread(0)
+       , thread()
        , audio_dstream_capture_buffer_size(0)
        , audio_dstream_playback_buffer_size(0)
        , midi_dstream_buffer_size(0)
@@ -68,6 +72,7 @@ Butler::config_changed (std::string p)
         }
 }
 
+#ifndef WIN32
 int
 Butler::setup_request_pipe ()
 {
@@ -90,6 +95,7 @@ Butler::setup_request_pipe ()
        }
        return 0;
 }
+#endif
 
 int
 Butler::start_thread()
@@ -110,7 +116,9 @@ Butler::start_thread()
 
        should_run = false;
 
+#ifndef WIN32
        if (setup_request_pipe() != 0) return -1;
+#endif
 
        if (pthread_create_and_store ("disk butler", &thread, _thread_work, this)) {
                error << _("Session: could not create butler thread") << endmsg;
@@ -125,11 +133,9 @@ Butler::start_thread()
 void
 Butler::terminate_thread ()
 {
-       if (thread) {
-               void* status;
-               queue_request (Request::Quit);
-               pthread_join (thread, &status);
-       }
+       void* status;
+       queue_request (Request::Quit);
+       pthread_join (thread, &status);
 }
 
 void *
@@ -143,6 +149,7 @@ Butler::_thread_work (void* arg)
 bool
 Butler::wait_for_requests ()
 {
+#ifndef WIN32
        struct pollfd pfd[1];
 
        pfd[0].fd = request_pipe[0];
@@ -171,11 +178,16 @@ Butler::wait_for_requests ()
                }
        }
        return false;
+#else
+       m_request_sem.wait ();
+       return true;
+#endif
 }
 
 bool
 Butler::dequeue_request (Request::Type& r)
 {
+#ifndef WIN32
        char req;
        size_t nread = ::read (request_pipe[0], &req, sizeof (req));
        if (nread == 1) {
@@ -189,6 +201,9 @@ Butler::dequeue_request (Request::Type& r)
                fatal << _("Error reading from butler request pipe") << endmsg;
                /*NOTREACHED*/
        }
+#else
+       r = (Request::Type) m_request_state.get();
+#endif
        return false;
 }
 
@@ -206,7 +221,12 @@ Butler::thread_work ()
                                Request::Type req;
 
                                /* empty the pipe of all current requests */
+#ifdef WIN32
+                               dequeue_request (req);
+                               {
+#else
                                while(dequeue_request(req)) {
+#endif
                                        switch (req) {
 
                                        case Request::Run:
@@ -367,8 +387,13 @@ Butler::schedule_transport_work ()
 void
 Butler::queue_request (Request::Type r)
 {
+#ifndef WIN32
        char c = r;
        (void) ::write (request_pipe[1], &c, 1);
+#else
+       m_request_state.set (r);
+       m_request_sem.post ();
+#endif
 }
 
 void