[vlc-commits] modules: map the cache files in memory
Rémi Denis-Courmont
git at videolan.org
Tue Oct 25 21:55:08 CEST 2016
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Oct 25 20:48:30 2016 +0300| [f16b12f694d62a21fab092745f3f0aa0bec82e6d] | committer: Rémi Denis-Courmont
modules: map the cache files in memory
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f16b12f694d62a21fab092745f3f0aa0bec82e6d
---
src/modules/bank.c | 11 ++++++--
src/modules/cache.c | 76 ++++++++++++++++++++++++++++-----------------------
src/modules/modules.h | 2 +-
3 files changed, 52 insertions(+), 37 deletions(-)
diff --git a/src/modules/bank.c b/src/modules/bank.c
index a310b40..3668aa9 100644
--- a/src/modules/bank.c
+++ b/src/modules/bank.c
@@ -41,6 +41,7 @@
#include <vlc_plugin.h>
#include <vlc_modules.h>
#include <vlc_fs.h>
+#include <vlc_block.h>
#include "libvlc.h"
#include "config/configuration.h"
#include "modules/modules.h"
@@ -49,8 +50,9 @@ static struct
{
vlc_mutex_t lock;
module_t *head;
+ block_t *caches;
unsigned usage;
-} modules = { VLC_STATIC_MUTEX, NULL, 0 };
+} modules = { VLC_STATIC_MUTEX, NULL, NULL, 0 };
static void module_StoreBank (module_t *module)
{
@@ -321,7 +323,7 @@ static void AllocatePluginPath (vlc_object_t *p_this, const char *path,
switch( mode )
{
case CACHE_USE:
- count = CacheLoad( p_this, path, &cache );
+ count = CacheLoad(p_this, path, &cache, &modules.caches);
break;
case CACHE_RESET:
CacheDelete( p_this, path );
@@ -460,6 +462,7 @@ void module_InitBank (void)
void module_EndBank (bool b_plugins)
{
module_t *head = NULL;
+ block_t *caches = NULL;
/* If plugins were _not_ loaded, then the caller still has the bank lock
* from module_InitBank(). */
@@ -473,7 +476,9 @@ void module_EndBank (bool b_plugins)
{
config_UnsortConfig ();
head = modules.head;
+ caches = modules.caches;
modules.head = NULL;
+ modules.caches = NULL;
}
vlc_mutex_unlock (&modules.lock);
@@ -491,6 +496,8 @@ void module_EndBank (bool b_plugins)
#endif
vlc_module_destroy (module);
}
+
+ block_ChainRelease(caches);
}
#undef module_LoadPlugins
diff --git a/src/modules/cache.c b/src/modules/cache.c
index 5c032f8..cbfa8e5 100644
--- a/src/modules/cache.c
+++ b/src/modules/cache.c
@@ -37,6 +37,7 @@
#include <assert.h>
#include <vlc_common.h>
+#include <vlc_block.h>
#include "libvlc.h"
#include <vlc_plugin.h>
@@ -76,12 +77,18 @@ void CacheDelete( vlc_object_t *obj, const char *dir )
free( path );
}
-static int vlc_cache_load_immediate(void *out, FILE *in, size_t size)
+static int vlc_cache_load_immediate(void *out, block_t *in, size_t size)
{
- return fread(out, sizeof (char), size, in) == size ? 0 : -1;
+ if (in->i_buffer < size)
+ return -1;
+
+ memcpy(out, in->p_buffer, size);
+ in->p_buffer += size;
+ in->i_buffer -= size;
+ return 0;
}
-static int vlc_cache_load_bool(bool *out, FILE *in)
+static int vlc_cache_load_bool(bool *out, block_t *in)
{
unsigned char b;
@@ -92,7 +99,7 @@ static int vlc_cache_load_bool(bool *out, FILE *in)
return 0;
}
-static int vlc_cache_load_string(char **restrict p, FILE *file)
+static int vlc_cache_load_string(char **restrict p, block_t *file)
{
uint16_t size;
@@ -135,7 +142,7 @@ static int vlc_cache_load_string(char **restrict p, FILE *file)
if (vlc_cache_load_string(&(a), file)) \
goto error
-static int CacheLoadConfig (module_config_t *cfg, FILE *file)
+static int CacheLoadConfig(module_config_t *cfg, block_t *file)
{
LOAD_IMMEDIATE (cfg->i_type);
LOAD_IMMEDIATE (cfg->i_short);
@@ -198,7 +205,7 @@ error:
return -1; /* FIXME: leaks */
}
-static int CacheLoadModuleConfig (module_t *module, FILE *file)
+static int CacheLoadModuleConfig(module_t *module, block_t *file)
{
uint16_t lines;
@@ -230,7 +237,7 @@ error:
return -1; /* FIXME: leaks */
}
-static module_t *CacheLoadModule (FILE *file)
+static module_t *CacheLoadModule(block_t *file)
{
module_t *module = vlc_module_create (NULL);
if (unlikely(module == NULL))
@@ -304,10 +311,10 @@ error:
* actually load the dynamically loadable module.
* This allows us to only fully load plugins when they are actually used.
*/
-size_t CacheLoad( vlc_object_t *p_this, const char *dir, module_cache_t **r )
+size_t CacheLoad(vlc_object_t *p_this, const char *dir, module_cache_t **r,
+ block_t **backingp)
{
char *psz_filename;
- FILE *file;
assert( dir != NULL );
@@ -317,36 +324,34 @@ size_t CacheLoad( vlc_object_t *p_this, const char *dir, module_cache_t **r )
msg_Dbg( p_this, "loading plugins cache file %s", psz_filename );
- file = vlc_fopen( psz_filename, "rb" );
- if( !file )
- {
- msg_Warn( p_this, "cannot read %s: %s", psz_filename,
- vlc_strerror_c(errno) );
- free( psz_filename );
+ block_t *file = block_FilePath(psz_filename);
+ if (file == NULL)
+ msg_Warn(p_this, "cannot read %s: %s", psz_filename,
+ vlc_strerror_c(errno));
+ free(psz_filename);
+ if (file == NULL)
return 0;
- }
- free( psz_filename );
/* Check the file is a plugins cache */
- char cachestring[sizeof (CACHE_STRING) - 1];
+ char cachestr[sizeof (CACHE_STRING) - 1];
- if (vlc_cache_load_immediate(cachestring, file, sizeof (cachestring))
- || memcmp(cachestring, CACHE_STRING, sizeof (cachestring)))
+ if (vlc_cache_load_immediate(cachestr, file, sizeof (cachestr))
+ || memcmp(cachestr, CACHE_STRING, sizeof (cachestr)))
{
msg_Warn( p_this, "This doesn't look like a valid plugins cache" );
- fclose( file );
+ block_Release(file);
return 0;
}
#ifdef DISTRO_VERSION
/* Check for distribution specific version */
- char distrostring[sizeof (DISTRO_VERSION) - 1];
+ char distrostr[sizeof (DISTRO_VERSION) - 1];
- if (vlc_cache_load_immediate(distrostring, file, sizeof (distrostring))
- || memcmp(distrostring, DISTRO_VERSION, sizeof (distrostring)))
+ if (vlc_cache_load_immediate(distrostr, file, sizeof (distrostr))
+ || memcmp(distrostr, DISTRO_VERSION, sizeof (distrostr)))
{
msg_Warn( p_this, "This doesn't look like a valid plugins cache" );
- fclose( file );
+ block_Release(file);
return 0;
}
#endif
@@ -359,17 +364,22 @@ size_t CacheLoad( vlc_object_t *p_this, const char *dir, module_cache_t **r )
{
msg_Warn( p_this, "This doesn't look like a valid plugins cache "
"(corrupted header)" );
- fclose( file );
+ block_Release(file);
return 0;
}
/* Check header marker */
if (vlc_cache_load_immediate(&marker, file, sizeof (marker))
- || marker != (ftell(file) - sizeof (marker)))
+#ifdef DISTRO_VERSION
+ || marker != (sizeof (cachestr) + sizeof (distrostr) + sizeof (marker))
+#else
+ || marker != (sizeof (cachestr) + sizeof (marker))
+#endif
+ )
{
msg_Warn( p_this, "This doesn't look like a valid plugins cache "
"(corrupted header)" );
- fclose( file );
+ block_Release(file);
return 0;
}
@@ -382,7 +392,7 @@ size_t CacheLoad( vlc_object_t *p_this, const char *dir, module_cache_t **r )
module_t *module = CacheLoadModule (file);
if (module == NULL)
{
- if (feof (file))
+ if (file->i_buffer == 0)
break;
goto error;
}
@@ -402,19 +412,17 @@ size_t CacheLoad( vlc_object_t *p_this, const char *dir, module_cache_t **r )
/* TODO: deal with errors */
}
- fclose( file );
-
+ file->p_next = *backingp;
+ *backingp = file;
*r = cache;
return count;
error:
free( path );
- if (ferror (file))
- msg_Err(p_this, "plugins cache read error: %s", vlc_strerror_c(errno));
msg_Warn( p_this, "plugins cache not loaded (corrupted)" );
/* TODO: cleanup */
- fclose( file );
+ block_Release(file);
return 0;
}
diff --git a/src/modules/modules.h b/src/modules/modules.h
index e38e952..89e66af 100644
--- a/src/modules/modules.h
+++ b/src/modules/modules.h
@@ -122,7 +122,7 @@ void module_Unload (module_handle_t);
/* Plugins cache */
void CacheMerge (vlc_object_t *, module_t *, module_t *);
void CacheDelete(vlc_object_t *, const char *);
-size_t CacheLoad (vlc_object_t *, const char *, module_cache_t **);
+size_t CacheLoad(vlc_object_t *, const char *, module_cache_t **, block_t **);
struct stat;
More information about the vlc-commits
mailing list