* eina: add a mempool that just do one big malloc.

SVN revision: 50510
This commit is contained in:
Cedric BAIL 2010-07-26 15:52:43 +00:00
parent 21f5dec9d3
commit 07ad9d5139
8 changed files with 70 additions and 8 deletions

View File

@ -496,13 +496,15 @@ else
enable_pass_through="no"
fi
enable_one_big="static"
EINA_CHECK_MODULE([chained-pool], [${enable_chained_pool}], [chained pool])
EINA_CHECK_MODULE([ememoa-fixed], [${enable_ememoa}], [ememoa fixed])
EINA_CHECK_MODULE([ememoa-unknown], [${enable_ememoa}], [ememoa unknown])
EINA_CHECK_MODULE([fixed-bitmap], [no], [fixed bitmap])
EINA_CHECK_MODULE([pass-through], [${enable_pass_through}], [pass through])
EINA_CHECK_MODULE([buddy], [no], [buddy])
EINA_CHECK_MODULE([one-big], [${enable_one_big}], [one big])
### Make the debug preprocessor configurable
@ -555,6 +557,7 @@ src/modules/mp/ememoa_unknown/Makefile
src/modules/mp/pass_through/Makefile
src/modules/mp/fixed_bitmap/Makefile
src/modules/mp/buddy/Makefile
src/modules/mp/one_big/Makefile
src/tests/Makefile
])

View File

@ -62,6 +62,8 @@ EAPI void eina_mempool_statistics(Eina_Mempool *mp) EINA_ARG_NONNULL(1);
EAPI Eina_Bool eina_mempool_register(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1);
EAPI void eina_mempool_unregister(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1);
EAPI unsigned int eina_mempool_alignof(unsigned int size);
#include "eina_inline_mempool.x"
/**

View File

@ -45,6 +45,10 @@ if EINA_STATIC_BUILD_CHAINED_POOL
base_sources += $(top_srcdir)/src/modules/mp/chained_pool/eina_chained_mempool.c
endif
if EINA_STATIC_BUILD_ONE_BIG
base_sources += $(top_srcdir)/src/modules/mp/one_big/eina_one_big.c
endif
if EINA_STATIC_BUILD_EMEMOA_FIXED
base_sources += $(top_srcdir)/src/modules/mp/ememoa_fixed/eina_ememoa_fixed.c
endif

View File

@ -118,6 +118,11 @@ Eina_Bool buddy_init(void);
void buddy_shutdown(void);
#endif
#ifdef EINA_STATIC_BUILD_ONE_BIG
Eina_Bool one_big_init(void);
void one_big_shutdown(void);
#endif
/**
* @endcond
*/
@ -211,6 +216,9 @@ eina_mempool_init(void)
#ifdef EINA_STATIC_BUILD_BUDDY
buddy_init();
#endif
#ifdef EINA_STATIC_BUILD_ONE_BIG
one_big_init();
#endif
return EINA_TRUE;
@ -242,6 +250,9 @@ eina_mempool_shutdown(void)
#endif
#ifdef EINA_STATIC_BUILD_BUDDY
buddy_shutdown();
#endif
#ifdef EINA_STATIC_BUILD_ONE_BIG
one_big_shutdown();
#endif
/* dynamic backends */
eina_module_list_free(_modules);
@ -339,6 +350,28 @@ EAPI void eina_mempool_statistics(Eina_Mempool *mp)
mp->backend.statistics(mp->backend_data);
}
EAPI unsigned int
eina_mempool_alignof(unsigned int size)
{
int align;
if (size <= 2)
align = 2;
else if (size < 8)
align = 4;
else
#if __WORDSIZE == 32
align = 8;
#else
if (size < 16)
align = 8;
else
align = 16;
#endif
return ((size / align) + 1) * align;
}
/**
* @}
*/

View File

@ -68,6 +68,7 @@
# include "config.h"
#endif
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

View File

@ -1,4 +1,10 @@
SUBDIRS = chained_pool ememoa_fixed pass_through ememoa_unknown fixed_bitmap buddy
SUBDIRS = chained_pool \
ememoa_fixed \
pass_through \
ememoa_unknown \
fixed_bitmap \
buddy \
one_big
MAINTAINERCLEANFILES = \
Makefile.in

View File

@ -2,7 +2,7 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
/* EINA - EFL data type library
* Copyright (C) 2008 Cedric BAIL
* Copyright (C) 2008-2010 Cedric BAIL, Vincent Torri
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -61,6 +61,7 @@ struct _Chained_Mempool
Eina_Inlist *first;
const char *name;
int item_size;
int item_alloc;
int pool_size;
int usage;
#ifdef EFL_HAVE_THREADS
@ -85,14 +86,20 @@ _eina_chained_mp_pool_new(Chained_Mempool *pool)
{
Chained_Pool *p;
unsigned char *ptr;
int item_alloc, i;
int i;
eina_error_set(0);
p = malloc(sizeof(Chained_Pool) + (pool->pool_size * pool->item_alloc));
if (!p)
{
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return NULL;
}
item_alloc = ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *);
p = malloc(sizeof(Chained_Pool) + (pool->pool_size * item_alloc));
ptr = (unsigned char *) (p + 1);
p->usage = 0;
p->base = NULL;
for (i = 0; i < pool->pool_size; ++i, ptr += item_alloc)
for (i = 0; i < pool->pool_size; ++i, ptr += pool->item_alloc)
eina_trash_push(&p->base, ptr);
return p;
}
@ -249,6 +256,8 @@ eina_chained_mempool_init(const char *context, __UNUSED__ const char *option, va
memcpy((char*) mp->name, context, length);
}
mp->item_alloc = eina_mempool_alignof(mp->item_size);
#ifdef EFL_HAVE_THREADS
# ifdef EFL_HAVE_POSIX_THREADS
pthread_mutex_init(&mp->mutex, NULL);

View File

@ -185,11 +185,15 @@ static void*
eina_fixed_bitmap_init(__UNUSED__ const char *context, __UNUSED__ const char *option, va_list args)
{
Eina_Fixed_Bitmap *mp;
int item_size;
mp = malloc(sizeof (Eina_Fixed_Bitmap));
if (!mp) return NULL;
mp->item_size = va_arg(args, int);
item_size = va_arg(args, int);
mp->item_size = eina_mempool_alignof(item_size);
mp->lookup = NULL;
mp->head = NULL;