From bfc16b754996fa0129d4002575bbc68827f74787 Mon Sep 17 00:00:00 2001 From: cxl Date: Mon, 26 Jan 2015 19:04:51 +0000 Subject: [PATCH] Core: GetMemoryBlockSize, TryRealloc git-svn-id: svn://ultimatepp.org/upp/trunk@8097 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/Debug.cpp | 2 +- uppsrc/Core/Defs.h | 6 ++++++ uppsrc/Core/HeapImp.h | 19 ++++++++++++------- uppsrc/Core/heapdbg.cpp | 13 +++++++++++++ uppsrc/Core/lheap.cpp | 33 +++++++++++++++++++++++++++++++++ uppsrc/Core/sheap.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ uppsrc/CtrlCore/init | 2 +- 7 files changed, 106 insertions(+), 9 deletions(-) diff --git a/uppsrc/Core/Debug.cpp b/uppsrc/Core/Debug.cpp index 143131ad7..31b096852 100644 --- a/uppsrc/Core/Debug.cpp +++ b/uppsrc/Core/Debug.cpp @@ -170,7 +170,7 @@ void HexDumpData(Stream& s, const void *ptr, int size, bool adr, int maxsize) { void HexDump(Stream& s, const void *ptr, int size, int maxsize) { char h[256]; - sprintf(h, "Memory at %p, size 0x%X = %d\n", ptr, size, size); + sprintf(h, "Memory at 0x%p, size 0x%X = %d\n", ptr, size, size); s.Put(h); #ifdef PLATFORM_WIN32 if(IsBadReadPtr(ptr, size)) { diff --git a/uppsrc/Core/Defs.h b/uppsrc/Core/Defs.h index 1626d7a78..79e858618 100644 --- a/uppsrc/Core/Defs.h +++ b/uppsrc/Core/Defs.h @@ -501,6 +501,9 @@ int MemoryUsedKb(); void MemoryLimitKb(int kb); +size_t GetMemoryBlockSize(void *ptr); +bool TryRealloc(void *ptr, size_t newsize); + #ifdef MEMORY_SHRINK void MemoryShrink(); #endif @@ -567,6 +570,9 @@ inline int MemoryUsedKb() { return 0; } inline void MemoryIgnoreLeaksBegin() {} inline void MemoryIgnoreLeaksEnd() {} +inline size_t GetMemoryBlockSize(void *ptr) { return 0; } +inline bool TryRealloc(void *ptr, size_t newsize) { return false; } + struct MemoryProfile { int empty__; }; diff --git a/uppsrc/Core/HeapImp.h b/uppsrc/Core/HeapImp.h index d4bcb6d43..2f6b3082f 100644 --- a/uppsrc/Core/HeapImp.h +++ b/uppsrc/Core/HeapImp.h @@ -155,6 +155,8 @@ struct Heap { void *TryLAlloc(int ii, size_t size); void *LAlloc(size_t& size); void LFree(void *ptr); + size_t LGetBlockSize(void *ptr); + bool LTryRealloc(void *ptr, size_t newsize); void Make(MemoryProfile& f); static void Shrink(); @@ -163,13 +165,16 @@ struct Heap { void Shutdown(); static void AuxFinalCheck(); - void *Alloc(size_t sz); - void *AllocSz(size_t& sz); - void Free(void *ptr); - void *Alloc32(); - void Free32(void *ptr); - void *Alloc48(); - void Free48(void *ptr); + void *Alloc(size_t sz); + void *AllocSz(size_t& sz); + void Free(void *ptr); + size_t GetBlockSize(void *ptr); + void *Alloc32(); + void Free32(void *ptr); + void *Alloc48(); + void Free48(void *ptr); + + bool TryRealloc(void *ptr, size_t newsize); }; extern thread__ Heap heap; diff --git a/uppsrc/Core/heapdbg.cpp b/uppsrc/Core/heapdbg.cpp index 11339d2f3..88e361e26 100644 --- a/uppsrc/Core/heapdbg.cpp +++ b/uppsrc/Core/heapdbg.cpp @@ -133,6 +133,19 @@ void MemoryFree(void *ptr) MemoryFree_(p); } +size_t GetMemoryBlockSize_(void *ptr); + +size_t GetMemoryBlockSize(void *ptr) +{ + if(!ptr) return 0; + return ((DbgBlkHeader *)ptr - 1)->size; +} + +bool TryRealloc(void *ptr, size_t newsize) +{ + return false; +} + void *MemoryAlloc32() { return MemoryAlloc(32); } void MemoryFree32(void *ptr) { return MemoryFree(ptr); } void *MemoryAlloc48() { return MemoryAlloc(48); } diff --git a/uppsrc/Core/lheap.cpp b/uppsrc/Core/lheap.cpp index 373c178c4..73e9bcf2b 100644 --- a/uppsrc/Core/lheap.cpp +++ b/uppsrc/Core/lheap.cpp @@ -253,6 +253,39 @@ void Heap::LFree(void *ptr) { } } +bool Heap::LTryRealloc(void *ptr, size_t newsize) +{ + DLink *b = (DLink *)ptr; + Header *bh = b->GetHeader(); + if(bh->size == 0) { + Mutex::Lock __(mutex); + ASSERT(((dword)(uintptr_t)bh & 4095) == BIGHDRSZ - sizeof(Header)); + BigHdr *h = (BigHdr *)((byte *)ptr - BIGHDRSZ); + return newsize <= h->size; + } + if(bh->heap != this) // if another thread's heap, do not bother to be smart + return newsize <= bh->size; + LLOG("--- TryRealloc " << asString(bh->size)); + Header *n = bh->Next(); + if(n->free && newsize <= n->size + bh->size + sizeof(Header)) { + n->GetBlock()->Unlink(); + bh->size += n->size + sizeof(Header); + n->Next()->prev = bh->size; + return true; + } + return false; +} + +size_t Heap::LGetBlockSize(void *ptr) { + DLink *b = (DLink *)ptr; + Header *bh = b->GetHeader(); + if(bh->size == 0) { + BigHdr *h = (BigHdr *)((byte *)ptr - BIGHDRSZ); + return h->size; + } + return bh->size; +} + #endif END_UPP_NAMESPACE diff --git a/uppsrc/Core/sheap.cpp b/uppsrc/Core/sheap.cpp index f69c82565..62453eecc 100644 --- a/uppsrc/Core/sheap.cpp +++ b/uppsrc/Core/sheap.cpp @@ -228,6 +228,30 @@ void Heap::Free(void *ptr) LFree(ptr); } +size_t Heap::GetBlockSize(void *ptr) +{ + if(!ptr) return 0; + LLOG("GetBlockSize " << ptr); + if((((dword)(uintptr_t)ptr) & 8) == 0) { + Page *page = (Page *)((uintptr_t)ptr & ~(uintptr_t)4095); + int k = page->klass; + return Ksz(k); + } + return LGetBlockSize(ptr); +} + +bool Heap::TryRealloc(void *ptr, size_t newsize) +{ + if(!ptr) return 0; + LLOG("GetBlockSize " << ptr); + if((((dword)(uintptr_t)ptr) & 8) == 0) { + Page *page = (Page *)((uintptr_t)ptr & ~(uintptr_t)4095); + int k = page->klass; + return newsize <= Ksz(k); + } + return LTryRealloc(ptr, newsize); +} + void Heap::FreeDirect(void *ptr) { LLOG("Free Direct " << ptr); @@ -320,6 +344,12 @@ void MemoryFree_(void *ptr) { heap.Free(ptr); } + +size_t GetMemoryBlockSize_(void *ptr) +{ + return heap.GetBlockSize(ptr); +} + #else void *MemoryAlloc(size_t sz) { @@ -336,6 +366,16 @@ void MemoryFree(void *ptr) heap.Free(ptr); } +size_t GetMemoryBlockSize(void *ptr) +{ + return heap.GetBlockSize(ptr); +} + +bool TryRealloc(void *ptr, size_t size) +{ + return heap.TryRealloc(ptr, size); +} + void *MemoryAlloc32() { return heap.Alloc32(); diff --git a/uppsrc/CtrlCore/init b/uppsrc/CtrlCore/init index 27c33a181..aa63470cf 100644 --- a/uppsrc/CtrlCore/init +++ b/uppsrc/CtrlCore/init @@ -3,7 +3,7 @@ #include "Draw/init" #include "plugin\bmp/init" #include "RichText/init" -#define BLITZ_INDEX__ Fe2ff541f9bb9f4ad3f5bcc23a34e1b73 +#define BLITZ_INDEX__ F656a4ea94e4f808b1ec63034b0e6c5ac #include "CtrlCore.icpp" #undef BLITZ_INDEX__ #endif