X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fcache.c;h=e4002f456e21c98f92fea318aefb0073f80de780;hb=7fbf82b3d0ead1fac49eab9552862ef4bc2e9c02;hp=a4797ecdb1223db76b7a10c77db6f8139c39cad2;hpb=118e8a5170960aa06522b8e8c984a14ba0cedd94;p=vlc diff --git a/src/modules/cache.c b/src/modules/cache.c index a4797ecdb1..e4002f456e 100644 --- a/src/modules/cache.c +++ b/src/modules/cache.c @@ -102,7 +102,7 @@ static int CacheSaveConfig ( module_t *, FILE * ); * actually load the dynamically loadable module. * This allows us to only fully load plugins when they are actually used. *****************************************************************************/ -void CacheLoad( vlc_object_t *p_this ) +void CacheLoad( vlc_object_t *p_this, module_bank_t *p_bank, bool b_delete ) { char *psz_filename, *psz_cachedir = config_GetCacheDir(); FILE *file; @@ -127,7 +127,7 @@ void CacheLoad( vlc_object_t *p_this ) } free( psz_cachedir ); - if( p_module_bank->b_cache_delete ) + if( b_delete ) { #if !defined( UNDER_CE ) unlink( psz_filename ); @@ -230,7 +230,7 @@ void CacheLoad( vlc_object_t *p_this ) return; } - p_module_bank->i_loaded_cache = 0; + p_bank->i_loaded_cache = 0; if (fread( &i_cache, 1, sizeof(i_cache), file ) != sizeof(i_cache) ) { msg_Warn( p_this, "This doesn't look like a valid plugins cache " @@ -240,7 +240,7 @@ void CacheLoad( vlc_object_t *p_this ) } if( i_cache ) - pp_cache = p_module_bank->pp_loaded_cache = + pp_cache = p_bank->pp_loaded_cache = malloc( i_cache * sizeof(void *) ); #define LOAD_IMMEDIATE(a) \ @@ -271,7 +271,7 @@ void CacheLoad( vlc_object_t *p_this ) int i_submodules; pp_cache[i] = malloc( sizeof(module_cache_t) ); - p_module_bank->i_loaded_cache++; + p_bank->i_loaded_cache++; /* Load common info */ LOAD_STRING( pp_cache[i]->psz_file ); @@ -337,7 +337,7 @@ void CacheLoad( vlc_object_t *p_this ) msg_Warn( p_this, "plugins cache not loaded (corrupted)" ); /* TODO: cleanup */ - p_module_bank->i_loaded_cache = 0; + p_bank->i_loaded_cache = 0; fclose( file ); return; @@ -398,7 +398,7 @@ static int CacheLoadConfig( module_t *p_module, FILE *file ) p_module->p_config[i].b_dirty = false; - p_module->p_config[i].p_lock = &(vlc_internals(p_module)->lock); + p_module->p_config[i].p_lock = &p_module->lock; if( p_module->p_config[i].i_list ) { @@ -462,10 +462,12 @@ static int CacheLoadConfig( module_t *p_module, FILE *file ) return VLC_EGENERIC; } +static int CacheSaveSubmodule( FILE *file, module_t *p_module ); + /***************************************************************************** * SavePluginsCache: saves the plugins cache to a file *****************************************************************************/ -void CacheSave( vlc_object_t *p_this ) +void CacheSave( vlc_object_t *p_this, module_bank_t *p_bank ) { static char const psz_tag[] = "Signature: 8a477f597d28d172789f06886806bc55\r\n" @@ -535,8 +537,8 @@ void CacheSave( vlc_object_t *p_this ) if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1) goto error; - i_cache = p_module_bank->i_cache; - pp_cache = p_module_bank->pp_cache; + i_cache = p_bank->i_cache; + pp_cache = p_bank->pp_cache; if (fwrite( &i_cache, sizeof (i_cache), 1, file) != 1) goto error; @@ -586,29 +588,10 @@ void CacheSave( vlc_object_t *p_this ) SAVE_STRING( pp_cache[i]->p_module->psz_filename ); - i_submodule = vlc_internals( pp_cache[i]->p_module )->i_children; + i_submodule = pp_cache[i]->p_module->submodule_count; SAVE_IMMEDIATE( i_submodule ); - for( i_submodule = 0; - i_submodule < (unsigned)vlc_internals( pp_cache[i]->p_module)->i_children; - i_submodule++ ) - { - module_t *p_module = - (module_t *)vlc_internals( pp_cache[i]->p_module )->pp_children[i_submodule]; - - SAVE_STRING( p_module->psz_object_name ); - SAVE_STRING( p_module->psz_shortname ); - SAVE_STRING( p_module->psz_longname ); - SAVE_STRING( p_module->psz_help ); - for( j = 0; j < MODULE_SHORTCUT_MAX; j++ ) - { - SAVE_STRING( p_module->pp_shortcuts[j] ); // FIX - } - SAVE_STRING( p_module->psz_capability ); - SAVE_IMMEDIATE( p_module->i_score ); - SAVE_IMMEDIATE( p_module->i_cpu ); - SAVE_IMMEDIATE( p_module->b_unloadable ); - SAVE_IMMEDIATE( p_module->b_reentrant ); - } + if( CacheSaveSubmodule( file, pp_cache[i]->p_module->submodule ) ) + goto error; } /* Fill-up file size */ @@ -631,6 +614,32 @@ error: } } +static int CacheSaveSubmodule( FILE *file, module_t *p_module ) +{ + if( !p_module ) + return 0; + if( CacheSaveSubmodule( file, p_module->next ) ) + goto error; + + SAVE_STRING( p_module->psz_object_name ); + SAVE_STRING( p_module->psz_shortname ); + SAVE_STRING( p_module->psz_longname ); + SAVE_STRING( p_module->psz_help ); + for( unsigned j = 0; j < MODULE_SHORTCUT_MAX; j++ ) + SAVE_STRING( p_module->pp_shortcuts[j] ); // FIXME + + SAVE_STRING( p_module->psz_capability ); + SAVE_IMMEDIATE( p_module->i_score ); + SAVE_IMMEDIATE( p_module->i_cpu ); + SAVE_IMMEDIATE( p_module->b_unloadable ); + SAVE_IMMEDIATE( p_module->b_reentrant ); + return 0; + +error: + return -1; +} + + static int CacheSaveConfig( module_t *p_module, FILE *file ) { uint32_t i_lines = p_module->confsize; @@ -689,19 +698,23 @@ error: *****************************************************************************/ void CacheMerge( vlc_object_t *p_this, module_t *p_cache, module_t *p_module ) { - int i_submodule; (void)p_this; p_cache->pf_activate = p_module->pf_activate; p_cache->pf_deactivate = p_module->pf_deactivate; p_cache->handle = p_module->handle; - for( i_submodule = 0; i_submodule < vlc_internals( p_module )->i_children; i_submodule++ ) + /* FIXME: This looks too simplistic an algorithm to me. What if the module + * file was altered such that the number of order of submodules was + * altered... after VLC started -- Courmisch, 09/2008 */ + module_t *p_child = p_module->submodule, + *p_cchild = p_cache->submodule; + while( p_child && p_cchild ) { - module_t *p_child = (module_t*)vlc_internals( p_module )->pp_children[i_submodule]; - module_t *p_cchild = (module_t*)vlc_internals( p_cache )->pp_children[i_submodule]; p_cchild->pf_activate = p_child->pf_activate; p_cchild->pf_deactivate = p_child->pf_deactivate; + p_child = p_child->next; + p_cchild = p_cchild->next; } p_cache->b_loaded = true; @@ -711,14 +724,14 @@ void CacheMerge( vlc_object_t *p_this, module_t *p_cache, module_t *p_module ) /***************************************************************************** * CacheFind: finds the cache entry corresponding to a file *****************************************************************************/ -module_cache_t *CacheFind( const char *psz_file, +module_cache_t *CacheFind( module_bank_t *p_bank, const char *psz_file, int64_t i_time, int64_t i_size ) { module_cache_t **pp_cache; int i_cache, i; - pp_cache = p_module_bank->pp_loaded_cache; - i_cache = p_module_bank->i_loaded_cache; + pp_cache = p_bank->pp_loaded_cache; + i_cache = p_bank->i_loaded_cache; for( i = 0; i < i_cache; i++ ) {