Commit de9d74a6 authored by Clément Stenac's avatar Clément Stenac

Don't loop preparse threads when idle

Compile fix
parent a0cbc6ed
...@@ -123,7 +123,7 @@ static int FindMeta( vlc_object_t *p_this ) ...@@ -123,7 +123,7 @@ static int FindMeta( vlc_object_t *p_this )
free( psz_dir ); free( psz_dir );
} }
i_meta = input_GetMetaEngineFlags( p_item->p_meta ); i_meta = input_CurrentMetaFlags( p_item->p_meta );
p_me->i_mandatory &= ~i_meta; p_me->i_mandatory &= ~i_meta;
p_me->i_optional &= ~i_meta; p_me->i_optional &= ~i_meta;
if( p_me->i_mandatory ) if( p_me->i_mandatory )
......
...@@ -132,7 +132,7 @@ static int FindMeta( vlc_object_t *p_this ) ...@@ -132,7 +132,7 @@ static int FindMeta( vlc_object_t *p_this )
mb_Delete( p_mb ); mb_Delete( p_mb );
i_meta = input_GetMetaEngineFlags( p_item->p_meta ); i_meta = input_CurrentMetaFlags( p_item->p_meta );
p_me->i_mandatory &= ~i_meta; p_me->i_mandatory &= ~i_meta;
p_me->i_optional &= ~i_meta; p_me->i_optional &= ~i_meta;
if( p_me->i_mandatory ) if( p_me->i_mandatory )
......
...@@ -198,6 +198,7 @@ int playlist_PreparseEnqueue( playlist_t *p_playlist, ...@@ -198,6 +198,7 @@ int playlist_PreparseEnqueue( playlist_t *p_playlist,
p_playlist->p_preparse->i_waiting, p_playlist->p_preparse->i_waiting,
p_item ); p_item );
vlc_mutex_unlock( &p_playlist->p_preparse->object_lock ); vlc_mutex_unlock( &p_playlist->p_preparse->object_lock );
vlc_cond_signal( &p_playlist->p_preparse->object_wait );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -229,9 +230,9 @@ int playlist_AskForArtEnqueue( playlist_t *p_playlist, ...@@ -229,9 +230,9 @@ int playlist_AskForArtEnqueue( playlist_t *p_playlist,
vlc_gc_incref( p_item ); vlc_gc_incref( p_item );
INSERT_ELEM( p_playlist->p_secondary_preparse->p_waiting, INSERT_ELEM( p_playlist->p_secondary_preparse->p_waiting,
p_playlist->p_secondary_preparse->i_waiting, p_playlist->p_secondary_preparse->i_waiting,
i, i, p );
p );
vlc_mutex_unlock( &p_playlist->p_secondary_preparse->object_lock ); vlc_mutex_unlock( &p_playlist->p_secondary_preparse->object_lock );
vlc_cond_signal( &p_playlist->p_secondary_preparse->object_lock );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
......
...@@ -446,16 +446,27 @@ void playlist_LastLoop( playlist_t *p_playlist ) ...@@ -446,16 +446,27 @@ void playlist_LastLoop( playlist_t *p_playlist )
void playlist_PreparseLoop( playlist_preparse_t *p_obj ) void playlist_PreparseLoop( playlist_preparse_t *p_obj )
{ {
playlist_t *p_playlist = (playlist_t *)p_obj->p_parent; playlist_t *p_playlist = (playlist_t *)p_obj->p_parent;
input_item_t *p_current;
int i_activity; int i_activity;
uint32_t i_m, i_o; uint32_t i_m, i_o;
while( !p_playlist->b_die )
{
vlc_mutex_lock( &p_obj->object_lock ); vlc_mutex_lock( &p_obj->object_lock );
while( p_obj->i_waiting == 0 )
if( p_obj->i_waiting > 0 )
{ {
input_item_t *p_current = p_obj->pp_waiting[0]; vlc_cond_wait( &p_obj->object_wait, &p_obj->object_lock );
if( p_playlist->b_die )
{
vlc_mutex_unlock( &p_obj->object_lock );
return;
}
}
p_current = p_obj->pp_waiting[0];
REMOVE_ELEM( p_obj->pp_waiting, p_obj->i_waiting, 0 ); REMOVE_ELEM( p_obj->pp_waiting, p_obj->i_waiting, 0 );
vlc_mutex_unlock( &p_obj->object_lock ); vlc_mutex_unlock( &p_obj->object_lock );
PL_LOCK; PL_LOCK;
if( p_current ) if( p_current )
{ {
...@@ -484,6 +495,7 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) ...@@ -484,6 +495,7 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj )
var_SetInteger( p_playlist, "item-change", p_current->i_id ); var_SetInteger( p_playlist, "item-change", p_current->i_id );
} }
PL_LOCK; PL_LOCK;
/* If we haven't retrieved enough meta, add to secondary queue /* If we haven't retrieved enough meta, add to secondary queue
* which will run the "meta fetchers" * which will run the "meta fetchers"
* TODO: * TODO:
...@@ -503,6 +515,8 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) ...@@ -503,6 +515,8 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj )
p ); p );
vlc_mutex_unlock( vlc_mutex_unlock(
&p_playlist->p_secondary_preparse->object_lock); &p_playlist->p_secondary_preparse->object_lock);
vlc_cond_signal(
&p_playlist->p_secondary_preparse->object_wait );
} }
else else
vlc_gc_decref( p_current ); vlc_gc_decref( p_current );
...@@ -515,23 +529,34 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) ...@@ -515,23 +529,34 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj )
i_activity = var_GetInteger( p_playlist, "activity" ); i_activity = var_GetInteger( p_playlist, "activity" );
if( i_activity < 0 ) i_activity = 0; if( i_activity < 0 ) i_activity = 0;
vlc_mutex_unlock( &p_obj->object_lock ); vlc_mutex_unlock( &p_obj->object_lock );
/* Sleep at least 1ms */
msleep( (i_activity+1) * 1000 ); msleep( (i_activity+1) * 1000 );
return;
} }
vlc_mutex_unlock( &p_obj->object_lock );
} }
/** Main loop for secondary preparser queue */ /** Main loop for secondary preparser queue */
void playlist_SecondaryPreparseLoop( playlist_secondary_preparse_t *p_obj ) void playlist_SecondaryPreparseLoop( playlist_secondary_preparse_t *p_obj )
{ {
playlist_t *p_playlist = (playlist_t *)p_obj->p_parent; playlist_t *p_playlist = (playlist_t *)p_obj->p_parent;
vlc_bool_t b_fetch_art;
input_item_t *p_item;
int i_activity;
while( !p_playlist->b_die )
{
vlc_mutex_lock( &p_obj->object_lock ); vlc_mutex_lock( &p_obj->object_lock );
while( p_obj->i_waiting == 0 )
if( p_obj->i_waiting > 0 ) {
vlc_cond_wait( &p_obj->object_wait, &p_obj->object_lock );
if( p_playlist->b_die )
{ {
vlc_bool_t b_fetch_art = p_obj->p_waiting->b_fetch_art; vlc_mutex_unlock( &p_obj->object_lock );
input_item_t *p_item = p_obj->p_waiting->p_item; return;
}
}
b_fetch_art = p_obj->p_waiting->b_fetch_art;
p_item = p_obj->p_waiting->p_item;
REMOVE_ELEM( p_obj->p_waiting, p_obj->i_waiting, 0 ); REMOVE_ELEM( p_obj->p_waiting, p_obj->i_waiting, 0 );
vlc_mutex_unlock( &p_obj->object_lock ); vlc_mutex_unlock( &p_obj->object_lock );
if( p_item ) if( p_item )
...@@ -549,9 +574,13 @@ void playlist_SecondaryPreparseLoop( playlist_secondary_preparse_t *p_obj ) ...@@ -549,9 +574,13 @@ void playlist_SecondaryPreparseLoop( playlist_secondary_preparse_t *p_obj )
var_SetInteger( p_playlist, "item-change", p_item->i_id ); var_SetInteger( p_playlist, "item-change", p_item->i_id );
vlc_gc_decref( p_item ); vlc_gc_decref( p_item );
} }
return; vlc_mutex_lock( &p_obj->object_lock );
} i_activity = var_GetInteger( p_playlist, "activity" );
if( i_activity < 0 ) i_activity = 0;
vlc_mutex_unlock( &p_obj->object_lock ); vlc_mutex_unlock( &p_obj->object_lock );
/* Sleep at least 1ms */
msleep( (i_activity+1) * 1000 );
}
} }
static void VariablesInit( playlist_t *p_playlist ) static void VariablesInit( playlist_t *p_playlist )
......
...@@ -142,7 +142,11 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) ...@@ -142,7 +142,11 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent )
*/ */
int playlist_ThreadDestroy( playlist_t * p_playlist ) int playlist_ThreadDestroy( playlist_t * p_playlist )
{ {
p_playlist->b_die = 1; p_playlist->b_die = VLC_TRUE;
if( p_playlist->p_preparse )
vlc_cond_signal( &p_playlist->p_preparse->object_wait );
if( p_playlist->p_secondary_preparse )
vlc_cond_signal( &p_playlist->p_secondary_preparse->object_wait );
DestroyInteraction( p_playlist ); DestroyInteraction( p_playlist );
DestroyPlaylist( p_playlist ); DestroyPlaylist( p_playlist );
...@@ -208,14 +212,7 @@ static void RunPreparse ( playlist_preparse_t *p_obj ) ...@@ -208,14 +212,7 @@ static void RunPreparse ( playlist_preparse_t *p_obj )
/* Tell above that we're ready */ /* Tell above that we're ready */
vlc_thread_ready( p_obj ); vlc_thread_ready( p_obj );
while( !p_playlist->b_die )
{
playlist_PreparseLoop( p_obj ); playlist_PreparseLoop( p_obj );
if( p_obj->i_waiting == 0 )
{
msleep( INTF_IDLE_SLEEP );
}
}
} }
static void RunSecondaryPreparse( playlist_secondary_preparse_t *p_obj ) static void RunSecondaryPreparse( playlist_secondary_preparse_t *p_obj )
...@@ -224,14 +221,7 @@ static void RunSecondaryPreparse( playlist_secondary_preparse_t *p_obj ) ...@@ -224,14 +221,7 @@ static void RunSecondaryPreparse( playlist_secondary_preparse_t *p_obj )
/* Tell above that we're ready */ /* Tell above that we're ready */
vlc_thread_ready( p_obj ); vlc_thread_ready( p_obj );
while( !p_playlist->b_die )
{
playlist_SecondaryPreparseLoop( p_obj ); playlist_SecondaryPreparseLoop( p_obj );
if( p_obj->i_waiting == 0 )
{
msleep( INTF_IDLE_SLEEP );
}
}
} }
/***************************************************************************** /*****************************************************************************
......
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