1/* 2 * Copyright 2011, Rene Gollent, rene@gollent.com. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "TeamMemoryBlock.h" 8 9 10#include <AutoLocker.h> 11 12#include "TeamMemoryBlockManager.h" 13 14 15// #pragma mark - TeamMemoryBlock 16 17 18TeamMemoryBlock::TeamMemoryBlock(target_addr_t baseAddress, 19 TeamMemoryBlockOwner* owner) 20 : 21 fValid(false), 22 fWritable(false), 23 fBaseAddress(baseAddress), 24 fBlockOwner(owner) 25{ 26} 27 28 29TeamMemoryBlock::~TeamMemoryBlock() 30{ 31 delete fBlockOwner; 32} 33 34 35void 36TeamMemoryBlock::AddListener(Listener* listener) 37{ 38 AutoLocker<BLocker> lock(fLock); 39 fListeners.Add(listener); 40} 41 42 43bool 44TeamMemoryBlock::HasListener(Listener* listener) 45{ 46 AutoLocker<BLocker> lock(fLock); 47 ListenerList::Iterator iterator = fListeners.GetIterator(); 48 while (iterator.HasNext()) { 49 if (iterator.Next() == listener) 50 return true; 51 } 52 53 return false; 54} 55 56 57void 58TeamMemoryBlock::RemoveListener(Listener* listener) 59{ 60 AutoLocker<BLocker> lock(fLock); 61 fListeners.Remove(listener); 62} 63 64 65void 66TeamMemoryBlock::MarkValid() 67{ 68 fValid = true; 69 NotifyDataRetrieved(); 70} 71 72 73void 74TeamMemoryBlock::Invalidate() 75{ 76 fValid = false; 77} 78 79 80bool 81TeamMemoryBlock::Contains(target_addr_t address) const 82{ 83 return fValid && address >= fBaseAddress 84 && address < (fBaseAddress + sizeof(fData)); 85} 86 87 88void 89TeamMemoryBlock::SetWritable(bool writable) 90{ 91 fWritable = writable; 92} 93 94 95void 96TeamMemoryBlock::NotifyDataRetrieved(status_t result) 97{ 98 for (ListenerList::Iterator it = fListeners.GetIterator(); 99 Listener* listener = it.Next();) { 100 if (result == B_OK) 101 listener->MemoryBlockRetrieved(this); 102 else 103 listener->MemoryBlockRetrievalFailed(this, result); 104 } 105} 106 107 108void 109TeamMemoryBlock::LastReferenceReleased() 110{ 111 fBlockOwner->RemoveBlock(this); 112 113 delete this; 114} 115 116 117// #pragma mark - TeamMemoryBlock 118 119 120TeamMemoryBlock::Listener::~Listener() 121{ 122} 123 124 125void 126TeamMemoryBlock::Listener::MemoryBlockRetrieved(TeamMemoryBlock* block) 127{ 128} 129 130 131void 132TeamMemoryBlock::Listener::MemoryBlockRetrievalFailed(TeamMemoryBlock* block, 133 status_t result) 134{ 135} 136