From 9d396a24955a52e2e7b35e2f98353e1b6976c2ab Mon Sep 17 00:00:00 2001 From: Julien Isorce Date: Sat, 12 Apr 2014 17:33:44 +0100 Subject: [PATCH] gl/cocoa: make gst_gl_window_cocoa_send_message_async re-entrant Backends that use g_main_context_invoke are re-entrant. Il allows to call two nested gst_gl_context_thread_add. ex: init_upload / init_colorconvert --- gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m index 02f74b2d31..509d574364 100644 --- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m +++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m @@ -334,13 +334,20 @@ gst_gl_window_cocoa_send_message_async (GstGLWindow * window, if (window) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - AppThreadPerformer* app_thread_performer = [[AppThreadPerformer alloc] - initWithAll:window_cocoa callback:callback userData:data]; + /* performSelector is not re-entrant so do it manually */ + if (G_UNLIKELY ([NSThread currentThread] == priv->thread)) { + if (callback) + callback (data); + } else { + AppThreadPerformer* app_thread_performer = + [[AppThreadPerformer alloc] initWithAll:window_cocoa + callback:callback userData:data]; - [app_thread_performer performSelector:@selector(sendToApp) onThread:priv->thread - withObject:nil waitUntilDone:NO]; - - [pool release]; + [app_thread_performer performSelector:@selector(sendToApp) + onThread:priv->thread withObject:nil waitUntilDone:NO]; + + [pool release]; + } } }