summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorapnadkarni <apnmbx-wits@yahoo.com>2023-10-21 04:14:33 (GMT)
committerapnadkarni <apnmbx-wits@yahoo.com>2023-10-21 04:14:33 (GMT)
commita21682acad5156d66092b97a3072e5ace01234b0 (patch)
treee65c20d38c221cda4a3cfe1ba402ec376b438af3 /generic
parentd5396e3590b3fbcab61454db55688bd81fe1a59d (diff)
downloadtcl-a21682acad5156d66092b97a3072e5ace01234b0.zip
tcl-a21682acad5156d66092b97a3072e5ace01234b0.tar.gz
tcl-a21682acad5156d66092b97a3072e5ace01234b0.tar.bz2
Move zipfs finalization to TclFinalizeFilesystem
Diffstat (limited to 'generic')
-rw-r--r--generic/tclIO.c1
-rw-r--r--generic/tclIOUtil.c1
-rw-r--r--generic/tclZipfs.c58
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();
}