diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index 65ea4097ee..0bcd92891f 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -360,3 +360,7 @@ 2011-11-29 Mike McCormack * Allow quitting before entering the glib version of the main loop + +2011-12-02 Mike Blumenkrantz + + * Use mempools for allocations diff --git a/legacy/ecore/NEWS b/legacy/ecore/NEWS index 55bf5773ce..d716761df4 100644 --- a/legacy/ecore/NEWS +++ b/legacy/ecore/NEWS @@ -1,3 +1,13 @@ +Ecore 1.2.0 + +Changes since Ecore 1.1.0: +-------------------------- + +Improvements: + * ecore: + - most allocations moved to mempools + + Ecore 1.1.0 Changes since Ecore 1.0.0: diff --git a/legacy/ecore/src/lib/ecore/Makefile.am b/legacy/ecore/src/lib/ecore/Makefile.am index 2fb6a0a3a0..ec3d99fa9b 100644 --- a/legacy/ecore/src/lib/ecore/Makefile.am +++ b/legacy/ecore/src/lib/ecore/Makefile.am @@ -11,6 +11,7 @@ includesdir = $(includedir)/ecore-@VMAJ@ libecore_la_SOURCES = \ ecore.c \ +ecore_alloc.c \ ecore_anim.c \ ecore_app.c \ ecore_events.c \ diff --git a/legacy/ecore/src/lib/ecore/ecore.c b/legacy/ecore/src/lib/ecore/ecore.c index 99d79c1536..3c67a85e06 100644 --- a/legacy/ecore/src/lib/ecore/ecore.c +++ b/legacy/ecore/src/lib/ecore/ecore.c @@ -159,6 +159,7 @@ ecore_init(void) } if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1; if (_ecore_fps_debug) _ecore_fps_debug_init(); + if (!ecore_mempool_init()) goto shutdown_mempool; _ecore_main_loop_init(); _ecore_signal_init(); _ecore_thread_init(); @@ -191,6 +192,8 @@ ecore_init(void) return _ecore_init_count; +shutdown_mempool: + ecore_mempool_shutdown(); shutdown_log_dom: eina_shutdown(); shutdown_evil: @@ -255,7 +258,7 @@ ecore_shutdown(void) _ecore_memory_max_free); } #endif - + ecore_mempool_shutdown(); eina_log_domain_unregister(_ecore_log_dom); _ecore_log_dom = -1; eina_shutdown(); diff --git a/legacy/ecore/src/lib/ecore/ecore_alloc.c b/legacy/ecore/src/lib/ecore/ecore_alloc.c new file mode 100644 index 0000000000..a83f80d9d6 --- /dev/null +++ b/legacy/ecore/src/lib/ecore/ecore_alloc.c @@ -0,0 +1,107 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "Ecore.h" +#include "ecore_private.h" + +typedef struct _Ecore_Mempool Ecore_Mempool; +struct _Ecore_Mempool +{ + const char *name; + Eina_Mempool *mp; + size_t size; +}; + +#define GENERIC_ALLOC_FREE(TYPE, Type) \ + Ecore_Mempool Type##_mp = { #TYPE, NULL, sizeof (TYPE) }; \ + TYPE * \ + Type##_calloc(unsigned int num) \ + { \ + return eina_mempool_calloc(Type##_mp.mp, num * sizeof (TYPE)); \ + } \ + void \ + Type##_mp_free(TYPE *e) \ + { \ + eina_mempool_free(Type##_mp.mp, e); \ + } + +GENERIC_ALLOC_FREE(Ecore_Animator, ecore_animator); +GENERIC_ALLOC_FREE(Ecore_Event_Handler, ecore_event_handler); +GENERIC_ALLOC_FREE(Ecore_Event_Filter, ecore_event_filter); +GENERIC_ALLOC_FREE(Ecore_Event, ecore_event); +GENERIC_ALLOC_FREE(Ecore_Idle_Exiter, ecore_idle_exiter); +GENERIC_ALLOC_FREE(Ecore_Idle_Enterer, ecore_idle_enterer); +GENERIC_ALLOC_FREE(Ecore_Idler, ecore_idler); +GENERIC_ALLOC_FREE(Ecore_Job, ecore_job); +GENERIC_ALLOC_FREE(Ecore_Timer, ecore_timer); +GENERIC_ALLOC_FREE(Ecore_Poller, ecore_poller); +GENERIC_ALLOC_FREE(Ecore_Pipe, ecore_pipe); +GENERIC_ALLOC_FREE(Ecore_Fd_Handler, ecore_fd_handler); +#ifdef _WIN32 +GENERIC_ALLOC_FREE(Ecore_Win32_Handler, ecore_win32_handler); +#endif + +static Ecore_Mempool *mempool_array[] = { + &ecore_animator_mp, + &ecore_event_handler_mp, + &ecore_event_filter_mp, + &ecore_event_mp, + &ecore_idle_exiter_mp, + &ecore_idle_enterer_mp, + &ecore_idler_mp, + &ecore_job_mp, + &ecore_timer_mp, + &ecore_poller_mp, + &ecore_pipe_mp, + &ecore_fd_handler_mp, +#ifdef _WIN32 + &ecore_win32_handler_mp +#endif +}; + +Eina_Bool +ecore_mempool_init(void) +{ + const char *choice; + unsigned int i; + + choice = getenv("EINA_MEMPOOL"); + if ((!choice) || (!choice[0])) + choice = "chained_mempool"; + + for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i) + { + retry: + mempool_array[i]->mp = eina_mempool_add(choice, mempool_array[i]->name, NULL, mempool_array[i]->size, 64); + if (!mempool_array[i]->mp) + { + if (!strcmp(choice, "pass_through")) + { + ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice); + choice = "pass_through"; + goto retry; + } + else + { + ERR("Impossible to allocate mempool '%s' !", choice); + return EINA_FALSE; + } + } + } + return EINA_TRUE; +} + +void +ecore_mempool_shutdown(void) +{ + unsigned int i; + + for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i) + { + eina_mempool_del(mempool_array[i]->mp); + mempool_array[i]->mp = NULL; + } +} + diff --git a/legacy/ecore/src/lib/ecore/ecore_anim.c b/legacy/ecore/src/lib/ecore/ecore_anim.c index 9adaa77b34..c9199a4930 100644 --- a/legacy/ecore/src/lib/ecore/ecore_anim.c +++ b/legacy/ecore/src/lib/ecore/ecore_anim.c @@ -8,22 +8,6 @@ #include "Ecore.h" #include "ecore_private.h" -struct _Ecore_Animator -{ - EINA_INLIST; - ECORE_MAGIC; - - Ecore_Task_Cb func; - void *data; - - double start, run; - Ecore_Timeline_Cb run_func; - void *run_data; - - Eina_Bool delete_me : 1; - Eina_Bool suspended : 1; -}; - static Eina_Bool _ecore_animator_run(void *data); static Eina_Bool _ecore_animator(void *data); @@ -121,7 +105,7 @@ _do_tick(void) eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator)); ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE); - free(animator); + ecore_animator_mp_free(animator); animators_delete_me--; if (animators_delete_me == 0) break; } @@ -142,7 +126,7 @@ _ecore_animator_add(Ecore_Task_Cb func, Ecore_Animator *animator = NULL; if (!func) return animator; - animator = calloc(1, sizeof(Ecore_Animator)); + animator = ecore_animator_calloc(1); if (!animator) return animator; ECORE_MAGIC_SET(animator, ECORE_MAGIC_ANIMATOR); animator->func = func; @@ -443,7 +427,7 @@ _ecore_animator_shutdown(void) animator = animators; animators = (Ecore_Animator *)eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animators)); ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE); - free(animator); + ecore_animator_mp_free(animator); } } diff --git a/legacy/ecore/src/lib/ecore/ecore_events.c b/legacy/ecore/src/lib/ecore/ecore_events.c index f31baf8462..722f60fcc0 100644 --- a/legacy/ecore/src/lib/ecore/ecore_events.c +++ b/legacy/ecore/src/lib/ecore/ecore_events.c @@ -9,42 +9,6 @@ static int inpurge = 0; -struct _Ecore_Event_Handler -{ - EINA_INLIST; - ECORE_MAGIC; - int type; - Ecore_Event_Handler_Cb func; - void *data; - int references; - Eina_Bool delete_me : 1; -}; - -struct _Ecore_Event_Filter -{ - EINA_INLIST; - ECORE_MAGIC; - Ecore_Data_Cb func_start; - Ecore_Filter_Cb func_filter; - Ecore_End_Cb func_end; - void *loop_data; - void *data; - int references; - Eina_Bool delete_me : 1; -}; - -struct _Ecore_Event -{ - EINA_INLIST; - ECORE_MAGIC; - int type; - void *event; - Ecore_End_Cb func_free; - void *data; - int references; - Eina_Bool delete_me : 1; -}; - static int events_num = 0; static Ecore_Event *events = NULL; static Ecore_Event *event_current = NULL; @@ -109,7 +73,7 @@ ecore_event_handler_add(int type, if (!func) goto unlock; if ((type <= ECORE_EVENT_NONE) || (type >= event_id_max)) goto unlock; - eh = calloc(1, sizeof(Ecore_Event_Handler)); + eh = ecore_event_handler_calloc(1); if (!eh) goto unlock; ECORE_MAGIC_SET(eh, ECORE_MAGIC_EVENT_HANDLER); eh->type = type; @@ -130,7 +94,7 @@ ecore_event_handler_add(int type, new_handlers = realloc(event_handlers, event_handlers_alloc_num * sizeof(Ecore_Event_Handler *)); if (!new_handlers) { - free(eh); + ecore_event_handler_mp_free(eh); goto unlock; } event_handlers = new_handlers; @@ -234,7 +198,7 @@ unlock: static void _ecore_event_generic_free(void *data __UNUSED__, void *event) -{ +{ /* DO NOT MEMPOOL FREE THIS */ free (event); } @@ -358,7 +322,7 @@ ecore_event_filter_add(Ecore_Data_Cb func_start, _ecore_lock(); if (!func_filter) goto unlock; - ef = calloc(1, sizeof(Ecore_Event_Filter)); + ef = ecore_event_filter_calloc(1); if (!ef) goto unlock; ECORE_MAGIC_SET(ef, ECORE_MAGIC_EVENT_FILTER); ef->func_start = func_start; @@ -469,11 +433,11 @@ _ecore_event_shutdown(void) { event_handlers[i] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[i]), EINA_INLIST_GET(event_handlers[i])); ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE); - if (!eh->delete_me) free(eh); + if (!eh->delete_me) ecore_event_handler_mp_free(eh); } } EINA_LIST_FREE(event_handlers_delete_list, eh) - free(eh); + ecore_event_handler_mp_free(eh); if (event_handlers) free(event_handlers); event_handlers = NULL; event_handlers_num = 0; @@ -482,7 +446,7 @@ _ecore_event_shutdown(void) { event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(event_filters)); ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE); - free(ef); + ecore_event_filter_mp_free(ef); } event_filters_delete_me = 0; event_filter_current = NULL; @@ -506,7 +470,7 @@ _ecore_event_add(int type, { Ecore_Event *e; - e = calloc(1, sizeof(Ecore_Event)); + e = ecore_event_calloc(1); if (!e) return NULL; ECORE_MAGIC_SET(e, ECORE_MAGIC_EVENT); e->type = type; @@ -535,7 +499,7 @@ _ecore_event_del(Ecore_Event *event) if (event->func_free) _ecore_call_end_cb(event->func_free, event->data, event->event); events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(events), EINA_INLIST_GET(event)); ECORE_MAGIC_SET(event, ECORE_MAGIC_NONE); - free(event); + ecore_event_mp_free(event); events_num--; return data; } @@ -638,7 +602,7 @@ _ecore_event_filters_apply() event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef)); ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE); - free(ef); + ecore_event_filter_mp_free(ef); } } if (!deleted_in_use) @@ -742,7 +706,7 @@ _ecore_event_call(void) event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh)); ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE); - free(eh); + ecore_event_handler_mp_free(eh); } } diff --git a/legacy/ecore/src/lib/ecore/ecore_idle_enterer.c b/legacy/ecore/src/lib/ecore/ecore_idle_enterer.c index 03cd1c4110..580f34f5b6 100644 --- a/legacy/ecore/src/lib/ecore/ecore_idle_enterer.c +++ b/legacy/ecore/src/lib/ecore/ecore_idle_enterer.c @@ -7,16 +7,6 @@ #include "Ecore.h" #include "ecore_private.h" -struct _Ecore_Idle_Enterer -{ - EINA_INLIST; - ECORE_MAGIC; - Ecore_Task_Cb func; - void *data; - int references; - Eina_Bool delete_me : 1; -}; - static Ecore_Idle_Enterer *idle_enterers = NULL; static Ecore_Idle_Enterer *idle_enterer_current = NULL; static int idle_enterers_delete_me = 0; @@ -49,7 +39,7 @@ ecore_idle_enterer_add(Ecore_Task_Cb func, _ecore_lock(); if (!func) goto unlock; - ie = calloc(1, sizeof(Ecore_Idle_Enterer)); + ie = ecore_idle_enterer_calloc(1); if (!ie) goto unlock; ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER); ie->func = func; @@ -79,7 +69,7 @@ ecore_idle_enterer_before_add(Ecore_Task_Cb func, _ecore_lock(); if (!func) goto unlock; - ie = calloc(1, sizeof(Ecore_Idle_Enterer)); + ie = ecore_idle_enterer_calloc(1); if (!ie) goto unlock; ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER); ie->func = func; @@ -134,7 +124,7 @@ _ecore_idle_enterer_shutdown(void) { idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(idle_enterers)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); - free(ie); + ecore_idle_enterer_mp_free(ie); } idle_enterers_delete_me = 0; idle_enterer_current = NULL; @@ -190,7 +180,7 @@ _ecore_idle_enterer_call(void) idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); - free(ie); + ecore_idle_enterer_mp_free(ie); } } if (!deleted_idler_enterers_in_use) diff --git a/legacy/ecore/src/lib/ecore/ecore_idle_exiter.c b/legacy/ecore/src/lib/ecore/ecore_idle_exiter.c index 70c6a7a69c..7cb2851493 100644 --- a/legacy/ecore/src/lib/ecore/ecore_idle_exiter.c +++ b/legacy/ecore/src/lib/ecore/ecore_idle_exiter.c @@ -7,16 +7,6 @@ #include "Ecore.h" #include "ecore_private.h" -struct _Ecore_Idle_Exiter -{ - EINA_INLIST; - ECORE_MAGIC; - Ecore_Task_Cb func; - void *data; - int references; - Eina_Bool delete_me : 1; -}; - static Ecore_Idle_Exiter *idle_exiters = NULL; static Ecore_Idle_Exiter *idle_exiter_current = NULL; static int idle_exiters_delete_me = 0; @@ -47,7 +37,7 @@ ecore_idle_exiter_add(Ecore_Task_Cb func, _ecore_lock(); if (!func) goto unlock; - ie = calloc(1, sizeof(Ecore_Idle_Exiter)); + ie = ecore_idle_exiter_calloc(1); if (!ie) goto unlock; ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_EXITER); ie->func = func; @@ -102,7 +92,7 @@ _ecore_idle_exiter_shutdown(void) { idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(idle_exiters)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); - free(ie); + ecore_idle_exiter_mp_free(ie); } idle_exiters_delete_me = 0; idle_exiter_current = NULL; @@ -159,7 +149,7 @@ _ecore_idle_exiter_call(void) idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); - free(ie); + ecore_idle_exiter_mp_free(ie); } } if (!deleted_idler_exiters_in_use) diff --git a/legacy/ecore/src/lib/ecore/ecore_idler.c b/legacy/ecore/src/lib/ecore/ecore_idler.c index 6c0cab85a6..1c03e42284 100644 --- a/legacy/ecore/src/lib/ecore/ecore_idler.c +++ b/legacy/ecore/src/lib/ecore/ecore_idler.c @@ -7,16 +7,6 @@ #include "Ecore.h" #include "ecore_private.h" -struct _Ecore_Idler -{ - EINA_INLIST; - ECORE_MAGIC; - Ecore_Task_Cb func; - void *data; - int references; - Eina_Bool delete_me : 1; -}; - static Ecore_Idler *idlers = NULL; static Ecore_Idler *idler_current = NULL; static int idlers_delete_me = 0; @@ -32,7 +22,7 @@ ecore_idler_add(Ecore_Task_Cb func, _ecore_lock(); if (!func) goto unlock; - ie = calloc(1, sizeof(Ecore_Idler)); + ie = ecore_idler_calloc(1); if (!ie) goto unlock; ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLER); ie->func = func; @@ -86,7 +76,7 @@ _ecore_idler_shutdown(void) { idlers = (Ecore_Idler *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(idlers)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); - free(ie); + ecore_idler_mp_free(ie); } idlers_delete_me = 0; idler_current = NULL; @@ -139,7 +129,7 @@ _ecore_idler_all_call(void) idlers = (Ecore_Idler *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); - free(ie); + ecore_idler_mp_free(ie); } } if (!deleted_idlers_in_use) diff --git a/legacy/ecore/src/lib/ecore/ecore_job.c b/legacy/ecore/src/lib/ecore/ecore_job.c index 481c3f3815..02246f9c3a 100644 --- a/legacy/ecore/src/lib/ecore/ecore_job.c +++ b/legacy/ecore/src/lib/ecore/ecore_job.c @@ -16,14 +16,6 @@ static void _ecore_job_event_free(void *data, static int ecore_event_job_type = 0; static Ecore_Event_Handler *_ecore_job_handler = NULL; -struct _Ecore_Job -{ - ECORE_MAGIC; - Ecore_Event *event; - Ecore_Cb func; - void *data; -}; - void _ecore_job_init(void) { @@ -61,13 +53,13 @@ ecore_job_add(Ecore_Cb func, if (!func) return NULL; - job = calloc(1, sizeof(Ecore_Job)); + job = ecore_job_calloc(1); if (!job) return NULL; ECORE_MAGIC_SET(job, ECORE_MAGIC_JOB); job->event = ecore_event_add(ecore_event_job_type, job, _ecore_job_event_free, NULL); if (!job->event) { - free(job); + ecore_job_mp_free(job); return NULL; } job->func = func; @@ -115,8 +107,8 @@ _ecore_job_event_handler(void *data __UNUSED__, static void _ecore_job_event_free(void *data __UNUSED__, - void *ev) + void *job) { - free(ev); + ecore_job_mp_free(job); } diff --git a/legacy/ecore/src/lib/ecore/ecore_main.c b/legacy/ecore/src/lib/ecore/ecore_main.c index aacf991fd7..23e670c3bd 100644 --- a/legacy/ecore/src/lib/ecore/ecore_main.c +++ b/legacy/ecore/src/lib/ecore/ecore_main.c @@ -145,42 +145,6 @@ timerfd_settime(int fd __UNUSED__, #define NS_PER_SEC (1000.0 * 1000.0 * 1000.0) -struct _Ecore_Fd_Handler -{ - EINA_INLIST; - ECORE_MAGIC; - Ecore_Fd_Handler *next_ready; - int fd; - Ecore_Fd_Handler_Flags flags; - Ecore_Fd_Cb func; - void *data; - Ecore_Fd_Cb buf_func; - void *buf_data; - Ecore_Fd_Prep_Cb prep_func; - void *prep_data; - int references; - Eina_Bool read_active : 1; - Eina_Bool write_active : 1; - Eina_Bool error_active : 1; - Eina_Bool delete_me : 1; -#if defined(USE_G_MAIN_LOOP) - GPollFD gfd; -#endif -}; - -#ifdef _WIN32 -struct _Ecore_Win32_Handler -{ - EINA_INLIST; - ECORE_MAGIC; - HANDLE h; - Ecore_Win32_Handle_Cb func; - void *data; - int references; - Eina_Bool delete_me : 1; -}; -#endif - #ifndef USE_G_MAIN_LOOP static int _ecore_main_select(double timeout); #endif @@ -990,7 +954,7 @@ ecore_main_fd_handler_add(int fd, if ((fd < 0) || (flags == 0) || (!func)) goto unlock; - fdh = calloc(1, sizeof(Ecore_Fd_Handler)); + fdh = ecore_fd_handler_calloc(1); if (!fdh) goto unlock; ECORE_MAGIC_SET(fdh, ECORE_MAGIC_FD_HANDLER); fdh->next_ready = NULL; @@ -1000,7 +964,7 @@ ecore_main_fd_handler_add(int fd, { int err = errno; ERR("Failed to add poll on fd %d (errno = %d: %s)!", fd, err, strerror(err)); - free(fdh); + ecore_fd_handler_mp_free(fdh); fdh = NULL; goto unlock; } @@ -1033,7 +997,7 @@ ecore_main_win32_handler_add(void *h, if (!h || !func) return NULL; - wh = calloc(1, sizeof(Ecore_Win32_Handler)); + wh = ecore_win32_handler_calloc(1); if (!wh) return NULL; ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER); wh->h = (HANDLE)h; @@ -1263,7 +1227,7 @@ _ecore_main_shutdown(void) fd_handlers = (Ecore_Fd_Handler *)eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh)); ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE); - free(fdh); + ecore_fd_handler_mp_free(fdh); } if (fd_handlers_with_buffer) fd_handlers_with_buffer = eina_list_free(fd_handlers_with_buffer); @@ -1286,7 +1250,7 @@ _ecore_main_shutdown(void) win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers), EINA_INLIST_GET(wh)); ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE); - free(wh); + ecore_win32_handler_mp_free(wh); } win32_handlers_delete_me = EINA_FALSE; win32_handler_current = NULL; @@ -1527,7 +1491,7 @@ _ecore_main_fd_handlers_cleanup(void) fd_handlers = (Ecore_Fd_Handler *) eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh)); ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE); - free(fdh); + ecore_fd_handler_mp_free(fdh); fd_handlers_to_delete = eina_list_remove_list(fd_handlers_to_delete, l); } } @@ -1558,7 +1522,7 @@ _ecore_main_win32_handlers_cleanup(void) eina_inlist_remove(EINA_INLIST_GET(win32_handlers), EINA_INLIST_GET(wh)); ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE); - free(wh); + ecore_win32_handler_mp_free(wh); } } if (!deleted_in_use) win32_handlers_delete_me = EINA_FALSE; diff --git a/legacy/ecore/src/lib/ecore/ecore_pipe.c b/legacy/ecore/src/lib/ecore/ecore_pipe.c index 0ab7dd09c7..d771471ce3 100644 --- a/legacy/ecore/src/lib/ecore/ecore_pipe.c +++ b/legacy/ecore/src/lib/ecore/ecore_pipe.c @@ -80,21 +80,6 @@ #endif /* ! _WIN32 */ -struct _Ecore_Pipe -{ - ECORE_MAGIC; - int fd_read; - int fd_write; - Ecore_Fd_Handler *fd_handler; - const void *data; - Ecore_Pipe_Cb handler; - unsigned int len; - int handling; - size_t already_read; - void *passed_data; - int message; - Eina_Bool delete_me : 1; -}; static Eina_Bool _ecore_pipe_read(void *data, Ecore_Fd_Handler *fd_handler); @@ -125,12 +110,12 @@ ecore_pipe_add(Ecore_Pipe_Cb handler, if (!handler) return NULL; - p = (Ecore_Pipe *)calloc(1, sizeof(Ecore_Pipe)); + p = ecore_pipe_calloc(1); if (!p) return NULL; if (pipe(fds)) { - free(p); + ecore_pipe_mp_free(p); return NULL; } @@ -171,7 +156,7 @@ ecore_pipe_del(Ecore_Pipe *p) if (p->fd_read != PIPE_FD_INVALID) pipe_close(p->fd_read); if (p->fd_write != PIPE_FD_INVALID) pipe_close(p->fd_write); data = (void *)p->data; - free(p); + ecore_pipe_mp_free(p); return data; } diff --git a/legacy/ecore/src/lib/ecore/ecore_poll.c b/legacy/ecore/src/lib/ecore/ecore_poll.c index a283cb51c5..f3c850a9db 100644 --- a/legacy/ecore/src/lib/ecore/ecore_poll.c +++ b/legacy/ecore/src/lib/ecore/ecore_poll.c @@ -7,16 +7,6 @@ #include "Ecore.h" #include "ecore_private.h" -struct _Ecore_Poller -{ - EINA_INLIST; - ECORE_MAGIC; - int ibit; - unsigned char delete_me : 1; - Ecore_Task_Cb func; - void *data; -}; - static Ecore_Timer *timer = NULL; static int min_interval = -1; static int interval_incr = 0; @@ -159,7 +149,7 @@ _ecore_poller_cb_timer(void *data __UNUSED__) if (poller->delete_me) { pollers[i] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[i]), EINA_INLIST_GET(poller)); - free(poller); + ecore_poller_mp_free(poller); poller_delete_count--; changes++; if (poller_delete_count <= 0) break; @@ -281,7 +271,7 @@ ecore_poller_add(Ecore_Poller_Type type __UNUSED__, if (!func) return NULL; if (interval < 1) interval = 1; - poller = calloc(1, sizeof(Ecore_Poller)); + poller = ecore_poller_calloc(1); if (!poller) return NULL; ECORE_MAGIC_SET(poller, ECORE_MAGIC_POLLER); /* interval MUST be a power of 2, so enforce it */ @@ -413,7 +403,7 @@ ecore_poller_del(Ecore_Poller *poller) /* not in loop so safe - delete immediately */ data = poller->data; pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller)); - free(poller); + ecore_poller_mp_free(poller); _ecore_poller_next_tick_eval(); return data; } @@ -433,7 +423,7 @@ _ecore_poller_shutdown(void) while ((poller = pollers[i])) { pollers[i] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[i]), EINA_INLIST_GET(pollers[i])); - free(poller); + ecore_poller_mp_free(poller); } } } diff --git a/legacy/ecore/src/lib/ecore/ecore_private.h b/legacy/ecore/src/lib/ecore/ecore_private.h index f328605746..1c05f45268 100644 --- a/legacy/ecore/src/lib/ecore/ecore_private.h +++ b/legacy/ecore/src/lib/ecore/ecore_private.h @@ -79,12 +79,15 @@ extern int _ecore_log_dom; #define ECORE_MAGIC_WIN32_HANDLER 0xf7e8f1a3 #define ECORE_MAGIC_JOB 0x76543210 +typedef unsigned int Ecore_Magic; #define ECORE_MAGIC Ecore_Magic __magic #define ECORE_MAGIC_SET(d, m) (d)->__magic = (m) #define ECORE_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m))) #define ECORE_MAGIC_FAIL(d, m, fn) _ecore_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn)); +#include "ecore_types.h" + /* undef the following, we want our version */ #undef FREE #define FREE(ptr) free(ptr); ptr = NULL; @@ -116,8 +119,6 @@ ecore_print_warning(const char *function, return; \ } -typedef unsigned int Ecore_Magic; - EAPI void _ecore_magic_fail(const void *d, Ecore_Magic m, Ecore_Magic req_m, @@ -350,4 +351,26 @@ extern double _ecore_time_loop_time; extern Eina_Bool _ecore_glib_always_integrate; extern Ecore_Select_Function main_loop_select; +Eina_Bool ecore_mempool_init(void); +void ecore_mempool_shutdown(void); +#define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \ + TYPE *Type##_calloc(unsigned int); \ + void Type##_mp_free(TYPE *e); + +GENERIC_ALLOC_FREE_HEADER(Ecore_Animator, ecore_animator); +GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Handler, ecore_event_handler); +GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Filter, ecore_event_filter); +GENERIC_ALLOC_FREE_HEADER(Ecore_Event, ecore_event); +GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Exiter, ecore_idle_exiter); +GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Enterer, ecore_idle_enterer); +GENERIC_ALLOC_FREE_HEADER(Ecore_Idler, ecore_idler); +GENERIC_ALLOC_FREE_HEADER(Ecore_Job, ecore_job); +GENERIC_ALLOC_FREE_HEADER(Ecore_Timer, ecore_timer); +GENERIC_ALLOC_FREE_HEADER(Ecore_Poller, ecore_poller); +GENERIC_ALLOC_FREE_HEADER(Ecore_Pipe, ecore_pipe); +GENERIC_ALLOC_FREE_HEADER(Ecore_Fd_Handler, ecore_fd_handler); +#ifdef _WIN32 +GENERIC_ALLOC_FREE_HEADER(Ecore_Win32_Handler, ecore_win32_handler); +#endif + #endif diff --git a/legacy/ecore/src/lib/ecore/ecore_timer.c b/legacy/ecore/src/lib/ecore/ecore_timer.c index 9c66545bdc..2992d2d863 100644 --- a/legacy/ecore/src/lib/ecore/ecore_timer.c +++ b/legacy/ecore/src/lib/ecore/ecore_timer.c @@ -8,34 +8,6 @@ #include "Ecore.h" #include "ecore_private.h" -#ifdef WANT_ECORE_TIMER_DUMP -# include -# include -# define ECORE_TIMER_DEBUG_BT_NUM 64 -typedef void (*Ecore_Timer_Bt_Func)(); -#endif - -struct _Ecore_Timer -{ - EINA_INLIST; - ECORE_MAGIC; - double in; - double at; - double pending; - Ecore_Task_Cb func; - void *data; - -#ifdef WANT_ECORE_TIMER_DUMP - Ecore_Timer_Bt_Func timer_bt[ECORE_TIMER_DEBUG_BT_NUM]; - int timer_bt_num; -#endif - - int references; - unsigned char delete_me : 1; - unsigned char just_added : 1; - unsigned char frozen : 1; -}; - static void _ecore_timer_set(Ecore_Timer *timer, double at, double in, @@ -140,7 +112,7 @@ ecore_timer_add(double in, _ecore_lock(); if (!func) goto unlock; if (in < 0.0) in = 0.0; - timer = calloc(1, sizeof(Ecore_Timer)); + timer = ecore_timer_calloc(1); if (!timer) goto unlock; ECORE_MAGIC_SET(timer, ECORE_MAGIC_TIMER); now = ecore_time_get(); @@ -470,7 +442,7 @@ _ecore_timer_loop_add(double in, if (!func) return timer; if (in < 0.0) in = 0.0; - timer = calloc(1, sizeof(Ecore_Timer)); + timer = ecore_timer_calloc(1); if (!timer) return timer; ECORE_MAGIC_SET(timer, ECORE_MAGIC_TIMER); now = ecore_loop_time_get(); @@ -510,7 +482,7 @@ _ecore_timer_del(Ecore_Timer *timer) if (timer->delete_me) timers_delete_me--; - free(timer); + ecore_timer_mp_free(timer); return data; } @@ -529,14 +501,14 @@ _ecore_timer_shutdown(void) { timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timers)); ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE); - free(timer); + ecore_timer_mp_free(timer); } while ((timer = suspended)) { suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(suspended)); ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE); - free(timer); + ecore_timer_mp_free(timer); } timer_current = NULL; @@ -563,7 +535,7 @@ _ecore_timer_cleanup(void) } timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer)); ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE); - free(timer); + ecore_timer_mp_free(timer); timers_delete_me--; done++; if (timers_delete_me == 0) return; @@ -583,7 +555,7 @@ _ecore_timer_cleanup(void) } suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer)); ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE); - free(timer); + ecore_timer_mp_free(timer); timers_delete_me--; done++; if (timers_delete_me == 0) return; diff --git a/legacy/ecore/src/lib/ecore/ecore_types.h b/legacy/ecore/src/lib/ecore/ecore_types.h new file mode 100644 index 0000000000..3fc7c39b59 --- /dev/null +++ b/legacy/ecore/src/lib/ecore/ecore_types.h @@ -0,0 +1,184 @@ +#ifndef ECORE_TYPES_H +#define ECORE_TYPES_H + +#ifdef WANT_ECORE_TIMER_DUMP +# include +# include +# define ECORE_TIMER_DEBUG_BT_NUM 64 +typedef void (*Ecore_Timer_Bt_Func)(); +#endif + +struct _Ecore_Animator +{ + EINA_INLIST; + ECORE_MAGIC; + + Ecore_Task_Cb func; + void *data; + + double start, run; + Ecore_Timeline_Cb run_func; + void *run_data; + + Eina_Bool delete_me : 1; + Eina_Bool suspended : 1; +}; + +struct _Ecore_Event_Handler +{ + EINA_INLIST; + ECORE_MAGIC; + int type; + Ecore_Event_Handler_Cb func; + void *data; + int references; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Event_Filter +{ + EINA_INLIST; + ECORE_MAGIC; + Ecore_Data_Cb func_start; + Ecore_Filter_Cb func_filter; + Ecore_End_Cb func_end; + void *loop_data; + void *data; + int references; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Event +{ + EINA_INLIST; + ECORE_MAGIC; + int type; + void *event; + Ecore_End_Cb func_free; + void *data; + int references; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Idle_Enterer +{ + EINA_INLIST; + ECORE_MAGIC; + Ecore_Task_Cb func; + void *data; + int references; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Idle_Exiter +{ + EINA_INLIST; + ECORE_MAGIC; + Ecore_Task_Cb func; + void *data; + int references; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Idler +{ + EINA_INLIST; + ECORE_MAGIC; + Ecore_Task_Cb func; + void *data; + int references; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Job +{ + ECORE_MAGIC; + Ecore_Event *event; + Ecore_Cb func; + void *data; +}; + +struct _Ecore_Fd_Handler +{ + EINA_INLIST; + ECORE_MAGIC; + Ecore_Fd_Handler *next_ready; + int fd; + Ecore_Fd_Handler_Flags flags; + Ecore_Fd_Cb func; + void *data; + Ecore_Fd_Cb buf_func; + void *buf_data; + Ecore_Fd_Prep_Cb prep_func; + void *prep_data; + int references; + Eina_Bool read_active : 1; + Eina_Bool write_active : 1; + Eina_Bool error_active : 1; + Eina_Bool delete_me : 1; +#if defined(USE_G_MAIN_LOOP) + GPollFD gfd; +#endif +}; + +#ifdef _WIN32 +struct _Ecore_Win32_Handler +{ + EINA_INLIST; + ECORE_MAGIC; + HANDLE h; + Ecore_Win32_Handle_Cb func; + void *data; + int references; + Eina_Bool delete_me : 1; +}; +#endif + +struct _Ecore_Pipe +{ + ECORE_MAGIC; + int fd_read; + int fd_write; + Ecore_Fd_Handler *fd_handler; + const void *data; + Ecore_Pipe_Cb handler; + unsigned int len; + int handling; + size_t already_read; + void *passed_data; + int message; + Eina_Bool delete_me : 1; +}; + +struct _Ecore_Poller +{ + EINA_INLIST; + ECORE_MAGIC; + int ibit; + unsigned char delete_me : 1; + Ecore_Task_Cb func; + void *data; +}; + +struct _Ecore_Timer +{ + EINA_INLIST; + ECORE_MAGIC; + double in; + double at; + double pending; + Ecore_Task_Cb func; + void *data; + +#ifdef WANT_ECORE_TIMER_DUMP + Ecore_Timer_Bt_Func timer_bt[ECORE_TIMER_DEBUG_BT_NUM]; + int timer_bt_num; +#endif + + int references; + unsigned char delete_me : 1; + unsigned char just_added : 1; + unsigned char frozen : 1; +}; + +#endif