start of new crossthread-safe design
git-svn-id: svn://localhost/ardour2/trunk@1133 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
3f207b1e4f
commit
7bbf761321
|
@ -2,6 +2,7 @@
|
|||
#define __ardour_gtk_gui_thread_h__
|
||||
|
||||
#include <gtkmm2ext/gtk_ui.h>
|
||||
#include <pbd/crossthread.h>
|
||||
|
||||
#define ENSURE_GUI_THREAD(slot) \
|
||||
if (!Gtkmm2ext::UI::instance()->caller_is_ui_thread()) {\
|
||||
|
@ -9,4 +10,8 @@
|
|||
return;\
|
||||
}
|
||||
|
||||
#define GTK_SAFE(theSlot) crossthread_safe (Gtkmm2ext::UI::instance()->thread_id(),\
|
||||
*Gtkmm2ext::UI::instance(), \
|
||||
(theSlot))
|
||||
|
||||
#endif /* __ardour_gtk_gui_thread_h__ */
|
||||
|
|
|
@ -101,6 +101,8 @@ class UI : public Receiver, public AbstractUI<UIRequest>
|
|||
|
||||
bool caller_is_ui_thread ();
|
||||
|
||||
static pthread_t thread_id() { return gui_thread; }
|
||||
|
||||
/* Gtk-UI specific interfaces */
|
||||
|
||||
bool running ();
|
||||
|
|
|
@ -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__ */
|
Loading…
Reference in New Issue