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
 | |
| 	}
 | |
| }
 | |
| 
 |