From af97f24d528acab89969d6541d83f17ce1ecd580 Mon Sep 17 00:00:00 2001 From: Brian Weaver Date: Sat, 26 Dec 2009 01:37:54 -0500 Subject: [PATCH] Modified the main OS X interface module to remove the use of setjmp() and longjmp(). The MainMenu.nib file was modified to invoke the stop selector instead of the terminate selector on the NSApp object. This allows the OS X framework to return from the call [NSApp run] instead of using setjmp()/longjmp() in a managed framework. Signed-off-by: Pierre d'Herbemont --- .../English.lproj/MainMenu.nib/designable.nib | 2 +- modules/gui/macosx/intf.m | 50 ++++++++++--------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/extras/package/macosx/Resources/English.lproj/MainMenu.nib/designable.nib b/extras/package/macosx/Resources/English.lproj/MainMenu.nib/designable.nib index 39e59323cc..6fb8f32efa 100644 --- a/extras/package/macosx/Resources/English.lproj/MainMenu.nib/designable.nib +++ b/extras/package/macosx/Resources/English.lproj/MainMenu.nib/designable.nib @@ -7880,7 +7880,7 @@ LCAuLi4 - terminate: + stop: diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m index 2d44438d11..fc359b6def 100644 --- a/modules/gui/macosx/intf.m +++ b/modules/gui/macosx/intf.m @@ -113,7 +113,8 @@ void CloseIntf ( vlc_object_t *p_this ) /***************************************************************************** * Run: main loop *****************************************************************************/ -jmp_buf jmpbuffer; +static NSLock * o_appLock = nil; // controls access to f_appExit +static int f_appExit = 0; // set to 1 when application termination signaled static void Run( intf_thread_t *p_intf ) { @@ -134,17 +135,15 @@ static void Run( intf_thread_t *p_intf ) NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; - /* Install a jmpbuffer to where we can go back before the NSApp exit - * see applicationWillTerminate: */ + o_appLock = [[NSLock alloc] init]; + [VLCApplication sharedApplication]; [[VLCMain sharedInstance] setIntf: p_intf]; [NSBundle loadNibNamed: @"MainMenu" owner: NSApp]; - /* Install a jmpbuffer to where we can go back before the NSApp exit - * see applicationWillTerminate: */ - if(setjmp(jmpbuffer) == 0) - [NSApp run]; + [NSApp run]; + [[VLCMain sharedInstance] applicationWillTerminate:nil]; [o_pool release]; } @@ -790,19 +789,27 @@ static VLCMain *_o_sharedMainInstance = nil; vout_thread_t * p_vout; int returnedValue = 0; - if( !p_intf ) return; + if( !p_intf ) + return; + + // don't allow a double termination call. If the user has + // already invoked the quit then simply return this time. + int isTerminating = false; + + [o_appLock lock]; + isTerminating = (f_appExit++ > 0 ? 1 : 0); + [o_appLock unlock]; + + if (isTerminating) + return; msg_Dbg( p_intf, "Terminating" ); - /* Make sure the manage_thread won't call -terminate: again */ - pthread_cancel( manage_thread ); + pthread_join( manage_thread, NULL ); /* Make sure the intf object is getting killed */ vlc_object_kill( p_intf ); - /* Make sure our manage_thread ends */ - pthread_join( manage_thread, NULL ); - /* Make sure the interfaceTimer is destroyed */ [interfaceTimer invalidate]; [interfaceTimer release]; @@ -894,11 +901,6 @@ static VLCMain *_o_sharedMainInstance = nil; libvlc_Quit( p_intf->p_libvlc ); [self setIntf:nil]; - - /* Go back to Run() and make libvlc exit properly */ - if( jmpbuffer ) - longjmp( jmpbuffer, 1 ); - /* not reached */ } #pragma mark - @@ -1574,7 +1576,8 @@ static void manage_cleanup( void * args ) struct manage_cleanup_stack stack = { p_intf, &p_input, p_playlist, self }; pthread_cleanup_push(manage_cleanup, &stack); - while( true ) + bool exitLoop = false; + while( !exitLoop ) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; @@ -1609,14 +1612,15 @@ static void manage_cleanup( void * args ) msleep( INTF_IDLE_SLEEP ); [pool release]; + + [o_appLock lock]; + exitLoop = (f_appExit != 0 ? true : false); + [o_appLock unlock]; } pthread_cleanup_pop(1); - msg_Dbg( p_intf, "Killing the Mac OS X module" ); - - /* We are dead, terminate */ - [NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO]; + msg_Dbg( p_intf, "OS X Manage thread terminating" ); } - (void)manageVolumeSlider -- 2.39.2