[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