[vlc-devel] [PATCH 09/14] vlm: extract open/close

Romain Vimont rom1v at videolabs.io
Tue Sep 15 19:37:41 CEST 2020


Extract Open()/Close() from vlm_New() and vlm_Delete(), to be moved to
the module implementation.
---
 include/vlc_vlm.h |  1 +
 src/input/vlm.c   | 94 +++++++++++++++++++++++++++--------------------
 2 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/include/vlc_vlm.h b/include/vlc_vlm.h
index 2c422478de..a8eba9df4d 100644
--- a/include/vlc_vlm.h
+++ b/include/vlc_vlm.h
@@ -30,6 +30,7 @@ struct vlm_ops
 {
     int (*execute)(vlm_t *vlm, const char *cmd, vlm_message_t **msg_out);
     int (*va_control)(vlm_t *vlm, int query, va_list list);
+    void (*close)(vlm_t *vlm);
 };
 
 struct vlm_t
diff --git a/src/input/vlm.c b/src/input/vlm.c
index dc6e2ab0e0..caef8b3693 100644
--- a/src/input/vlm.c
+++ b/src/input/vlm.c
@@ -113,15 +113,44 @@ static vlc_mutex_t vlm_mutex = VLC_STATIC_MUTEX;
 static int ExecuteCommandImpl( vlm_t *vlm, const char *cmd,
                                vlm_message_t **msg_out );
 static int VaControlImpl( vlm_t *vlm, int query, va_list args );
+static void vlm_Close( vlm_t *vlm );
 
 static const struct vlm_ops vlm_ops = {
     .execute = ExecuteCommandImpl,
     .va_control = VaControlImpl,
+    .close = vlm_Close,
 };
 
 /*****************************************************************************
  * vlm_New:
  *****************************************************************************/
+static int vlm_Open( vlm_t *p_vlm )
+{
+    vlm_sys_t *sys = p_vlm->sys = malloc( sizeof( *sys ) );
+    if (!sys)
+        return VLC_ENOMEM;
+
+    vlc_mutex_init( &sys->lock );
+    vlc_mutex_init( &sys->lock_manage );
+    vlc_cond_init( &sys->wait_manage );
+    sys->input_state_changed = false;
+    sys->exiting = false;
+    sys->i_id = 1;
+    TAB_INIT( sys->i_media, sys->media );
+    TAB_INIT( sys->i_schedule, sys->schedule );
+    var_Create( p_vlm, "intf-event", VLC_VAR_ADDRESS );
+
+    if( vlc_clone( &sys->thread, Manage, p_vlm, VLC_THREAD_PRIORITY_LOW ) )
+    {
+        free(sys);
+        return VLC_EGENERIC;
+    }
+
+    p_vlm->ops = &vlm_ops;
+
+    return VLC_SUCCESS;
+}
+
 vlm_t *vlm_New( libvlc_int_t *libvlc )
 {
     vlm_t *p_vlm = NULL, **pp_vlm = &(libvlc_priv(libvlc)->p_vlm);
@@ -155,34 +184,14 @@ vlm_t *vlm_New( libvlc_int_t *libvlc )
 
     p_vlm = &priv->vlm;
 
-    vlm_sys_t *sys = p_vlm->sys = malloc( sizeof( *sys ) );
-    if (!sys)
-    {
-        vlc_mutex_unlock( &vlm_mutex );
-        vlc_object_delete( p_vlm );
-        return NULL;
-    }
-
-    vlc_mutex_init( &sys->lock );
-    vlc_mutex_init( &sys->lock_manage );
-    vlc_cond_init( &sys->wait_manage );
-    sys->input_state_changed = false;
-    sys->exiting = false;
-    sys->i_id = 1;
-    TAB_INIT( sys->i_media, sys->media );
-    TAB_INIT( sys->i_schedule, sys->schedule );
-    var_Create( p_vlm, "intf-event", VLC_VAR_ADDRESS );
-
-    if( vlc_clone( &sys->thread, Manage, p_vlm, VLC_THREAD_PRIORITY_LOW ) )
+    int ret = vlm_Open(p_vlm);
+    if (ret != VLC_SUCCESS)
     {
-        free(sys);
         vlc_object_delete(p_vlm);
         vlc_mutex_unlock( &vlm_mutex );
         return NULL;
     }
 
-    p_vlm->ops = &vlm_ops;
-
     *pp_vlm = p_vlm; /* for future reference */
 
     vlc_mutex_unlock( &vlm_mutex );
@@ -215,6 +224,28 @@ int vlm_LoadFile( vlm_t *p_vlm, const char *psz_vlmconf )
 /*****************************************************************************
  * vlm_Delete:
  *****************************************************************************/
+static void vlm_Close( vlm_t *p_vlm )
+{
+    vlm_sys_t *sys = p_vlm->sys;
+
+    /* Destroy and release VLM */
+    vlc_mutex_lock( &sys->lock );
+    vlm_ControlInternal( p_vlm, VLM_CLEAR_MEDIAS );
+    TAB_CLEAN( sys->i_media, sys->media );
+
+    vlm_ControlInternal( p_vlm, VLM_CLEAR_SCHEDULES );
+    TAB_CLEAN( sys->i_schedule, sys->schedule );
+    vlc_mutex_unlock( &sys->lock );
+
+    vlc_mutex_lock( &sys->lock_manage );
+    sys->exiting = true;
+    vlc_cond_signal( &sys->wait_manage );
+    vlc_mutex_unlock( &sys->lock_manage );
+
+    vlc_join( sys->thread, NULL );
+    free(sys);
+}
+
 void vlm_Delete( vlm_t *p_vlm )
 {
     /* vlm_Delete() is serialized against itself, and against vlm_New().
@@ -234,27 +265,10 @@ void vlm_Delete( vlm_t *p_vlm )
         return;
     }
 
-    vlm_sys_t *sys = p_vlm->sys;
-
-    /* Destroy and release VLM */
-    vlc_mutex_lock( &sys->lock );
-    vlm_ControlInternal( p_vlm, VLM_CLEAR_MEDIAS );
-    TAB_CLEAN( sys->i_media, sys->media );
-
-    vlm_ControlInternal( p_vlm, VLM_CLEAR_SCHEDULES );
-    TAB_CLEAN( sys->i_schedule, sys->schedule );
-    vlc_mutex_unlock( &sys->lock );
-
-    vlc_mutex_lock( &sys->lock_manage );
-    sys->exiting = true;
-    vlc_cond_signal( &sys->wait_manage );
-    vlc_mutex_unlock( &sys->lock_manage );
-
     libvlc_priv(vlc_object_instance(p_vlm))->p_vlm = NULL;
     vlc_mutex_unlock( &vlm_mutex );
 
-    vlc_join( sys->thread, NULL );
-    free(sys);
+    p_vlm->ops->close(p_vlm);
     vlc_object_delete(p_vlm);
 }
 
-- 
2.28.0



More information about the vlc-devel mailing list