From c1ae7caf60e04c65139553fa42eb6ba5ee51fa4d Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 11 Jun 2011 01:00:25 +0000 Subject: [PATCH] * Modify LocatableEntry and Domain to use a similar strategy as TeamMemoryBlockManager to avert a race condition where an entry could be acquired while another thread was about to delete it. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42093 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/debugger/files/FileManager.cpp | 18 ++++++++++++++---- src/apps/debugger/files/FileManager.h | 3 +++ 2 files changed, 17 insertions(+), 4 deletions(-) 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;