mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
Core: GetMemoryBlockSize, TryRealloc
git-svn-id: svn://ultimatepp.org/upp/trunk@8097 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
4e828b5362
commit
bfc16b7549
7 changed files with 106 additions and 9 deletions
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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__;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue