/* * Copyright 2011, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ #include "TeamMemoryBlock.h" #include #include "TeamMemoryBlockManager.h" // #pragma mark - TeamMemoryBlock TeamMemoryBlock::TeamMemoryBlock(target_addr_t baseAddress, TeamMemoryBlockOwner* owner) : fValid(false), fWritable(false), fBaseAddress(baseAddress), fBlockOwner(owner) { } TeamMemoryBlock::~TeamMemoryBlock() { delete fBlockOwner; } void TeamMemoryBlock::AddListener(Listener* listener) { AutoLocker lock(fLock); fListeners.Add(listener); } bool TeamMemoryBlock::HasListener(Listener* listener) { AutoLocker lock(fLock); ListenerList::Iterator iterator = fListeners.GetIterator(); while (iterator.HasNext()) { if (iterator.Next() == listener) return true; } return false; } void TeamMemoryBlock::RemoveListener(Listener* listener) { AutoLocker lock(fLock); fListeners.Remove(listener); } void TeamMemoryBlock::MarkValid() { fValid = true; NotifyDataRetrieved(); } void TeamMemoryBlock::Invalidate() { fValid = false; } bool TeamMemoryBlock::Contains(target_addr_t address) const { return fValid && address >= fBaseAddress && address < (fBaseAddress + sizeof(fData)); } void TeamMemoryBlock::SetWritable(bool writable) { fWritable = writable; } void TeamMemoryBlock::NotifyDataRetrieved(status_t result) { for (ListenerList::Iterator it = fListeners.GetIterator(); Listener* listener = it.Next();) { if (result == B_OK) listener->MemoryBlockRetrieved(this); else listener->MemoryBlockRetrievalFailed(this, result); } } void TeamMemoryBlock::LastReferenceReleased() { fBlockOwner->RemoveBlock(this); delete this; } // #pragma mark - TeamMemoryBlock TeamMemoryBlock::Listener::~Listener() { } void TeamMemoryBlock::Listener::MemoryBlockRetrieved(TeamMemoryBlock* block) { } void TeamMemoryBlock::Listener::MemoryBlockRetrievalFailed(TeamMemoryBlock* block, status_t result) { }