[haiku-commits] r42090 - in haiku/trunk/src/apps/debugger: . model

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 11 Jun 2011 00:20:40 +0200 (CEST)

Author: anevilyak
Date: 2011-06-11 00:20:39 +0200 (Sat, 11 Jun 2011)
New Revision: 42090
Changeset: https://dev.haiku-os.org/changeset/42090

Modified:
   haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.cpp
   haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.h
   haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.cpp
   haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.h
Log:
* Various cleanups prompted by previous commit review:
        - Introduce TeamMemoryBlockOwner to act as an interface for blocks to
          remove themselves from the manager when they expire. Consequently 
remove
          TeamMemoryBlock's direct reference to the block manager.

        - Simplify GetBlock() to remove unnecessary recursion.

        - Store dead blocks in a doubly linked list instead of another hash 
table.

        - Minor style fixes.



Modified: haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.cpp    2011-06-10 
17:35:46 UTC (rev 42089)
+++ haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.cpp    2011-06-10 
22:20:39 UTC (rev 42090)
@@ -44,12 +44,10 @@
                Key(block->BaseAddress()),
                block(block)
        {
-               block->AcquireReference();
        }
 
        ~MemoryBlockEntry()
        {
-               block->ReleaseReference();
        }
 };
 
@@ -109,16 +107,11 @@
        if (result != B_OK)
                return result;
 
-       fDeadBlocks = new(std::nothrow) MemoryBlockTable();
+       fDeadBlocks = new(std::nothrow) DeadBlockTable();
        if (fDeadBlocks == NULL)
                return B_NO_MEMORY;
-       ObjectDeleter<MemoryBlockTable> deadDeleter(fDeadBlocks);
-       result = fDeadBlocks->Init();
-       if (result != B_OK)
-               return result;
 
        activeDeleter.Detach();
-       deadDeleter.Detach();
 
        return B_OK;
 }
@@ -131,29 +124,34 @@
 
        address &= ~B_PAGE_SIZE - 1;
        MemoryBlockEntry* entry = fActiveBlocks->Lookup(address);
-       if (entry == NULL) {
-               TeamMemoryBlock* block = new(std::nothrow) 
TeamMemoryBlock(address,
-                       this);
-               if (block == NULL)
-                       return NULL;
+       if (entry != NULL) {
+               if (entry->block->AcquireReference() != 0)
+                       return entry->block;
 
-               entry = new(std::nothrow) MemoryBlockEntry(block);
-               if (entry == NULL) {
-                       delete block;
-                       return NULL;
-               }
-
-               fActiveBlocks->Insert(entry);
-       }
-
-       int32 refCount = entry->block->AcquireReference();
-       if (refCount == 0) {
                // this block already had its last reference released,
-               // move it to the dead list and retrieve a new one instead.
+               // move it to the dead list and create a new one instead.
                _MarkDeadBlock(address);
-               return GetMemoryBlock(address);
        }
 
+       TeamMemoryBlockOwner* owner = new(std::nothrow) 
TeamMemoryBlockOwner(this);
+       if (owner == NULL)
+               return NULL;
+       ObjectDeleter<TeamMemoryBlockOwner> ownerDeleter(owner);
+
+       TeamMemoryBlock* block = new(std::nothrow) TeamMemoryBlock(address,
+               owner);
+       if (block == NULL)
+               return NULL;
+       ObjectDeleter<TeamMemoryBlock> blockDeleter(block);
+
+       entry = new(std::nothrow) MemoryBlockEntry(block);
+       if (entry == NULL)
+               return NULL;
+
+       ownerDeleter.Detach();
+       blockDeleter.Detach();
+       fActiveBlocks->Insert(entry);
+
        return entry->block;
 }
 
@@ -179,11 +177,11 @@
 void
 TeamMemoryBlockManager::_MarkDeadBlock(target_addr_t address)
 {
-       AutoLocker<BLocker> lock(fLock);
        MemoryBlockEntry* entry = fActiveBlocks->Lookup(address);
        if (entry != NULL) {
                fActiveBlocks->Remove(entry);
-               fDeadBlocks->Insert(entry);
+               fDeadBlocks->Insert(entry->block);
+               delete entry;
        }
 }
 
@@ -199,10 +197,31 @@
                return;
        }
 
-       entry = fDeadBlocks->Lookup(address);
-       if (entry != NULL) {
-               fDeadBlocks->Remove(entry);
-               delete entry;
+       DeadBlockTable::Iterator iterator = fDeadBlocks->GetIterator();
+       while (iterator.HasNext()) {
+               TeamMemoryBlock* block = iterator.Next();
+               if (block->BaseAddress() == address) {
+                       fDeadBlocks->Remove(block);
+                       break;
+               }
        }
 }
 
