From 81fea743949e8fcd9f7738204f5853b2cd15c868 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Wed, 2 Nov 2011 16:09:49 +0000 Subject: [PATCH] bonefish+mmlr: Add MemoryManager::DebugObjectCacheForAddress() to retrieve the ObjectCache for a certain address from KDL. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43117 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/slab/MemoryManager.cpp | 30 ++++++++++++++++++++++++ src/system/kernel/slab/MemoryManager.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/src/system/kernel/slab/MemoryManager.cpp b/src/system/kernel/slab/MemoryManager.cpp index bde45cedf5..3a6ac26f55 100644 --- a/src/system/kernel/slab/MemoryManager.cpp +++ b/src/system/kernel/slab/MemoryManager.cpp @@ -907,6 +907,36 @@ MemoryManager::AnalyzeAllocationCallers(AllocationTrackingCallback& callback) #endif // SLAB_MEMORY_MANAGER_ALLOCATION_TRACKING +/*static*/ ObjectCache* +MemoryManager::DebugObjectCacheForAddress(void* address) +{ + // get the area + addr_t areaBase = _AreaBaseAddressForAddress((addr_t)address); + Area* area = sAreaTable.Lookup(areaBase); + + if (area == NULL) + return NULL; + + MetaChunk* metaChunk = &area->metaChunks[ + ((addr_t)address % SLAB_AREA_SIZE) / SLAB_CHUNK_SIZE_LARGE]; + + // get the chunk + if (metaChunk->chunkSize == 0) + return NULL; + if ((addr_t)address < metaChunk->chunkBase) + return NULL; + + uint16 chunkIndex = _ChunkIndexForAddress(metaChunk, (addr_t)address); + Chunk* chunk = &metaChunk->chunks[chunkIndex]; + + addr_t reference = chunk->reference; + if ((reference & 1) == 0) + return (ObjectCache*)reference; + + return NULL; +} + + /*static*/ status_t MemoryManager::_AllocateChunks(size_t chunkSize, uint32 chunkCount, uint32 flags, MetaChunk*& _metaChunk, Chunk*& _chunk) diff --git a/src/system/kernel/slab/MemoryManager.h b/src/system/kernel/slab/MemoryManager.h index 1e6cfbf781..0fe20cb18a 100644 --- a/src/system/kernel/slab/MemoryManager.h +++ b/src/system/kernel/slab/MemoryManager.h @@ -65,6 +65,8 @@ public: AllocationTrackingCallback& callback); #endif + static ObjectCache* DebugObjectCacheForAddress(void* address); + private: struct Tracing;