void* IMemory::ReAlloc(void* mem,uint len){ LCS lcs(_cs); if(_handle==NULL) return 0; if(len%2) len += 1; uint preLen = GetLength(mem); if(preLen==len) return mem; if(mem){ char* pt = _getPointer((char*)mem); int size = _getPointerSize(pt); char* next = _getNextPointer(pt); if(next==0) next = (char*)_handle + _length; int freeLen = next - pt - size - HANDLE_SIZE*3; if((int)len<=freeLen){ _setPointer(pt,len); return mem; } Free(mem); } void* p = Alloc(len); if(p==0){//空间不足 return 0; } if(p!=mem&&mem!=0){ uint clen = len<preLen?len:preLen; memcpy(p,mem,clen); } return p; }
//这个函数无法判定mem的有效性, 而且如果mem不正确, 可能会破坏整个内存对象. 访问释放的内存并不会引起错误. bool IMemory::Free(void* mem){ if(mem==0) return 0; LCS lcs(_cs); if(_handle==NULL) return 0; char* pt = _getPointer((char*)mem); #ifdef _DEBUG if(!_findPointer((char*)pt,_curLarge)){ CONASSERT(L"IMemory.Free:pointer not find"); return 0; } #endif uint size = _getPointerSize(pt); char* pre = _getPrePointer(pt); char* after = _getNextPointer(pt); if(pre){ _setPointerAfter(pre,after); }else{ pre = (char*)_handle; _setPointer(pre,0,after,-HANDLE_SIZE*3); } if(after){ _setPointerPre(after,pre); } if(size>=large_small_divider){ _curLarge = pre; if((uint)(UINT_PTR)_curLarge<(uint)(UINT_PTR)_curSmall){ _curSmall = _curLarge; } }else{ _curSmall = pre; } return true; }
static Datum _JavaWrapper_coerceObject(Type self, jobject nStruct) { Ptr2Long p2l; p2l.longVal = _getPointer(nStruct); return PointerGetDatum(p2l.ptrVal); }
uint IMemory::GetLength(void* mem){ if(_handle==NULL||mem==NULL) return 0; LCS lcs(_cs); return _getPointerSize(_getPointer((char*)mem))-HANDLE_SIZE*3; }