Re: [dev] dmenu_path rewrite in C

From: pancake <pancake_AT_youterm.com>
Date: Wed, 19 May 2010 17:54:53 +0200

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