FreeChunk
bool IsTouching(FreeChunk* chunk)
FreeChunk* Join(FreeChunk* chunk)
static FreeChunk* SetToAllocated(void* allocated)
return static_cast<FreeChunk*>((FreeChunkData*)allocated);
FreeChunkKey(const FreeChunk* chunk)
int Compare(const FreeChunk* chunk) const
const FreeChunk* fChunk;
typedef FreeChunk NodeType;
static FreeChunkKey GetKey(const FreeChunk* node)
static SplayTreeLink<FreeChunk>* GetLink(FreeChunk* node)
static int Compare(const FreeChunkKey& key, const FreeChunk* node)
static FreeChunk** GetListLink(FreeChunk* node)
FreeChunk* chunk = (FreeChunk*)base;
FreeChunk* chunk = fFreeChunkTree.FindClosest(FreeChunkKey(size), true, true);
if (chunk->Size() >= (size + Align(sizeof(FreeChunk)))) {
FreeChunk* freeChunk = chunk->Split(size);
FreeChunk* chunk = FreeChunk::SetToAllocated(allocated);
FreeChunk* freedChunk = FreeChunk::SetToAllocated(allocated);
FreeChunk* chunk = fFreeChunkTree.FindMin();
FreeChunk* chunk = fFreeChunkTree.FindMin();
void _InsertChunk(FreeChunk* freedChunk)
FreeChunk* chunk = fFreeChunkTree.FindMin();
FreeChunk* nextChunk = chunk->Next();
class FreeChunk;
struct FreeChunkData : SplayTreeLink<FreeChunk> {
FreeChunk* Next() const
FreeChunk** NextLink()
FreeChunk* fNext;
class FreeChunk : public Chunk, public FreeChunkData {
FreeChunk* Split(size_t splitSize)
FreeChunk* chunk = (FreeChunk*)((addr_t)AllocatedAddress() + splitSize);
status_t FreeChunk(void *logicalAddress,
fStack->FreeChunk(transfer->buffer_log,
fStack->FreeChunk(result, physicalAddress, sizeof(ehci_qh));
fStack->FreeChunk(queueHead, (phys_addr_t)queueHead->this_phy,
fStack->FreeChunk(result, (phys_addr_t)result->this_phy,
fStack->FreeChunk(descriptor->buffer_log,
fStack->FreeChunk(descriptor, (phys_addr_t)descriptor->this_phy,
fStack->FreeChunk(descriptor, (phys_addr_t)descriptor->this_phy,
fStack->FreeChunk(descriptor, (phys_addr_t)descriptor->this_phy,
fStack->FreeChunk((void *)endpoint, endpoint->physical_address,
fStack->FreeChunk(descriptor, descriptor->physical_address,
fStack->FreeChunk(descriptor->buffer_logical,
fStack->FreeChunk((void *)descriptor, descriptor->physical_address,
fStack->FreeChunk(descriptor, descriptor->physical_address,
fStack->FreeChunk(descriptor->buffer_logical,
fStack->FreeChunk((void *)descriptor, descriptor->physical_address,
fStack->FreeChunk(queueHead, queueHead->this_phy, sizeof(uhci_qh));
fStack->FreeChunk(result, result->this_phy, sizeof(uhci_td));
fStack->FreeChunk(descriptor->buffer_log,
fStack->FreeChunk(descriptor, descriptor->this_phy, sizeof(uhci_td));
fStack->FreeChunk(fQueueHead, fQueueHead->this_phy, sizeof(uhci_qh));
fStack->FreeChunk(fStrayDescriptor, fStrayDescriptor->this_phy,
fStack->FreeChunk(fStrayDescriptor, fStrayDescriptor->this_phy,
fStack->FreeChunk(descriptor->trbs, descriptor->trb_addr,
fStack->FreeChunk(descriptor->buffers[0], descriptor->buffer_addrs[0],
fStack->FreeChunk(descriptor->buffers[i], descriptor->buffer_addrs[i],
fStack->FreeChunk(descriptor->buffers, 0,
fStack->FreeChunk(descriptor, 0, sizeof(xhci_td));
FreeChunk*
FreeChunk::Split(uint32 splitSize)
FreeChunk* chunk
= (FreeChunk*)((uint8*)this + FreeChunk::NextOffset() + splitSize);
chunk->fSize = fSize - splitSize - FreeChunk::NextOffset();
fSize = splitSize + FreeChunk::NextOffset();
FreeChunk::IsTouching(FreeChunk* chunk)
FreeChunk*
FreeChunk::Join(FreeChunk* chunk)
FreeChunk::Remove(rtm_pool* pool, FreeChunk* previous)
FreeChunk* chunk = pool->free_anchor.fNext;
FreeChunk::Enqueue(rtm_pool* pool)
FreeChunk* chunk = pool->free_anchor.fNext;
FreeChunk* last = &pool->free_anchor;
FreeChunk::AllocatedAddress() const
FreeChunk*
FreeChunk::SetToAllocated(void* allocated)
return (FreeChunk*)((addr_t)allocated - FreeChunk::NextOffset());
FreeChunk* freedChunk = FreeChunk::SetToAllocated(allocated);
FreeChunk* chunk = free_anchor.Next();
FreeChunk* last = &free_anchor;
pool->max_size = (totalSize + sizeof(FreeChunk) - 1 + B_PAGE_SIZE)
pool->available = pool->max_size - FreeChunk::NextOffset();
FreeChunk* chunk = (FreeChunk*)pool->heap_base;
void SetTo(size_t size, FreeChunk* next);
FreeChunk* chunk = pool->free_anchor.Next();
FreeChunk* last = &pool->free_anchor;
if (chunk->Size() > size + sizeof(FreeChunk) + kAlignment) {
FreeChunk* freeChunk = chunk->Split(size);
FreeChunk* Next() const { return fNext; }
void SetNext(FreeChunk* next) { fNext = next; }
FreeChunk* Split(uint32 splitSize);
bool IsTouching(FreeChunk* link);
FreeChunk* oldChunk = FreeChunk::SetToAllocated(oldBuffer);
FreeChunk* Join(FreeChunk* link);
FreeChunk* previous = NULL);
FreeChunk* chunk = FreeChunk::SetToAllocated(buffer);
FreeChunk* chunk = FreeChunk::SetToAllocated(buffer);
static FreeChunk* SetToAllocated(void* allocated);
FreeChunk* fNext;
FreeChunk free_anchor;
FreeChunk::SetTo(size_t size, FreeChunk* next)
FreeChunk::Size() const
return fSize - FreeChunk::NextOffset();
T(FreeChunk(metaChunk, chunk));
FreeChunk(MetaChunk* metaChunk, Chunk* chunk)
FreeChunk* chunk = fChunksBySizeTree.FindClosest(allocate, true, true);
FreeChunk* chunk;
FreeChunk* chunk = fChunksByAddressTree.FindClosest(address, false, true);
FreeChunk* freedChunk = _Insert(_address, size);
FreeChunk* chunk = fChunksBySizeTree.FindMax();
FreeChunk* previousChunk = fChunksBySizeTree.PreviousDontSplay(chunk);
void* _Use(FreeChunk* chunk, size_t amount)
FreeChunk* newChunk = (FreeChunk*)((addr_t)chunk + amount);
memset(chunk, 0, sizeof(FreeChunk));
FreeChunk* _Insert(void* _address, size_t size)
FreeChunk* chunk;
FreeChunk* preceding = fChunksByAddressTree.FindClosest(address, false, false);
chunk = (FreeChunk*)_address;
FreeChunk* following = chunk->address_tree_list_link;
status_t _Map(size_t allocate, FreeChunk*& allocated, bool& mostlyClear)
bool _InLastArea(const FreeChunk* chunk) const
status_t _UnlockingRemoveAndUnmap(FreeChunk* chunk, bool relock = true)
status_t _UnlockingUnmap(FreeChunk* chunk)
SplayTreeLink<FreeChunk> address_tree_link;
SplayTreeLink<FreeChunk> size_tree_link;
FreeChunk* address_tree_list_link;
FreeChunk* size_tree_list_link;
typedef FreeChunk NodeType;
static addr_t GetKey(const FreeChunk* node)
static SplayTreeLink<FreeChunk>* GetLink(FreeChunk* node)
static int Compare(const addr_t& key, const FreeChunk* node)
struct FreeChunk;
static FreeChunk** GetListLink(FreeChunk* node)
KeyType(const FreeChunk* chunk) : size(chunk->size), address((addr_t)chunk) {}
typedef FreeChunk NodeType;
static KeyType GetKey(const FreeChunk* node)
static SplayTreeLink<FreeChunk>* GetLink(FreeChunk* node)
static int Compare(const KeyType& key, const FreeChunk* node)
static FreeChunk** GetListLink(FreeChunk* node)