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
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
])
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"
/**
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
void buddy_shutdown(void);
#endif
+#ifdef EINA_STATIC_BUILD_ONE_BIG
+Eina_Bool one_big_init(void);
+void one_big_shutdown(void);
+#endif
+
/**
* @endcond
*/
#ifdef EINA_STATIC_BUILD_BUDDY
buddy_init();
#endif
+#ifdef EINA_STATIC_BUILD_ONE_BIG
+ one_big_init();
+#endif
return EINA_TRUE;
#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);
if (_modules)
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;
+}
+
/**
* @}
*/
# include "config.h"
#endif
+#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-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
* 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
Eina_Inlist *first;
const char *name;
int item_size;
+ int item_alloc;
int pool_size;
int usage;
#ifdef EFL_HAVE_THREADS
{
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;
}
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);
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;