[vlc-commits] ntservice: do not use pf_run

Rémi Denis-Courmont git at videolan.org
Tue Nov 27 19:24:48 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Nov 27 19:56:36 2012 +0200| [53828bd560c84691d94bcb80d8ccbffbe1e90630] | committer: Rémi Denis-Courmont

ntservice: do not use pf_run

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

 modules/control/ntservice.c |   31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/modules/control/ntservice.c b/modules/control/ntservice.c
index 8850f5d..6807d84 100644
--- a/modules/control/ntservice.c
+++ b/modules/control/ntservice.c
@@ -86,12 +86,13 @@ struct intf_sys_t
     SERVICE_STATUS_HANDLE hStatus;
     SERVICE_STATUS status;
     char *psz_service;
+    vlc_thread_t thread;
 };
 
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static void Run( intf_thread_t *p_intf );
+static void *Run( void * );
 static int NTServiceInstall( intf_thread_t *p_intf );
 static int NTServiceUninstall( intf_thread_t *p_intf );
 static void WINAPI ServiceDispatch( DWORD numArgs, char **args );
@@ -106,8 +107,16 @@ static intf_thread_t *p_global_intf;
 static int Activate( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t*)p_this;
+    intf_sys_t *p_sys = malloc( sizeof( *p_sys ) );
+    if( unlikely(p_sys == NULL) )
+        return VLC_ENOMEM;
+
+    p_intf->pf_run = NULL;
+    p_intf->p_sys = p_sys;
+
+    if( vlc_clone( &p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW ) )
+        return VLC_ENOMEM;
 
-    p_intf->pf_run = Run;
     return VLC_SUCCESS;
 }
 
@@ -116,24 +125,26 @@ static int Activate( vlc_object_t *p_this )
  *****************************************************************************/
 void Close( vlc_object_t *p_this )
 {
-    (void)p_this;
+    intf_thread_t *p_intf = (intf_thread_t*)p_this;
+    intf_sys_t *p_sys = p_intf->p_sys;
+
+    vlc_join( p_sys->thread, NULL );
+    free( p_sys );
 }
 
 /*****************************************************************************
  * Run: interface thread
  *****************************************************************************/
-static void Run( intf_thread_t *p_intf )
+static void *Run( void *data )
 {
-    intf_sys_t sys;
+    intf_thread_t *p_intf = data;
     SERVICE_TABLE_ENTRY dispatchTable[] =
     {
         { (LPTSTR)VLCSERVICENAME, &ServiceDispatch },
         { NULL, NULL }
     };
 
-    int canc = vlc_savecancel();
     p_global_intf = p_intf;
-    p_intf->p_sys = &sys;
     p_intf->p_sys->psz_service = var_InheritString( p_intf, "ntservice-name" );
     p_intf->p_sys->psz_service = p_intf->p_sys->psz_service ?
         p_intf->p_sys->psz_service : strdup(VLCSERVICENAME);
@@ -141,13 +152,13 @@ static void Run( intf_thread_t *p_intf )
     if( var_InheritBool( p_intf, "ntservice-install" ) )
     {
         NTServiceInstall( p_intf );
-        return;
+        return NULL;
     }
 
     if( var_InheritBool( p_intf, "ntservice-uninstall" ) )
     {
         NTServiceUninstall( p_intf );
-        return;
+        return NULL;
     }
 
     if( StartServiceCtrlDispatcher( dispatchTable ) == 0 )
@@ -159,7 +170,7 @@ static void Run( intf_thread_t *p_intf )
 
     /* Make sure we exit (In case other interfaces have been spawned) */
     libvlc_Quit( p_intf->p_libvlc );
-    vlc_restorecancel( canc );
+    return NULL;
 }
 
 /*****************************************************************************



More information about the vlc-commits mailing list