Commit 8d2e90de authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Take variable Lookup() out of GetUnused()

parent c36ef0c8
...@@ -152,7 +152,7 @@ time_ops = { CmpTime, DupDummy, FreeDummy, }; ...@@ -152,7 +152,7 @@ time_ops = { CmpTime, DupDummy, FreeDummy, };
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static int GetUnused ( vlc_object_t *, const char * ); static void WaitUnused ( vlc_object_t *, variable_t * );
static uint32_t HashString ( const char * ); static uint32_t HashString ( const char * );
static int Insert ( variable_t **, int, const char * ); static int Insert ( variable_t **, int, const char * );
static int InsertInner ( variable_t **, int, uint32_t ); static int InsertInner ( variable_t **, int, uint32_t );
...@@ -352,14 +352,15 @@ int __var_Destroy( vlc_object_t *p_this, const char *psz_name ) ...@@ -352,14 +352,15 @@ int __var_Destroy( vlc_object_t *p_this, const char *psz_name )
vlc_mutex_lock( &p_priv->var_lock ); vlc_mutex_lock( &p_priv->var_lock );
i_var = GetUnused( p_this, psz_name ); i_var = Lookup( p_this, psz_name );
if( i_var < 0 ) if( i_var < 0 )
{ {
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
return i_var; return VLC_ENOVAR;
} }
p_var = p_priv->pp_vars[i_var]; p_var = p_priv->pp_vars[i_var];
WaitUnused( p_this, p_var );
if( p_var->i_usage > 1 ) if( p_var->i_usage > 1 )
{ {
...@@ -653,14 +654,15 @@ int __var_GetAndSet( vlc_object_t *p_this, const char *psz_name, int i_action, ...@@ -653,14 +654,15 @@ int __var_GetAndSet( vlc_object_t *p_this, const char *psz_name, int i_action,
vlc_object_internals_t *p_priv = vlc_internals( p_this ); vlc_object_internals_t *p_priv = vlc_internals( p_this );
vlc_mutex_lock( &p_priv->var_lock ); vlc_mutex_lock( &p_priv->var_lock );
i_var = GetUnused( p_this, psz_name ); i_var = Lookup( p_this, psz_name );
if( i_var < 0 ) if( i_var < 0 )
{ {
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
return i_var; return VLC_ENOVAR;
} }
p_var = p_priv->pp_vars[i_var]; p_var = p_priv->pp_vars[i_var];
WaitUnused( p_this, p_var );
/* Duplicated data if needed */ /* Duplicated data if needed */
//p_var->ops->pf_dup( &val ); //p_var->ops->pf_dup( &val );
...@@ -742,7 +744,7 @@ int var_SetChecked( vlc_object_t *p_this, const char *psz_name, ...@@ -742,7 +744,7 @@ int var_SetChecked( vlc_object_t *p_this, const char *psz_name,
vlc_mutex_lock( &p_priv->var_lock ); vlc_mutex_lock( &p_priv->var_lock );
i_var = GetUnused( p_this, psz_name ); i_var = Lookup( p_this, psz_name );
if( i_var < 0 ) if( i_var < 0 )
{ {
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
...@@ -753,6 +755,8 @@ int var_SetChecked( vlc_object_t *p_this, const char *psz_name, ...@@ -753,6 +755,8 @@ int var_SetChecked( vlc_object_t *p_this, const char *psz_name,
assert( expected_type == 0 || assert( expected_type == 0 ||
(p_var->i_type & VLC_VAR_CLASS) == expected_type ); (p_var->i_type & VLC_VAR_CLASS) == expected_type );
WaitUnused( p_this, p_var );
/* Duplicate data if needed */ /* Duplicate data if needed */
p_var->ops->pf_dup( &val ); p_var->ops->pf_dup( &val );
...@@ -871,7 +875,7 @@ int __var_AddCallback( vlc_object_t *p_this, const char *psz_name, ...@@ -871,7 +875,7 @@ int __var_AddCallback( vlc_object_t *p_this, const char *psz_name,
vlc_mutex_lock( &p_priv->var_lock ); vlc_mutex_lock( &p_priv->var_lock );
i_var = GetUnused( p_this, psz_name ); i_var = Lookup( p_this, psz_name );
if( i_var < 0 ) if( i_var < 0 )
{ {
#ifndef NDEBUG #ifndef NDEBUG
...@@ -879,11 +883,12 @@ int __var_AddCallback( vlc_object_t *p_this, const char *psz_name, ...@@ -879,11 +883,12 @@ int __var_AddCallback( vlc_object_t *p_this, const char *psz_name,
"variable '%s'", psz_name ); "variable '%s'", psz_name );
#endif #endif
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
return i_var; return VLC_ENOVAR;
} }
p_var = p_priv->pp_vars[i_var]; p_var = p_priv->pp_vars[i_var];
WaitUnused( p_this, p_var );
INSERT_ELEM( p_var->p_entries, INSERT_ELEM( p_var->p_entries,
p_var->i_entries, p_var->i_entries,
p_var->i_entries, p_var->i_entries,
...@@ -915,14 +920,15 @@ int __var_DelCallback( vlc_object_t *p_this, const char *psz_name, ...@@ -915,14 +920,15 @@ int __var_DelCallback( vlc_object_t *p_this, const char *psz_name,
vlc_mutex_lock( &p_priv->var_lock ); vlc_mutex_lock( &p_priv->var_lock );
i_var = GetUnused( p_this, psz_name ); i_var = Lookup( p_this, psz_name );
if( i_var < 0 ) if( i_var < 0 )
{ {
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
return i_var; return VLC_ENOVAR;
} }
p_var = p_priv->pp_vars[i_var]; p_var = p_priv->pp_vars[i_var];
WaitUnused( p_this, p_var );
for( i_entry = p_var->i_entries ; i_entry-- ; ) for( i_entry = p_var->i_entries ; i_entry-- ; )
{ {
...@@ -974,14 +980,15 @@ int __var_TriggerCallback( vlc_object_t *p_this, const char *psz_name ) ...@@ -974,14 +980,15 @@ int __var_TriggerCallback( vlc_object_t *p_this, const char *psz_name )
vlc_mutex_lock( &p_priv->var_lock ); vlc_mutex_lock( &p_priv->var_lock );
i_var = GetUnused( p_this, psz_name ); i_var = Lookup( p_this, psz_name );
if( i_var < 0 ) if( i_var < 0 )
{ {
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
return i_var; return VLC_ENOVAR;
} }
p_var = p_priv->pp_vars[i_var]; p_var = p_priv->pp_vars[i_var];
WaitUnused( p_this, p_var );
/* Deal with callbacks. Tell we're in a callback, release the lock, /* Deal with callbacks. Tell we're in a callback, release the lock,
* call stored functions, retake the lock. */ * call stored functions, retake the lock. */
...@@ -1140,34 +1147,17 @@ cleanup: ...@@ -1140,34 +1147,17 @@ cleanup:
/* Following functions are local */ /* Following functions are local */
/***************************************************************************** /**
* GetUnused: find an unused (not in callback) variable from its name * Waits until the variable is inactive (i.e. not executing a callback)
*****************************************************************************/ */
static int GetUnused( vlc_object_t *p_this, const char *psz_name ) static void WaitUnused( vlc_object_t *p_this, variable_t *p_var )
{ {
assert( p_this );
vlc_object_internals_t *p_priv = vlc_internals( p_this ); vlc_object_internals_t *p_priv = vlc_internals( p_this );
while( true ) mutex_cleanup_push( &p_priv->var_lock );
{ while( p_var->b_incallback )
int i_var;
i_var = Lookup( p_this, psz_name );
if( i_var < 0 )
{
return VLC_ENOVAR;
}
if( ! p_priv->pp_vars[i_var]->b_incallback )
{
return i_var;
}
mutex_cleanup_push( &p_priv->var_lock );
vlc_cond_wait( &p_priv->var_wait, &p_priv->var_lock ); vlc_cond_wait( &p_priv->var_wait, &p_priv->var_lock );
vlc_cleanup_pop( ); vlc_cleanup_pop( );
}
} }
/***************************************************************************** /*****************************************************************************
...@@ -1263,9 +1253,9 @@ static int u32cmp( const void *key, const void *data ) ...@@ -1263,9 +1253,9 @@ static int u32cmp( const void *key, const void *data )
static int Lookup( vlc_object_t *obj, const char *psz_name ) static int Lookup( vlc_object_t *obj, const char *psz_name )
{ {
vlc_object_internals_t *priv = vlc_internals( obj ); vlc_object_internals_t *priv = vlc_internals( obj );
variable_t **pp_vars = priv->pp_vars; variable_t *const *pp_vars = priv->pp_vars;
size_t i_vars = priv->i_vars; size_t i_vars = priv->i_vars;
variable_t **pp_var; variable_t *const *pp_var;
uint32_t i_hash = HashString( psz_name ); uint32_t i_hash = HashString( psz_name );
pp_var = bsearch( &i_hash, pp_vars, i_vars, sizeof( *pp_var ), u32cmp ); pp_var = bsearch( &i_hash, pp_vars, i_vars, sizeof( *pp_var ), u32cmp );
...@@ -1465,6 +1455,7 @@ static int TriggerCallback( vlc_object_t *p_this, variable_t *p_var, ...@@ -1465,6 +1455,7 @@ static int TriggerCallback( vlc_object_t *p_this, variable_t *p_var,
callback_entry_t *p_entries = p_var->p_entries; callback_entry_t *p_entries = p_var->p_entries;
vlc_object_internals_t *p_priv = vlc_internals( p_this ); vlc_object_internals_t *p_priv = vlc_internals( p_this );
assert( !p_var->b_incallback );
p_var->b_incallback = true; p_var->b_incallback = true;
vlc_mutex_unlock( &p_priv->var_lock ); vlc_mutex_unlock( &p_priv->var_lock );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment