Use PBD::GlibSemaphore in Butler to signal requests on windows
This commit is contained in:
parent
29f178aa4b
commit
2ddab2d2f6
@ -22,11 +22,17 @@
|
||||
|
||||
#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
|
||||
|
@ -20,7 +20,11 @@
|
||||
#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
|
||||
|
Loading…
Reference in New Issue
Block a user