summaryrefslogtreecommitdiff
path: root/libs/pbd/pbd/crossthread.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/pbd/pbd/crossthread.h')
-rw-r--r--libs/pbd/pbd/crossthread.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/libs/pbd/pbd/crossthread.h b/libs/pbd/pbd/crossthread.h
new file mode 100644
index 0000000000..413dea024e
--- /dev/null
+++ b/libs/pbd/pbd/crossthread.h
@@ -0,0 +1,38 @@
+#ifndef __pbd__crossthread_h__
+#define __pbd__crossthread_h__
+
+#include <pbd/abstract_ui.h>
+#include <sigc++/sigc++.h>
+#include <pthread.h>
+
+template<class RequestType>
+void
+call_slot_from_thread_or_dispatch_it (pthread_t thread_id, AbstractUI<RequestType>& ui, sigc::slot<void> theSlot)
+{
+ /* when called, this function will determine whether the calling thread
+ is the same as thread specified by the first argument. if it is,
+ the we execute the slot. if not, we ask the interface given by the second
+ argument to call the slot.
+ */
+
+ if (pthread_self() == thread_id) {
+ theSlot ();
+ } else {
+ ui.call_slot (theSlot);
+ }
+}
+
+template<class RequestType>
+sigc::slot<void>
+crossthread_safe (pthread_t thread_id, AbstractUI<RequestType>& ui, sigc::slot<void> theSlot)
+{
+ /* this function returns a slot that will ensure that theSlot is either
+ called by the specified thread or passed to the interface via
+ AbstractUI::call_slot().
+ */
+
+ return sigc::bind (sigc::ptr_fun (call_slot_from_thread_or_dispatch_it<RequestType>),
+ thread_id, ui, theSlot);
+}
+
+#endif /* __pbd__crossthread_h__ */