X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fcache.c;h=89d1a99a6d51f0a798c25fc33b2133097c058f5e;hb=7f12470415d98e9e0ac725f2bb96b5fa74ef27f1;hp=a917a9a2783d470c2878623a0687fb3954779882;hpb=f3adfbd8e84839a96e1ed9a9282c8e797c82ef56;p=vlc diff --git a/src/modules/cache.c b/src/modules/cache.c index a917a9a278..89d1a99a6d 100644 --- a/src/modules/cache.c +++ b/src/modules/cache.c @@ -84,7 +84,7 @@ static int CacheSaveConfig ( module_t *, FILE * ); /* Sub-version number * (only used to avoid breakage in dev version when cache structure changes) */ -#define CACHE_SUBVERSION_NUM 3 +#define CACHE_SUBVERSION_NUM 4 /* Format string for the cache filename */ #define CACHENAME_FORMAT \ @@ -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; @@ -467,7 +467,7 @@ 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" @@ -506,7 +506,15 @@ void CacheSave( vlc_object_t *p_this ) free( psz_cachedir ); msg_Dbg( p_this, "writing plugins cache %s", psz_filename ); - file = utf8_fopen( psz_filename, "wb" ); + char psz_tmpname[sizeof (psz_filename) + 12]; + snprintf (psz_tmpname, sizeof (psz_tmpname), "%s.%"PRIu32, psz_filename, +#ifdef UNDER_CE + (uint32_t)GetCurrentProcessId () +#else + (uint32_t)getpid () +#endif + ); + file = utf8_fopen( psz_tmpname, "wb" ); if (file == NULL) goto error; @@ -537,8 +545,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; @@ -597,13 +605,20 @@ void CacheSave( vlc_object_t *p_this ) /* Fill-up file size */ i_file_size = ftell( file ); fseek( file, 0, SEEK_SET ); - if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1) + if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1 + || fflush (file)) /* flush libc buffers */ goto error; - if (fclose (file) == 0) - return; /* success! */ +#ifndef WIN32 + utf8_rename (psz_tmpname, psz_filename); /* atomically replace old cache */ + fclose (file); +#else + utf8_unlink (psz_filename); + fclose (file); + utf8_rename (psz_tmpname, psz_filename); +#endif + return; /* success! */ - file = NULL; error: msg_Warn (p_this, "could not write plugins cache %s (%m)", psz_filename); @@ -616,7 +631,9 @@ error: static int CacheSaveSubmodule( FILE *file, module_t *p_module ) { - if( p_module->next && CacheSaveSubmodule( file, p_module->next ) ) + if( !p_module ) + return 0; + if( CacheSaveSubmodule( file, p_module->next ) ) goto error; SAVE_STRING( p_module->psz_object_name ); @@ -722,14 +739,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++ ) {