477
478
479
480
481
482
483
484
485
486
487
488
489
490
|
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
|
+
|
* Trash the filesystems cache.
*/
fsRecPtr = tsdPtr->filesystemList;
while (fsRecPtr != NULL) {
tmpFsRecPtr = fsRecPtr->nextPtr;
if (--fsRecPtr->fileRefCount <= 0) {
fsRecPtr->fsPtr = NULL;
ckfree((char *)fsRecPtr);
}
fsRecPtr = tmpFsRecPtr;
}
tsdPtr->initialized = 0;
}
|
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
|
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
|
-
+
+
+
-
+
|
}
}
static void
FsRecacheFilesystemList(void)
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&tclFsDataKey);
FilesystemRecord *fsRecPtr, *tmpFsRecPtr = NULL, *chain = NULL;
FilesystemRecord *fsRecPtr, *tmpFsRecPtr = NULL, *toFree = NULL, *chain = NULL;
/*
* Trash the current cache.
*/
fsRecPtr = tsdPtr->filesystemList;
if (tsdPtr->claims <= 0) {
while (fsRecPtr != NULL) {
tmpFsRecPtr = fsRecPtr->nextPtr;
if (--fsRecPtr->fileRefCount <= 0) {
fsRecPtr->fsPtr = NULL;
fsRecPtr->nextPtr = toFree;
ckfree((char *)fsRecPtr);
toFree = fsRecPtr;
}
fsRecPtr = tmpFsRecPtr;
}
} else {
chain = fsRecPtr;
while (fsRecPtr->nextPtr != NULL) {
fsRecPtr->prevPtr = fsRecPtr->nextPtr;
|
635
636
637
638
639
640
641
642
643
644
645
646
647
648
|
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
|
+
+
+
+
+
+
|
*tmpFsRecPtr = *fsRecPtr;
tmpFsRecPtr->nextPtr = tsdPtr->filesystemList;
tmpFsRecPtr->prevPtr = chain;
chain = NULL;
tsdPtr->filesystemList = tmpFsRecPtr;
fsRecPtr = fsRecPtr->prevPtr;
}
while (toFree) {
FilesystemRecord *next = toFree->nextPtr;
ckfree((char *)toFree);
toFree = next;
}
tsdPtr->filesystemEpoch = theFilesystemEpoch;
Tcl_MutexUnlock(&filesystemMutex);
/*
* Make sure the above gets released on thread exit.
*/
|