Core: GetMemoryBlockSize, TryRealloc

git-svn-id: svn://ultimatepp.org/upp/trunk@8097 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2015-01-26 19:04:51 +00:00
parent 4e828b5362
commit bfc16b7549
7 changed files with 106 additions and 9 deletions

View file

@ -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)) {

View file

@ -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__;
};

View file

@ -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;

View file

@ -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); }

View file

@ -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

View file

@ -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();

View file

@ -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