Exemplo n.º 1
0
Arquivo: mem.cpp Projeto: Jesna/jucpp
	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;
	}
Exemplo n.º 2
0
Arquivo: mem.cpp Projeto: Jesna/jucpp
	//这个函数无法判定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;
	}
Exemplo n.º 3
0
static Datum _JavaWrapper_coerceObject(Type self, jobject nStruct)
{
	Ptr2Long p2l;
	p2l.longVal = _getPointer(nStruct);
	return PointerGetDatum(p2l.ptrVal);
}
Exemplo n.º 4
0
Arquivo: mem.cpp Projeto: Jesna/jucpp
	uint IMemory::GetLength(void* mem){
		if(_handle==NULL||mem==NULL) return 0;
		LCS lcs(_cs);
		return _getPointerSize(_getPointer((char*)mem))-HANDLE_SIZE*3;
	}