[ODE] SIGSEGV in dSolveLCP() at ode/src/lcp.cpp:1137
Michael Lacher
michael.lacher at hlw.co.at
Fri Feb 13 10:33:38 MST 2004
Nguyen Binh wrote:
> Hi ,
>
> The problem is vanilla malloc() /free() is incredibly slow compare
> to alloca()(somewhat about 1000 times).
>
> So if you try to implement a new mem alloc in ODE, I suggest not to
> use vanilla malloc(), free() but to :
> 1) Allocate a big chunk() of memory initially
> 2) Implement new malloc() and free() based on that chunks.
>
> These can be done easily cos there are many such things around.
I personally would prefer if there are interfaces for memory allocation
like there are in FMOD. There would have two possibilities:
a) give it a memory pool that you allocated somewhere and it uses its
own allocators in this pool and never asks for more or uses more.
b) give it function pointers to malloc/realloc/free functions and it
uses those, not using a pool (you are responsible for pools, ...)
I would enhance this a bit for ODE to make it transparent and usable
without memory limits:
1. Specify three seperate memory allocation methods:
a) stack allocation using alloca with a userdefined allocation limit
b) allocation in a preallocated pool (using own stack or similar
fast method) with a limit given by the pool size
c) dynamic allocation using user given malloc pointers
2. Specify some rules as to when and how to use each one of those methods:
IF amount < allocaLimit THEN use alloca
ELSE
IF pool available and amount fits in pool THEN use pool
ELSE
IF custom malloc is set THEN use custom malloc
ELSE use malloc
Using these rules thebehavior can be finetuned easily:
* default ODE behaviour: allocaLimit=infinity
* only malloc: allocaLimit=0, pool=0, custom malloc=0
* only custom functions: allocaLimit=0, pool=0, custom malloc = user
defined function
* preallocated memory pool with fixed size (example: console):
allocaLimit=0, pool=user given pool, custom malloc=out of memory error
routine (could enlarge pool dynamically)
3. Add some interfaces to set the parameters:
unsigned int dSetAllocaLimit(unsigned int limit);
param: the new limit you want to set (0 to disable use of alloca)
returns: the limit used (might be checked agains stack size, or
availability of alloca)
unsigned int dSetMemoryPool(void* pool, unsigned int poolSize);
param1: pointer to start of pool
param2: size of pool in bytes
returns: actual size used (after alignment is done, ...)
void dSetCustomAllocationFunctions(void* (*mallocFunc)(unsigned int
size), void (*freeFunc)(void* data));
param1: custom malloc function
param2: custom free function
return: nothing
Some apropriate get methods would be useful too :)
mucki
--
Honeder Lacher Wallner Softwareentwicklung OEG
Founder / Developer
http://www.hlw.co.at
michael.lacher at hlw.co.at
+43/ 1/ 9134716
More information about the ODE
mailing list