vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sat Apr 11 23:45:54 2020 +0300| [65b83f162abd5ea981ace52fe1bcb34f16902db8] | committer: Rémi Denis-Courmont
lua/sd: use queue This adds missing memory allocation error handling and removes one use of CV cancellation. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=65b83f162abd5ea981ace52fe1bcb34f16902db8 --- modules/lua/services_discovery.c | 76 +++++++++++++++------------------------- 1 file changed, 29 insertions(+), 47 deletions(-) diff --git a/modules/lua/services_discovery.c b/modules/lua/services_discovery.c index 3984bf3de8..2dc3621c3b 100644 --- a/modules/lua/services_discovery.c +++ b/modules/lua/services_discovery.c @@ -28,6 +28,7 @@ #include <assert.h> #include <vlc_common.h> #include <vlc_services_discovery.h> +#include <vlc_queue.h> #include "vlc.h" #include "libs.h" @@ -141,14 +142,17 @@ typedef struct char *psz_filename; vlc_thread_t thread; - vlc_mutex_t lock; - vlc_cond_t cond; - - char **ppsz_query; - int i_query; + vlc_queue_t queue; + bool dead; } services_discovery_sys_t; static const luaL_Reg p_reg[] = { { NULL, NULL } }; +struct sd_query +{ + struct sd_query *next; + char query[]; +}; + /***************************************************************************** * Open: initialize and create stuff *****************************************************************************/ @@ -232,13 +236,11 @@ int Open_LuaSD( vlc_object_t *p_this ) p_sd->description = p_sd->psz_name; p_sys->L = L; - vlc_mutex_init( &p_sys->lock ); - vlc_cond_init( &p_sys->cond ); - TAB_INIT( p_sys->i_query, p_sys->ppsz_query ); + p_sys->dead = false; + vlc_queue_Init( &p_sys->queue, offsetof (struct sd_query, next) ); if( vlc_clone( &p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW ) ) { - TAB_CLEAN( p_sys->i_query, p_sys->ppsz_query ); goto error; } return VLC_SUCCESS; @@ -259,13 +261,8 @@ void Close_LuaSD( vlc_object_t *p_this ) services_discovery_t *p_sd = ( services_discovery_t * )p_this; services_discovery_sys_t *p_sys = p_sd->p_sys; - vlc_cancel( p_sys->thread ); + vlc_queue_Kill( &p_sys->queue, &p_sys->dead ); vlc_join( p_sys->thread, NULL ); - - for( int i = 0; i < p_sys->i_query; i++ ) - free( p_sys->ppsz_query[i] ); - TAB_CLEAN( p_sys->i_query, p_sys->ppsz_query ); - free( p_sys->psz_filename ); lua_close( p_sys->L ); free( p_sys ); @@ -280,8 +277,6 @@ static void* Run( void *data ) services_discovery_sys_t *p_sys = p_sd->p_sys; lua_State *L = p_sys->L; - int cancel = vlc_savecancel(); - lua_getglobal( L, "main" ); if( !lua_isfunction( L, lua_gettop( L ) ) || lua_pcall( L, 0, 1, 0 ) ) { @@ -289,7 +284,6 @@ static void* Run( void *data ) "function main(): %s", p_sys->psz_filename, lua_tostring( L, lua_gettop( L ) ) ); lua_pop( L, 1 ); - vlc_restorecancel( cancel ); return NULL; } msg_Dbg( p_sd, "LuaSD script loaded: %s", p_sys->psz_filename ); @@ -298,37 +292,20 @@ static void* Run( void *data ) * open, but lua will never gc until lua_close(). */ lua_gc( L, LUA_GCCOLLECT, 0 ); - vlc_restorecancel( cancel ); - /* Main loop to handle search requests */ - vlc_mutex_lock( &p_sys->lock ); - mutex_cleanup_push( &p_sys->lock ); - for( ;; ) - { - /* Wait for a request */ - if( !p_sys->i_query ) - { - vlc_cond_wait( &p_sys->cond, &p_sys->lock ); - continue; - } - - /* Execute one query (protected against cancellation) */ - char *psz_query = p_sys->ppsz_query[p_sys->i_query - 1]; - TAB_ERASE(p_sys->i_query, p_sys->ppsz_query, p_sys->i_query - 1); - vlc_mutex_unlock( &p_sys->lock ); + struct sd_query *query; - cancel = vlc_savecancel(); - DoSearch( p_sd, psz_query ); - free( psz_query ); + while( (query = vlc_queue_DequeueKillable( &p_sys->queue, + &p_sys->dead )) != NULL ) + { + /* Execute one query */ + DoSearch( p_sd, query->query ); + free( query ); /* Force garbage collection, because the core will keep the SD * open, but lua will never gc until lua_close(). */ lua_gc( L, LUA_GCCOLLECT, 0 ); - vlc_restorecancel( cancel ); - - vlc_mutex_lock( &p_sys->lock ); } - vlc_cleanup_pop(); - vlc_assert_unreachable(); + return NULL; } /***************************************************************************** @@ -343,10 +320,15 @@ static int Control( services_discovery_t *p_sd, int i_command, va_list args ) case SD_CMD_SEARCH: { const char *psz_query = va_arg( args, const char * ); - vlc_mutex_lock( &p_sys->lock ); - TAB_APPEND( p_sys->i_query, p_sys->ppsz_query, strdup( psz_query ) ); - vlc_cond_signal( &p_sys->cond ); - vlc_mutex_unlock( &p_sys->lock ); + size_t len = strlen(psz_query) + 1; + struct sd_query *query = malloc(sizeof (*query) + len); + + if (unlikely(query == NULL)) + return VLC_ENOMEM; + + query->next = NULL; + memcpy(query->query, psz_query, len); + vlc_queue_Enqueue(&p_sys->queue, query); break; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
