X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fcache.c;h=a43a6c37108c4491ebde9e2d7b1fbb0119d46ccb;hb=493b65493f4a8ccc830597e7ab08950961c2380e;hp=570ad8c9ec3cf189c18a4412831cfe50c0cad9cd;hpb=631991de20a3847b6af56ee48a467f75a13df751;p=vlc diff --git a/src/modules/cache.c b/src/modules/cache.c index 570ad8c9ec..a43a6c3710 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,10 @@ 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, + (uint32_t)getpid ()); + file = utf8_fopen( psz_tmpname, "wb" ); if (file == NULL) goto error; @@ -537,8 +540,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 +600,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 + rename (psz_tmpname, psz_filename); /* atomically replace old cache */ + fclose (file); +#else + utf8_unlink (psz_filename); + fclose (file); + rename (psz_tmpname, psz_filename); +#endif + return; /* success! */ - file = NULL; error: msg_Warn (p_this, "could not write plugins cache %s (%m)", psz_filename); @@ -724,14 +734,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++ ) {