forked from enlightenment/efl
* eina: add a mempool that just do one big malloc.
SVN revision: 50510
This commit is contained in:
parent
21f5dec9d3
commit
07ad9d5139
|
@ -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
|
||||
])
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
|
@ -68,6 +68,7 @@
|
|||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue