diff options
author | apnadkarni <apnmbx-wits@yahoo.com> | 2023-10-21 04:14:33 (GMT) |
---|---|---|
committer | apnadkarni <apnmbx-wits@yahoo.com> | 2023-10-21 04:14:33 (GMT) |
commit | a21682acad5156d66092b97a3072e5ace01234b0 (patch) | |
tree | e65c20d38c221cda4a3cfe1ba402ec376b438af3 /generic | |
parent | d5396e3590b3fbcab61454db55688bd81fe1a59d (diff) | |
download | tcl-a21682acad5156d66092b97a3072e5ace01234b0.zip tcl-a21682acad5156d66092b97a3072e5ace01234b0.tar.gz tcl-a21682acad5156d66092b97a3072e5ace01234b0.tar.bz2 |
Move zipfs finalization to TclFinalizeFilesystem
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclIO.c | 1 | ||||
-rw-r--r-- | generic/tclIOUtil.c | 1 | ||||
-rw-r--r-- | generic/tclZipfs.c | 58 |
3 files changed, 29 insertions, 31 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index d79397b..0d047aa 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -706,7 +706,6 @@ TclFinalizeIOSubsystem(void) TclpFinalizeSockets(); TclpFinalizePipes(); - TclZipfsFinalize(); } /* diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index 2cb22f5..7719f35 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -761,6 +761,7 @@ TclFinalizeFilesystem(void) * needed. */ + TclZipfsFinalize(); fsRecPtr = filesystemList; while (fsRecPtr != NULL) { FilesystemRecord *tmpFsRecPtr = fsRecPtr->nextPtr; diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c index c7a194a..9372079 100644 --- a/generic/tclZipfs.c +++ b/generic/tclZipfs.c @@ -6285,18 +6285,25 @@ ZipfsAppHookFindTclInit( } #endif +/* + *------------------------------------------------------------------------ + * + * TclZipfsFinalize -- + * + * Frees all zipfs resources IRRESPECTIVE of open channels (there should + * not be any!) etc. To be called at process exit time (from + * Tcl_Finalize->TclFinalizeFilesystem) + * + * Results: + * None. + * + * Side effects: + * Frees up archives loaded into memory. + * + *------------------------------------------------------------------------ + */ void TclZipfsFinalize(void) { - if (!TclInExit()) - return; - - /* - * Finalization steps: - * For every mounted archive, if it no longer has any open handles - * clean up the mount and associated zip file entries. - * If there are no more mounted archives, clean up and free the - * ZipFS.fileHash and ZipFS.zipHash tables. - */ WriteLock(); if (!ZipFS.initialized) { Unlock(); @@ -6308,30 +6315,21 @@ void TclZipfsFinalize(void) for (hPtr = Tcl_FirstHashEntry(&ZipFS.zipHash, &zipSearch); hPtr; hPtr = Tcl_NextHashEntry(&zipSearch)) { ZipFile *zf = (ZipFile *) Tcl_GetHashValue(hPtr); - if (zf->numOpen == 0) { - Tcl_DeleteHashEntry(hPtr); - CleanupMount(zf); - ZipFSCloseArchive(NULL, zf); - ckfree(zf); - } + Tcl_DeleteHashEntry(hPtr); + CleanupMount(zf); /* Frees file entries belonging to the archive */ + ZipFSCloseArchive(NULL, zf); + ckfree(zf); } - hPtr = Tcl_FirstHashEntry(&ZipFS.fileHash, &zipSearch); - if (hPtr == NULL) { - hPtr = Tcl_FirstHashEntry(&ZipFS.zipHash, &zipSearch); - if (hPtr == NULL) { - /* Both hash tables empty. Free all resources */ - Tcl_FSUnregister(&zipfsFilesystem); - Tcl_DeleteHashTable(&ZipFS.fileHash); - Tcl_DeleteHashTable(&ZipFS.zipHash); - if (ZipFS.fallbackEntryEncoding) { - ckfree(ZipFS.fallbackEntryEncoding); - ZipFS.fallbackEntryEncoding = NULL; - } - ZipFS.initialized = 0; - } + Tcl_FSUnregister(&zipfsFilesystem); + Tcl_DeleteHashTable(&ZipFS.fileHash); + Tcl_DeleteHashTable(&ZipFS.zipHash); + if (ZipFS.fallbackEntryEncoding) { + ckfree(ZipFS.fallbackEntryEncoding); + ZipFS.fallbackEntryEncoding = NULL; } + ZipFS.initialized = 0; Unlock(); } |