7z: do global initialization once without risking a race condition.
This commit is contained in:
parent
1364f6a915
commit
dd68246737
|
@ -1143,6 +1143,7 @@ static int initStaticArchivers(void)
|
||||||
REGISTER_STATIC_ARCHIVER(ZIP);
|
REGISTER_STATIC_ARCHIVER(ZIP);
|
||||||
#endif
|
#endif
|
||||||
#if PHYSFS_SUPPORTS_7Z
|
#if PHYSFS_SUPPORTS_7Z
|
||||||
|
SZIP_global_init();
|
||||||
REGISTER_STATIC_ARCHIVER(7Z);
|
REGISTER_STATIC_ARCHIVER(7Z);
|
||||||
#endif
|
#endif
|
||||||
#if PHYSFS_SUPPORTS_GRP
|
#if PHYSFS_SUPPORTS_GRP
|
||||||
|
|
|
@ -217,14 +217,6 @@ static void *SZIP_openArchive(PHYSFS_Io *io, const char *name, int forWriting)
|
||||||
SZIPinfo *info = NULL;
|
SZIPinfo *info = NULL;
|
||||||
SRes rc;
|
SRes rc;
|
||||||
|
|
||||||
/* !!! FIXME-3.0: this is a race condition; we need a global init method that gets called when registering new archivers. */
|
|
||||||
static int generatedTable = 0;
|
|
||||||
if (!generatedTable)
|
|
||||||
{
|
|
||||||
generatedTable = 1;
|
|
||||||
CrcGenerateTable();
|
|
||||||
} /* if */
|
|
||||||
|
|
||||||
BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);
|
BAIL_IF(forWriting, PHYSFS_ERR_READ_ONLY, NULL);
|
||||||
|
|
||||||
info = (SZIPinfo *) allocator.Malloc(sizeof (SZIPinfo));
|
info = (SZIPinfo *) allocator.Malloc(sizeof (SZIPinfo));
|
||||||
|
@ -387,6 +379,19 @@ static int SZIP_stat(void *opaque, const char *path, PHYSFS_Stat *stat)
|
||||||
} /* SZIP_stat */
|
} /* SZIP_stat */
|
||||||
|
|
||||||
|
|
||||||
|
void SZIP_global_init(void)
|
||||||
|
{
|
||||||
|
/* this just needs to calculate some things, so it only ever
|
||||||
|
has to run once, even after a deinit. */
|
||||||
|
static int generatedTable = 0;
|
||||||
|
if (!generatedTable)
|
||||||
|
{
|
||||||
|
generatedTable = 1;
|
||||||
|
CrcGenerateTable();
|
||||||
|
} /* if */
|
||||||
|
} /* SZIP_global_init */
|
||||||
|
|
||||||
|
|
||||||
const PHYSFS_Archiver __PHYSFS_Archiver_7Z =
|
const PHYSFS_Archiver __PHYSFS_Archiver_7Z =
|
||||||
{
|
{
|
||||||
CURRENT_PHYSFS_ARCHIVER_API_VERSION,
|
CURRENT_PHYSFS_ARCHIVER_API_VERSION,
|
||||||
|
|
|
@ -193,6 +193,11 @@ void __PHYSFS_smallFree(void *ptr);
|
||||||
#define PHYSFS_SUPPORTS_VDF 1
|
#define PHYSFS_SUPPORTS_VDF 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if PHYSFS_SUPPORTS_7Z
|
||||||
|
/* 7zip support needs a global init function called at startup (no deinit). */
|
||||||
|
extern void SZIP_global_init(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The latest supported PHYSFS_Io::version value. */
|
/* The latest supported PHYSFS_Io::version value. */
|
||||||
#define CURRENT_PHYSFS_IO_API_VERSION 0
|
#define CURRENT_PHYSFS_IO_API_VERSION 0
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue