Tizen 2.1 base
[framework/uifw/ecore.git] / src / lib / ecore / ecore_alloc.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #include <stdlib.h>
6
7 #include <Eina.h>
8
9 #include "Ecore.h"
10 #include "ecore_private.h"
11
12 typedef struct _Ecore_Mempool Ecore_Mempool;
13 struct _Ecore_Mempool
14 {
15    const char *name;
16    Eina_Mempool *mp;
17    size_t size;
18 };
19
20 #define GENERIC_ALLOC_FREE(TYPE, Type)                                  \
21   extern size_t _ecore_sizeof_##TYPE;                                   \
22   Ecore_Mempool Type##_mp = { #TYPE,  NULL, 0 };                        \
23   TYPE *                                                                \
24   Type##_calloc(unsigned int num)                                       \
25   {                                                                     \
26      return eina_mempool_calloc(Type##_mp.mp,                           \
27                                 num * _ecore_sizeof_##TYPE);            \
28   }                                                                     \
29   void                                                                  \
30   Type##_mp_free(TYPE *e)                                               \
31   {                                                                     \
32      eina_mempool_free(Type##_mp.mp, e);                                \
33   }
34
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);
47 #ifdef _WIN32
48 GENERIC_ALLOC_FREE(Ecore_Win32_Handler, ecore_win32_handler);
49 #endif
50
51 static Ecore_Mempool *mempool_array[] = {
52   &ecore_animator_mp,
53   &ecore_event_handler_mp,
54   &ecore_event_filter_mp,
55   &ecore_event_mp,
56   &ecore_idle_exiter_mp,
57   &ecore_idle_enterer_mp,
58   &ecore_idler_mp,
59   &ecore_job_mp,
60   &ecore_timer_mp,
61   &ecore_poller_mp,
62   &ecore_pipe_mp,
63   &ecore_fd_handler_mp,
64 #ifdef _WIN32
65   &ecore_win32_handler_mp
66 #endif
67 };
68
69 Eina_Bool
70 ecore_mempool_init(void)
71 {
72    const char *choice;
73    unsigned int i;
74
75 #define MP_SIZE_INIT(TYPE, Type) \
76    Type##_mp.size = _ecore_sizeof_##TYPE
77
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);
90 #ifdef _WIN32
91    MP_SIZE_INIT(Ecore_Win32_Handler, ecore_win32_handler);
92 #endif
93 #undef MP_SIZE_INIT
94
95    choice = getenv("EINA_MEMPOOL");
96    if ((!choice) || (!choice[0]))
97      choice = "chained_mempool";
98
99    for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
100      {
101      retry:
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)
104           {
105              if (!(!strcmp(choice, "pass_through")))
106                {
107                   ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice);
108                   choice = "pass_through";
109                   goto retry;
110                }
111              else
112                {
113                   ERR("Impossible to allocate mempool '%s' !", choice);
114                   return EINA_FALSE;
115                }
116           }
117      }
118    return EINA_TRUE;
119 }
120
121 void
122 ecore_mempool_shutdown(void)
123 {
124    unsigned int i;
125
126    for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
127      {
128         eina_mempool_del(mempool_array[i]->mp);
129         mempool_array[i]->mp = NULL;
130      }
131 }
132