136 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | /*
 | ||
|  | ----------------------------------------------------------------------------- | ||
|  | This source file is part of GIMPACT Library. | ||
|  | 
 | ||
|  | For the latest info, see http://gimpact.sourceforge.net/
 | ||
|  | 
 | ||
|  | Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. | ||
|  | email: projectileman@yahoo.com | ||
|  | 
 | ||
|  |  This library is free software; you can redistribute it and/or | ||
|  |  modify it under the terms of EITHER: | ||
|  |    (1) The GNU Lesser General Public License as published by the Free | ||
|  |        Software Foundation; either version 2.1 of the License, or (at | ||
|  |        your option) any later version. The text of the GNU Lesser | ||
|  |        General Public License is included with this library in the | ||
|  |        file GIMPACT-LICENSE-LGPL.TXT. | ||
|  |    (2) The BSD-style license that is included with this library in | ||
|  |        the file GIMPACT-LICENSE-BSD.TXT. | ||
|  |    (3) The zlib/libpng license that is included with this library in | ||
|  |        the file GIMPACT-LICENSE-ZLIB.TXT. | ||
|  | 
 | ||
|  |  This library is distributed in the hope that it will be useful, | ||
|  |  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  |  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files | ||
|  |  GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. | ||
|  | 
 | ||
|  | ----------------------------------------------------------------------------- | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #include "gim_memory.h"
 | ||
|  | #include "stdlib.h"
 | ||
|  | 
 | ||
|  | #ifdef GIM_SIMD_MEMORY
 | ||
|  | #include "LinearMath/btAlignedAllocator.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | static gim_alloc_function *g_allocfn = 0; | ||
|  | static gim_alloca_function *g_allocafn = 0; | ||
|  | static gim_realloc_function *g_reallocfn = 0; | ||
|  | static gim_free_function *g_freefn = 0; | ||
|  | 
 | ||
|  | void gim_set_alloc_handler (gim_alloc_function *fn) | ||
|  | { | ||
|  |   g_allocfn = fn; | ||
|  | } | ||
|  | 
 | ||
|  | void gim_set_alloca_handler (gim_alloca_function *fn) | ||
|  | { | ||
|  |   g_allocafn = fn; | ||
|  | } | ||
|  | 
 | ||
|  | void gim_set_realloc_handler (gim_realloc_function *fn) | ||
|  | { | ||
|  |   g_reallocfn = fn; | ||
|  | } | ||
|  | 
 | ||
|  | void gim_set_free_handler (gim_free_function *fn) | ||
|  | { | ||
|  |   g_freefn = fn; | ||
|  | } | ||
|  | 
 | ||
|  | gim_alloc_function *gim_get_alloc_handler() | ||
|  | { | ||
|  |   return g_allocfn; | ||
|  | } | ||
|  | 
 | ||
|  | gim_alloca_function *gim_get_alloca_handler() | ||
|  | { | ||
|  |   return g_allocafn; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | gim_realloc_function *gim_get_realloc_handler () | ||
|  | { | ||
|  |   return g_reallocfn; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | gim_free_function  *gim_get_free_handler () | ||
|  | { | ||
|  |   return g_freefn; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | void * gim_alloc(size_t size) | ||
|  | { | ||
|  | 	void * ptr; | ||
|  | 	if (g_allocfn) | ||
|  | 	{ | ||
|  | 		ptr = g_allocfn(size); | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | #ifdef GIM_SIMD_MEMORY
 | ||
|  | 		ptr = btAlignedAlloc(size,16); | ||
|  | #else
 | ||
|  | 		ptr = malloc(size); | ||
|  | #endif
 | ||
|  | 	} | ||
|  |   	return ptr; | ||
|  | } | ||
|  | 
 | ||
|  | void * gim_alloca(size_t size) | ||
|  | { | ||
|  |   if (g_allocafn) return g_allocafn(size); else return gim_alloc(size); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | void * gim_realloc(void *ptr, size_t oldsize, size_t newsize) | ||
|  | { | ||
|  |  	void * newptr = gim_alloc(newsize); | ||
|  |     size_t copysize = oldsize<newsize?oldsize:newsize; | ||
|  |     gim_simd_memcpy(newptr,ptr,copysize); | ||
|  |     gim_free(ptr); | ||
|  |     return newptr; | ||
|  | } | ||
|  | 
 | ||
|  | void gim_free(void *ptr) | ||
|  | { | ||
|  | 	if (!ptr) return; | ||
|  | 	if (g_freefn) | ||
|  | 	{ | ||
|  | 	   g_freefn(ptr); | ||
|  | 	} | ||
|  | 	else | ||
|  | 	{ | ||
|  | 	#ifdef GIM_SIMD_MEMORY
 | ||
|  | 		btAlignedFree(ptr); | ||
|  | 	#else
 | ||
|  | 		free(ptr); | ||
|  | 	#endif
 | ||
|  | 	} | ||
|  | } | ||
|  | 
 |