Sfoglia il codice sorgente

7z: do global initialization once without risking a race condition.

Ryan C. Gordon 8 anni fa
parent
commit
dd68246737
3 ha cambiato i file con 19 aggiunte e 8 eliminazioni
  1. 1 0
      src/physfs.c
  2. 13 8
      src/physfs_archiver_7z.c
  3. 5 0
      src/physfs_internal.h

+ 1 - 0
src/physfs.c

@@ -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

+ 13 - 8
src/physfs_archiver_7z.c

@@ -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,

+ 5 - 0
src/physfs_internal.h

@@ -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