diff --git a/src/apps/debugger/files/FileManager.cpp b/src/apps/debugger/files/FileManager.cpp index 047b809848..0dea7b2de4 100644 --- a/src/apps/debugger/files/FileManager.cpp +++ b/src/apps/debugger/files/FileManager.cpp @@ -185,10 +185,16 @@ private: virtual void LocatableEntryUnused(LocatableEntry* entry) { - fManager->Lock(); + AutoLocker lock(fManager); if (fEntries.Lookup(EntryPath(entry)) == entry) fEntries.Remove(entry); - fManager->Unlock(); + else { + DeadEntryList::Iterator iterator = fDeadEntries.GetIterator(); + while (iterator.HasNext()) { + if (iterator.Next() == entry) + fDeadEntries.Remove(entry); + } + } } bool _LocateDirectory(LocatableDirectory* directory, @@ -285,8 +291,11 @@ private: if (file == NULL) return NULL; - file->AcquireReference(); - return file; + if (file->AcquireReference() == 1) { + fEntries.Remove(file); + fDeadEntries.Insert(file); + } else + return file; } // no such file yet -- create it @@ -452,6 +461,7 @@ private: private: FileManager* fManager; LocatableEntryTable fEntries; + DeadEntryList fDeadEntries; bool fIsLocal; }; diff --git a/src/apps/debugger/files/FileManager.h b/src/apps/debugger/files/FileManager.h index 656ac98ecf..559942152b 100644 --- a/src/apps/debugger/files/FileManager.h +++ b/src/apps/debugger/files/FileManager.h @@ -8,9 +8,11 @@ #include #include +#include #include +class LocatableEntry; class LocatableFile; class SourceFile; @@ -53,6 +55,7 @@ private: struct SourceFileHashDefinition; typedef BOpenHashTable LocatableEntryTable; + typedef DoublyLinkedList DeadEntryList; typedef BOpenHashTable SourceFileTable; friend struct SourceFileEntry;