From: Clément Stenac Date: Fri, 29 Sep 2006 19:48:53 +0000 (+0000) Subject: Don't loop preparse threads when idle X-Git-Tag: 0.9.0-test0~10097 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=de9d74a605bbf57f524b309cff22763d3e38638f;p=vlc Don't loop preparse threads when idle Compile fix --- diff --git a/modules/meta_engine/folder.c b/modules/meta_engine/folder.c index 8f865f2633..b7b68811bc 100644 --- a/modules/meta_engine/folder.c +++ b/modules/meta_engine/folder.c @@ -123,7 +123,7 @@ static int FindMeta( vlc_object_t *p_this ) 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_optional &= ~i_meta; if( p_me->i_mandatory ) diff --git a/modules/meta_engine/musicbrainz.c b/modules/meta_engine/musicbrainz.c index ca9a40206e..fd4e367620 100644 --- a/modules/meta_engine/musicbrainz.c +++ b/modules/meta_engine/musicbrainz.c @@ -132,7 +132,7 @@ static int FindMeta( vlc_object_t *p_this ) 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_optional &= ~i_meta; if( p_me->i_mandatory ) diff --git a/src/playlist/control.c b/src/playlist/control.c index 3049ea5b67..aa84a184af 100644 --- a/src/playlist/control.c +++ b/src/playlist/control.c @@ -198,6 +198,7 @@ int playlist_PreparseEnqueue( playlist_t *p_playlist, p_playlist->p_preparse->i_waiting, p_item ); vlc_mutex_unlock( &p_playlist->p_preparse->object_lock ); + vlc_cond_signal( &p_playlist->p_preparse->object_wait ); return VLC_SUCCESS; } @@ -229,9 +230,9 @@ int playlist_AskForArtEnqueue( playlist_t *p_playlist, vlc_gc_incref( p_item ); INSERT_ELEM( p_playlist->p_secondary_preparse->p_waiting, p_playlist->p_secondary_preparse->i_waiting, - i, - p ); + i, p ); vlc_mutex_unlock( &p_playlist->p_secondary_preparse->object_lock ); + vlc_cond_signal( &p_playlist->p_secondary_preparse->object_lock ); return VLC_SUCCESS; } diff --git a/src/playlist/engine.c b/src/playlist/engine.c index b0cdddee61..39b09c1743 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -446,16 +446,27 @@ void playlist_LastLoop( playlist_t *p_playlist ) void playlist_PreparseLoop( playlist_preparse_t *p_obj ) { playlist_t *p_playlist = (playlist_t *)p_obj->p_parent; + input_item_t *p_current; int i_activity; uint32_t i_m, i_o; - vlc_mutex_lock( &p_obj->object_lock ); - - if( p_obj->i_waiting > 0 ) + while( !p_playlist->b_die ) { - input_item_t *p_current = p_obj->pp_waiting[0]; + vlc_mutex_lock( &p_obj->object_lock ); + while( p_obj->i_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 ); vlc_mutex_unlock( &p_obj->object_lock ); + PL_LOCK; if( p_current ) { @@ -484,6 +495,7 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) var_SetInteger( p_playlist, "item-change", p_current->i_id ); } PL_LOCK; + /* If we haven't retrieved enough meta, add to secondary queue * which will run the "meta fetchers" * TODO: @@ -503,6 +515,8 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) p ); vlc_mutex_unlock( &p_playlist->p_secondary_preparse->object_lock); + vlc_cond_signal( + &p_playlist->p_secondary_preparse->object_wait ); } else vlc_gc_decref( p_current ); @@ -515,23 +529,34 @@ void playlist_PreparseLoop( playlist_preparse_t *p_obj ) i_activity = var_GetInteger( p_playlist, "activity" ); if( i_activity < 0 ) i_activity = 0; vlc_mutex_unlock( &p_obj->object_lock ); + /* Sleep at least 1ms */ msleep( (i_activity+1) * 1000 ); - return; } - vlc_mutex_unlock( &p_obj->object_lock ); } /** Main loop for secondary preparser queue */ void playlist_SecondaryPreparseLoop( playlist_secondary_preparse_t *p_obj ) { playlist_t *p_playlist = (playlist_t *)p_obj->p_parent; + vlc_bool_t b_fetch_art; + input_item_t *p_item; + int i_activity; - vlc_mutex_lock( &p_obj->object_lock ); - - if( p_obj->i_waiting > 0 ) + while( !p_playlist->b_die ) { - vlc_bool_t b_fetch_art = p_obj->p_waiting->b_fetch_art; - input_item_t *p_item = p_obj->p_waiting->p_item; + vlc_mutex_lock( &p_obj->object_lock ); + while( p_obj->i_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; + } + } + + 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 ); vlc_mutex_unlock( &p_obj->object_lock ); if( p_item ) @@ -549,9 +574,13 @@ void playlist_SecondaryPreparseLoop( playlist_secondary_preparse_t *p_obj ) var_SetInteger( p_playlist, "item-change", p_item->i_id ); 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 ); + /* Sleep at least 1ms */ + msleep( (i_activity+1) * 1000 ); } - vlc_mutex_unlock( &p_obj->object_lock ); } static void VariablesInit( playlist_t *p_playlist ) diff --git a/src/playlist/thread.c b/src/playlist/thread.c index 5efe4231ea..8f7169b2a7 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -142,7 +142,11 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) */ 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 ); DestroyPlaylist( p_playlist ); @@ -208,14 +212,7 @@ static void RunPreparse ( playlist_preparse_t *p_obj ) /* Tell above that we're ready */ vlc_thread_ready( p_obj ); - while( !p_playlist->b_die ) - { - playlist_PreparseLoop( p_obj ); - if( p_obj->i_waiting == 0 ) - { - msleep( INTF_IDLE_SLEEP ); - } - } + playlist_PreparseLoop( p_obj ); } 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 */ vlc_thread_ready( p_obj ); - while( !p_playlist->b_die ) - { - playlist_SecondaryPreparseLoop( p_obj ); - if( p_obj->i_waiting == 0 ) - { - msleep( INTF_IDLE_SLEEP ); - } - } + playlist_SecondaryPreparseLoop( p_obj ); } /*****************************************************************************