+
+TeamMemoryBlockOwner::TeamMemoryBlockOwner(TeamMemoryBlockManager* manager)
+       :
+       fBlockManager(manager)
+{
+}
+
+
+TeamMemoryBlockOwner::~TeamMemoryBlockOwner()
+{
+}
+
+
+void
+TeamMemoryBlockOwner::RemoveBlock(TeamMemoryBlock* block)
+{
+       fBlockManager->_RemoveBlock(block->BaseAddress());
+}

Modified: haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.h
===================================================================
--- haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.h      2011-06-10 
17:35:46 UTC (rev 42089)
+++ haiku/trunk/src/apps/debugger/TeamMemoryBlockManager.h      2011-06-10 
22:20:39 UTC (rev 42090)
@@ -8,10 +8,12 @@
 
 #include <Locker.h>
 #include <Referenceable.h>
+#include <util/DoublyLinkedList.h>
 #include <util/OpenHashTable.h>
 
 #include "Types.h"
 
+
 struct MemoryBlockHashDefinition;
 class TeamMemoryBlock;
 
@@ -31,6 +33,7 @@
                struct MemoryBlockEntry;
                struct MemoryBlockHashDefinition;
                typedef BOpenHashTable<MemoryBlockHashDefinition> 
MemoryBlockTable;
+               typedef DoublyLinkedList<TeamMemoryBlock> DeadBlockTable;
 
 private:
                void                                    _Cleanup();
@@ -38,13 +41,27 @@
                void                                    
_RemoveBlock(target_addr_t address);
 
 private:
-               friend class TeamMemoryBlock;
+               friend class TeamMemoryBlockOwner;
 
 private:
                BLocker                                 fLock;
                MemoryBlockTable*               fActiveBlocks;
-               MemoryBlockTable*               fDeadBlocks;
+               DeadBlockTable*                 fDeadBlocks;
 };
 
 
+class TeamMemoryBlockOwner
+{
+public:
+                                                               
TeamMemoryBlockOwner(
+                                                                       
TeamMemoryBlockManager* manager);
+                                                               
~TeamMemoryBlockOwner();
+
+               void                                    
RemoveBlock(TeamMemoryBlock* block);
+
+private:
+       TeamMemoryBlockManager*         fBlockManager;
+};
+
+
 #endif // TEAM_MEMORY_BLOCK_MANAGER_H

Modified: haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.cpp     2011-06-10 
17:35:46 UTC (rev 42089)
+++ haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.cpp     2011-06-10 
22:20:39 UTC (rev 42090)
@@ -16,17 +16,18 @@
 
 
 TeamMemoryBlock::TeamMemoryBlock(target_addr_t baseAddress,
-       TeamMemoryBlockManager* manager)
+       TeamMemoryBlockOwner* owner)
        :
        fValid(false),
        fBaseAddress(baseAddress),
-       fBlockManager(manager)
+       fBlockOwner(owner)
 {
 }
 
 
 TeamMemoryBlock::~TeamMemoryBlock()
 {
+       delete fBlockOwner;
 }
 
 
@@ -88,9 +89,9 @@
 void
 TeamMemoryBlock::LastReferenceReleased()
 {
-       fBlockManager->_RemoveBlock(fBaseAddress);
+       fBlockOwner->RemoveBlock(this);
 
-       BReferenceable::LastReferenceReleased();
+       delete this;
 }
 
 

Modified: haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.h
===================================================================
--- haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.h       2011-06-10 
17:35:46 UTC (rev 42089)
+++ haiku/trunk/src/apps/debugger/model/TeamMemoryBlock.h       2011-06-10 
22:20:39 UTC (rev 42090)
@@ -15,16 +15,17 @@
 #include "Types.h"
 
 
-class TeamMemoryBlockManager;
+class TeamMemoryBlockOwner;
 
 
-class TeamMemoryBlock : public BReferenceable {
+class TeamMemoryBlock : public BReferenceable,
+       public DoublyLinkedListLinkImpl<TeamMemoryBlock> {
 public:
        class Listener;
 
 public:
                                                        
TeamMemoryBlock(target_addr_t baseAddress,
-                                                               
TeamMemoryBlockManager* manager);
+                                                               
TeamMemoryBlockOwner* owner);
                                                        ~TeamMemoryBlock();
 
                        void                    AddListener(Listener* listener);
@@ -52,8 +53,8 @@
                        target_addr_t   fBaseAddress;
                        uint8                   fData[B_PAGE_SIZE];
                        ListenerList    fListeners;
-                       TeamMemoryBlockManager*
-                                                       fBlockManager;
+                       TeamMemoryBlockOwner*
+                                                       fBlockOwner;
                        BLocker                 fLock;
 };
 


Other related posts:

  • » [haiku-commits] r42090 - in haiku/trunk/src/apps/debugger: . model - anevilyak