On Wed, 19 May 2010 16:02:54 +0100
Anselm R Garbe <garbeam_AT_gmail.com> wrote:
> On 19 May 2010 15:55, Elmo Todurov <todurov_AT_gmail.com> wrote:
> > On Wed, May 19, 2010 at 5:15 PM, pancake <pancake_AT_youterm.com> wrote:
> >> it's not that 'complex'. code shouldnt look uglier with this change, it's just to
> >> replace current allocator, which you should do, because failed mallocs must die().
> >
> > Care to write a patch to prove your point? I must admit I've never
> > written my own allocators.
>
> Something like this?
>
> void *
> emalloc(uint size) {
> void *ret = malloc(size);
> if(!ret)
> die("malloc", size);
> return ret;
> }
>
Here's a very generic version of what I proposed. In your case can be hardly simplified.
http://radare.org/cgi-bin/hg/radare2/file/6c6000dd3695/libr/util/pool.c
The specific version can be found in:
hg clone http://hg.youterm.com/alt
8 static inline AltNode* node_alloc(AltTree *at) {
9 if (at->ncount >= ALLOC_POOL_SIZE) {
10 if (++at->npool >= ALLOC_POOL_COUNT ) {
11 fprintf (stderr, "FAIL: Cannot allocate more memory in the pool \n");
12 exit(1);
13 }
14 at->nodes[at->npool] = malloc (sizeof (AltNode)*ALLOC_POOL_SIZE);
15 at->ncount = 0;
16 }
17 return &at->nodes[at->npool][at->ncount++];
18 }
19
20 static AltNode *alt_node_new(AltTree *at) {
21 AltNode *node = node_alloc (at);
22 memset (node, 0, sizeof (AltNode));
23 return node;
24 }
The thing is how many pools you want to support. I would probably not support more than
one pool.
This concept/implementation of a memory pool allocator is the same as glib slices. But
smarter, because you can just adapt it to your needs.
--pancake
Received on Wed May 19 2010 - 15:54:53 UTC
This archive was generated by hypermail 2.2.0 : Wed May 19 2010 - 16:12:02 UTC