[vlc-devel] commit: 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. (Brian Weaver )

git version control git at videolan.org
Sat Dec 26 10:36:18 CET 2009


vlc | branch: master | Brian Weaver <cmdrclueless at gmail.com> | Sat Dec 26 01:37:54 2009 -0500| [af97f24d528acab89969d6541d83f17ce1ecd580] | committer: Pierre d'Herbemont 

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 <pdherbemont at free.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=af97f24d528acab89969d6541d83f17ce1ecd580
---

 .../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 39e5932..6fb8f32 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</string>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
-						<string key="label">terminate:</string>
+						<string key="label">stop:</string>
 						<reference key="source" ref="987699396"/>
 						<reference key="destination" ref="845106587"/>
 					</object>
diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m
index 2d44438..fc359b6 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




More information about the vlc-devel mailing list