summaryrefslogtreecommitdiff
path: root/libs/pbd/crossthread.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-12-09 03:05:14 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-12-09 03:05:14 +0000
commitc38e02285fda1fd7966c9e4ad85994445247e6a6 (patch)
treea5f46d4350b8df3e0a74558169c696cbb837ce7f /libs/pbd/crossthread.cc
parent90f95df20707995e267bd624b28980cfd9200bed (diff)
major design changes: use glib event loop for MIDI thread/UI; rework design of BaseUI and AbstractUI; solo & mute are both temporarily broken; OSC control up next; may segfault during exit
git-svn-id: svn://localhost/ardour2/branches/3.0@6328 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/crossthread.cc')
-rw-r--r--libs/pbd/crossthread.cc98
1 files changed, 98 insertions, 0 deletions
diff --git a/libs/pbd/crossthread.cc b/libs/pbd/crossthread.cc
new file mode 100644
index 0000000000..1465505b56
--- /dev/null
+++ b/libs/pbd/crossthread.cc
@@ -0,0 +1,98 @@
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <cstdlib>
+#include <cerrno>
+#include <cstring>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "pbd/error.h"
+#include "pbd/crossthread.h"
+
+using namespace std;
+using namespace PBD;
+using namespace Glib;
+
+CrossThreadChannel::CrossThreadChannel ()
+{
+ fds[0] = -1;
+ fds[1] = -1;
+
+ if (pipe (fds)) {
+ error << "cannot create x-thread pipe for read (%2)" << ::strerror (errno) << endmsg;
+ return;
+ }
+
+ if (fcntl (fds[0], F_SETFL, O_NONBLOCK)) {
+ error << "cannot set non-blocking mode for x-thread pipe (read) (" << ::strerror (errno) << ')' << endmsg;
+ return;
+ }
+
+ if (fcntl (fds[1], F_SETFL, O_NONBLOCK)) {
+ error << "cannot set non-blocking mode for x-thread pipe (write) (%2)" << ::strerror (errno) << ')' << endmsg;
+ return;
+ }
+
+}
+
+CrossThreadChannel::~CrossThreadChannel ()
+{
+ _ios->destroy ();
+
+ if (fds[0] >= 0) {
+ close (fds[0]);
+ fds[0] = -1;
+ }
+
+ if (fds[1] >= 0) {
+ close (fds[1]);
+ fds[1] = -1;
+ }
+}
+
+void
+CrossThreadChannel::wakeup ()
+{
+ char c = 0;
+ ::write (fds[1], &c, 1);
+}
+
+RefPtr<IOSource>
+CrossThreadChannel::ios ()
+{
+ if (!_ios) {
+ _ios = IOSource::create (fds[0], IOCondition(IO_IN|IO_PRI|IO_ERR|IO_HUP|IO_NVAL));
+ }
+ return _ios;
+}
+
+void
+CrossThreadChannel::drain ()
+{
+ drain (fds[0]);
+}
+
+void
+CrossThreadChannel::drain (int fd)
+{
+ /* drain selectable fd */
+ char buf[64];
+ while (::read (fd, buf, sizeof (buf)) > 0);
+}