10 #include "ecore_private.h"
12 typedef struct _Ecore_Mempool Ecore_Mempool;
20 #define GENERIC_ALLOC_FREE(TYPE, Type) \
21 extern size_t _ecore_sizeof_##TYPE; \
22 Ecore_Mempool Type##_mp = { #TYPE, NULL, 0 }; \
24 Type##_calloc(unsigned int num) \
26 return eina_mempool_calloc(Type##_mp.mp, \
27 num * _ecore_sizeof_##TYPE); \
30 Type##_mp_free(TYPE *e) \
32 eina_mempool_free(Type##_mp.mp, e); \
35 GENERIC_ALLOC_FREE(Ecore_Animator, ecore_animator);
36 GENERIC_ALLOC_FREE(Ecore_Event_Handler, ecore_event_handler);
37 GENERIC_ALLOC_FREE(Ecore_Event_Filter, ecore_event_filter);
38 GENERIC_ALLOC_FREE(Ecore_Event, ecore_event);
39 GENERIC_ALLOC_FREE(Ecore_Idle_Exiter, ecore_idle_exiter);
40 GENERIC_ALLOC_FREE(Ecore_Idle_Enterer, ecore_idle_enterer);
41 GENERIC_ALLOC_FREE(Ecore_Idler, ecore_idler);
42 GENERIC_ALLOC_FREE(Ecore_Job, ecore_job);
43 GENERIC_ALLOC_FREE(Ecore_Timer, ecore_timer);
44 GENERIC_ALLOC_FREE(Ecore_Poller, ecore_poller);
45 GENERIC_ALLOC_FREE(Ecore_Pipe, ecore_pipe);
46 GENERIC_ALLOC_FREE(Ecore_Fd_Handler, ecore_fd_handler);
48 GENERIC_ALLOC_FREE(Ecore_Win32_Handler, ecore_win32_handler);
51 static Ecore_Mempool *mempool_array[] = {
53 &ecore_event_handler_mp,
54 &ecore_event_filter_mp,
56 &ecore_idle_exiter_mp,
57 &ecore_idle_enterer_mp,
65 &ecore_win32_handler_mp
70 ecore_mempool_init(void)
75 #define MP_SIZE_INIT(TYPE, Type) \
76 Type##_mp.size = _ecore_sizeof_##TYPE
78 MP_SIZE_INIT(Ecore_Animator, ecore_animator);
79 MP_SIZE_INIT(Ecore_Event_Handler, ecore_event_handler);
80 MP_SIZE_INIT(Ecore_Event_Filter, ecore_event_filter);
81 MP_SIZE_INIT(Ecore_Event, ecore_event);
82 MP_SIZE_INIT(Ecore_Idle_Exiter, ecore_idle_exiter);
83 MP_SIZE_INIT(Ecore_Idle_Enterer, ecore_idle_enterer);
84 MP_SIZE_INIT(Ecore_Idler, ecore_idler);
85 MP_SIZE_INIT(Ecore_Job, ecore_job);
86 MP_SIZE_INIT(Ecore_Timer, ecore_timer);
87 MP_SIZE_INIT(Ecore_Poller, ecore_poller);
88 MP_SIZE_INIT(Ecore_Pipe, ecore_pipe);
89 MP_SIZE_INIT(Ecore_Fd_Handler, ecore_fd_handler);
91 MP_SIZE_INIT(Ecore_Win32_Handler, ecore_win32_handler);
95 choice = getenv("EINA_MEMPOOL");
96 if ((!choice) || (!choice[0]))
97 choice = "chained_mempool";
99 for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
102 mempool_array[i]->mp = eina_mempool_add(choice, mempool_array[i]->name, NULL, mempool_array[i]->size, 16);
103 if (!mempool_array[i]->mp)
105 if (!(!strcmp(choice, "pass_through")))
107 ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice);
108 choice = "pass_through";
113 ERR("Impossible to allocate mempool '%s' !", choice);
122 ecore_mempool_shutdown(void)
126 for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
128 eina_mempool_del(mempool_array[i]->mp);
129 mempool_array[i]->mp = NULL;