void* AllocatorTLSF_Impl::Reallocate(void* _Pointer, size_t _NumBytes) { size_t oldBlockSize = _Pointer ? tlsf_block_size(_Pointer) : 0; void* p = tlsf_realloc(hPool, _Pointer, _NumBytes); if (p) { size_t blockSizeDiff = tlsf_block_size(p) - oldBlockSize; Stats.BytesAllocated += blockSizeDiff; Stats.BytesFree -= blockSizeDiff; Stats.PeakBytesAllocated = __max(Stats.PeakBytesAllocated, Stats.BytesAllocated); } return 0; }
void free(void *ptr) { if(ptr == NULL) return; const int bs = tlsf_block_size(ptr); if(bs >= 65536) { const int p = (intptr_t)ptr; const int np = ROUND_UP(p, 65536); int s = bs - (np - p); if(s > 0) { s &= ~0xffff; if(s > 0) { #if 0 tracelog(TRACE_NO_PROP, TRACE_DEBUG, "MEMORY", "free(%p+%d) == page_free(0x%x+%d)", ptr, bs, np, s); #endif #ifdef USE_VIRTUAL_MEM if(Lv2Syscall2(308, np, s)) // Invalidate tracelog(TRACE_NO_PROP, TRACE_ERROR, "MEMORY", "Invalidate failed"); if(Lv2Syscall2(310, np, s)) // Sync tracelog(TRACE_NO_PROP, TRACE_ERROR, "MEMORY", "Sync failed"); #endif } } } hts_lwmutex_lock(&mutex); tlsf_free(gpool, ptr); hts_lwmutex_unlock(&mutex); }
void AllocatorTLSF_Impl::Deallocate(void* _Pointer) { if (_Pointer) { size_t blockSize = tlsf_block_size(_Pointer); tlsf_free(hPool, _Pointer); Stats.NumAllocations--; Stats.BytesAllocated -= blockSize; Stats.BytesFree += blockSize; } }
void* AllocatorTLSF_Impl::Allocate(size_t _NumBytes, size_t _Alignment) { void* p = tlsf_memalign(hPool, _Alignment, __max(_NumBytes, 1)); if (p) { size_t blockSize = tlsf_block_size(p); Stats.NumAllocations++; Stats.BytesAllocated += blockSize; Stats.BytesFree -= blockSize; Stats.PeakBytesAllocated = __max(Stats.PeakBytesAllocated, Stats.BytesAllocated); } return p; }
size_t AllocatorTLSF_Impl::GetBlockSize(void* _Pointer) { return tlsf_block_size(_Pointer); }
size_t arch_malloc_size(void *ptr) { return tlsf_block_size(ptr); }