X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fmodules.c;h=cdd26307aab60cf005d9ce4005ff2952c4b1ec61;hb=a3bcd2df4f6ac2825d5b02e407d3258800a8b899;hp=972d23effaa2ec0d566a0599b7a40797cd55dc71;hpb=372698b89ac009a080d3540a66316913aeb09b87;p=vlc diff --git a/src/modules/modules.c b/src/modules/modules.c index 972d23effa..cdd26307aa 100644 --- a/src/modules/modules.c +++ b/src/modules/modules.c @@ -30,6 +30,7 @@ #include #include +#include #include "libvlc.h" #include /* free(), strtol() */ @@ -80,6 +81,7 @@ #include "vlc_charset.h" #include "vlc_arrays.h" +#include #include "modules/modules.h" @@ -195,25 +197,15 @@ void module_EndBank( vlc_object_t *p_this, bool b_plugins ) p_bank->pp_loaded_cache[p_bank->i_loaded_cache]->p_module ); free( p_bank->pp_loaded_cache[p_bank->i_loaded_cache]->psz_file ); free( p_bank->pp_loaded_cache[p_bank->i_loaded_cache] ); - p_bank->pp_loaded_cache[p_bank->i_loaded_cache] = NULL; } } - if( p_bank->pp_loaded_cache ) - { - free( p_bank->pp_loaded_cache ); - p_bank->pp_loaded_cache = NULL; - } + free( p_bank->pp_loaded_cache ); while( p_bank->i_cache-- ) { free( p_bank->pp_cache[p_bank->i_cache]->psz_file ); free( p_bank->pp_cache[p_bank->i_cache] ); - p_bank->pp_cache[p_bank->i_cache] = NULL; - } - if( p_bank->pp_cache ) - { - free( p_bank->pp_cache ); - p_bank->pp_cache = NULL; } + free( p_bank->pp_cache ); #endif while( p_bank->head != NULL ) @@ -408,7 +400,8 @@ static int modulecmp (const void *a, const void *b) * \param p_this the vlc object * \param psz_capability list of capabilities needed * \param psz_name name of the module asked - * \param b_strict TRUE yto use the strict mode + * \param b_strict if true, do not fallback to plugin with a different name + * but the same capability * \return the module or NULL in case of a failure */ module_t * __module_need( vlc_object_t *p_this, const char *psz_capability, @@ -444,16 +437,13 @@ module_t * __module_need( vlc_object_t *p_this, const char *psz_capability, } i_shortcuts++; - psz_shortcuts = psz_last_shortcut = strdup( psz_name ); + psz_parser = psz_shortcuts = psz_last_shortcut = strdup( psz_name ); - for( psz_parser = psz_shortcuts; *psz_parser; psz_parser++ ) + while( ( psz_parser = strchr( psz_parser, ',' ) ) ) { - if( *psz_parser == ',' ) - { - *psz_parser = '\0'; - i_shortcuts++; - psz_last_shortcut = psz_parser + 1; - } + *psz_parser = '\0'; + i_shortcuts++; + psz_last_shortcut = ++psz_parser; } /* Check if the user wants to override the "strict" mode */ @@ -482,7 +472,7 @@ module_t * __module_need( vlc_object_t *p_this, const char *psz_capability, count = 0; for (size_t i = 0; (p_module = p_all[i]) != NULL; i++) { - bool b_shortcut_bonus = false; + int i_shortcut_bonus = 0; /* Test that this module can do what we need */ if( !module_provides( p_module, psz_capability ) ) @@ -509,7 +499,7 @@ module_t * __module_need( vlc_object_t *p_this, const char *psz_capability, /* Found it */ if( c && c[1] ) psz_alias = c+1; - b_shortcut_bonus = true; + i_shortcut_bonus = i_short * 10000; goto found_shortcut; } } @@ -532,10 +522,8 @@ module_t * __module_need( vlc_object_t *p_this, const char *psz_capability, found_shortcut: /* Store this new module */ p_list[count].p_module = module_hold (p_module); - p_list[count].i_score = p_module->i_score; - if( b_shortcut_bonus ) - p_list[count].i_score += 10000; - p_list[count].b_force = b_shortcut_bonus && b_strict; + p_list[count].i_score = p_module->i_score + i_shortcut_bonus; + p_list[count].b_force = i_shortcut_bonus && b_strict; count++; } @@ -560,11 +548,14 @@ found_shortcut: { module_t *p_new_module = AllocatePlugin( p_this, p_real->psz_filename ); - if( p_new_module ) - { - CacheMerge( p_this, p_real, p_new_module ); - DeleteModule( p_module_bank, p_new_module ); + if( p_new_module == NULL ) + { /* Corrupted module */ + msg_Err( p_this, "possibly corrupt module cache" ); + module_release( p_cand ); + continue; } + CacheMerge( p_this, p_real, p_new_module ); + DeleteModule( p_module_bank, p_new_module ); } #endif @@ -602,6 +593,8 @@ found_shortcut: { msg_Dbg( p_this, "using %s module \"%s\"", psz_capability, p_module->psz_object_name ); + vlc_object_set_name( p_this, psz_alias ? psz_alias + : p_module->psz_object_name ); } else if( count == 0 ) { @@ -739,80 +732,6 @@ out: return module; } -/** - * GetModuleNamesForCapability - * - * Return a NULL terminated array with the names of the modules - * that have a certain capability. - * Free after uses both the string and the table. - * \param psz_capability the capability asked - * \param pppsz_longname an pointer to an array of string to contain - the long names of the modules. If set to NULL the function don't use it. - * \return the NULL terminated array - */ -char ** module_GetModulesNamesForCapability( const char *psz_capability, - char ***pppsz_longname ) -{ - size_t count = 0; - char **psz_ret; - - module_t **list = module_list_get (NULL); - - /* Proceed in two passes: count the number of modules first */ - for (size_t i = 0; list[i]; i++) - { - module_t *p_module = list[i]; - const char *psz_module_capability = p_module->psz_capability; - - if( psz_module_capability - && !strcmp( psz_module_capability, psz_capability ) ) - count++; - } - - /* Then get the names */ - psz_ret = malloc( sizeof(char*) * (count+1) ); - if( pppsz_longname ) - *pppsz_longname = malloc( sizeof(char*) * (count+1) ); - if( !psz_ret || ( pppsz_longname && *pppsz_longname == NULL ) ) - { - free( psz_ret ); - if( pppsz_longname ) - { - free( *pppsz_longname ); - *pppsz_longname = NULL; - } - module_list_free (list); - return NULL; - } - - for (size_t i = 0, j = 0; list[i]; i++) - { - module_t *p_module = list[i]; - const char *psz_module_capability = p_module->psz_capability; - - if( psz_module_capability - && !strcmp( psz_module_capability, psz_capability ) ) - { - /* Explicit hack: Use the last shortcut. It _should_ be - * different from the object name, at least if the object - * contains multiple submodules with the same capability. */ - unsigned k = 0; - while( p_module->pp_shortcuts[k] != NULL ) - k++; - assert( k > 0); /* pp_shortcuts[0] is always set */ - psz_ret[j] = strdup( p_module->pp_shortcuts[k - 1] ); - if( pppsz_longname ) - (*pppsz_longname)[j] = strdup( module_get_name( p_module, true ) ); - j++; - } - } - psz_ret[count] = NULL; - - module_list_free (list); - - return psz_ret; -} - /** * Get the configuration of a module * @@ -1081,7 +1000,7 @@ static int AllocatePluginFile( vlc_object_t * p_this, module_bank_t *p_bank, /* Add entry to cache */ module_cache_t **pp_cache = p_bank->pp_cache; - pp_cache = realloc( pp_cache, (p_bank->i_cache + 1) * sizeof(void *) ); + pp_cache = realloc_or_free( pp_cache, (p_bank->i_cache + 1) * sizeof(void *) ); if( pp_cache == NULL ) return -1; pp_cache[p_bank->i_cache] = malloc( sizeof(module_cache_t) );