Enlightenment CVS committal Author : raster Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore Modified Files: ecore_events.c ecore_private.h Log Message: optimise ecore and ecore_evas. makes e look better in benchmarks... and well.. it does make it faster for certain situations/scenarios... and well.. in general too. =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_events.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- ecore_events.c 2 Mar 2005 07:06:32 -0000 1.15 +++ ecore_events.c 28 May 2005 03:57:17 -0000 1.16 @@ -4,8 +4,10 @@ static int events_num = 0; static Ecore_Event *events = NULL; -static Ecore_Event_Handler *event_handlers = NULL; -static int event_handlers_delete_me = 0; +static Ecore_Event_Handler **event_handlers = NULL; +static int event_handlers_num = 0; +static int event_handlers_alloc_num = 0; +static Ecore_Oldlist_Data *event_handlers_delete_list = NULL; static Ecore_Event_Filter *event_filters = NULL; static int event_filters_delete_me = 0; @@ -51,7 +53,30 @@ eh->type = type; eh->func = func; eh->data = (void *)data; - event_handlers = _ecore_list_append(event_handlers, eh); + if (type >= (event_handlers_num - 1)) + { + int p_alloc_num; + + p_alloc_num = event_handlers_alloc_num; + event_handlers_num = type + 1; + if (event_handlers_num > event_handlers_alloc_num) + { + Ecore_Event_Handler **new_handlers; + int i; + + event_handlers_alloc_num = ((event_handlers_num + 16) / 16) * 16; + new_handlers = realloc(event_handlers, event_handlers_alloc_num * sizeof(Ecore_Event_Handler *)); + if (!new_handlers) + { + free(eh); + return NULL; + } + event_handlers = new_handlers; + for (i = p_alloc_num; i < event_handlers_alloc_num; i++) + event_handlers[i] = NULL; + } + } + event_handlers[type] = _ecore_list_append(event_handlers[type], eh); return eh; } @@ -68,6 +93,8 @@ void * ecore_event_handler_del(Ecore_Event_Handler *event_handler) { + Ecore_Oldlist_Data *node; + if (!ECORE_MAGIC_CHECK(event_handler, ECORE_MAGIC_EVENT_HANDLER)) { ECORE_MAGIC_FAIL(event_handler, ECORE_MAGIC_EVENT_HANDLER, @@ -75,7 +102,9 @@ return NULL; } event_handler->delete_me = 1; - event_handlers_delete_me = 1; + node = calloc(1, sizeof(Ecore_Oldlist_Data)); + node->data = event_handler; + event_handlers_delete_list = _ecore_list_append(event_handlers_delete_list, node); return event_handler->data; } @@ -256,17 +285,33 @@ void _ecore_event_shutdown(void) { + int i; + while (events) _ecore_event_del(events); - while (event_handlers) + for (i = 0; i < event_handlers_num; i++) { - Ecore_Event_Handler *eh; + while (event_handlers[i]) + { + Ecore_Event_Handler *eh; + + eh = event_handlers[i]; + event_handlers[i] = _ecore_list_remove(event_handlers[i], eh); + ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE); + free(eh); + } + } + while (event_handlers_delete_list) + { + Ecore_Oldlist_Data *ehd; - eh = event_handlers; - event_handlers = _ecore_list_remove(event_handlers, eh); - ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE); - free(eh); + ehd = event_handlers_delete_list; + event_handlers_delete_list = _ecore_list_remove(event_handlers_delete_list, ehd); + free(ehd); } - event_handlers_delete_me = 0; + if (event_handlers) free(event_handlers); + event_handlers = NULL; + event_handlers_num = 0; + event_handlers_alloc_num = 0; while (event_filters) { Ecore_Event_Filter *ef; @@ -320,17 +365,18 @@ void _ecore_event_call(void) { - Ecore_Oldlist *l; + Ecore_Oldlist *l, *ll; + Ecore_Event *e; + Ecore_Event_Filter *ef; + Ecore_Event_Handler *eh; + Ecore_Oldlist_Data *ehd; + int handle_count; for (l = (Ecore_Oldlist *)event_filters; l; l = l->next) { - Ecore_Event_Filter *ef; - ef = (Ecore_Event_Filter *)l; if (!ef->delete_me) { - Ecore_Oldlist *ll; - if (ef->func_start) ef->loop_data = ef->func_start(ef->data); for (ll = (Ecore_Oldlist *)events; ll; ll = ll->next) @@ -353,8 +399,6 @@ { for (l = (Ecore_Oldlist *)event_filters; l;) { - Ecore_Event_Filter *ef; - ef = (Ecore_Event_Filter *)l; l = l->next; if (ef->delete_me) @@ -369,57 +413,43 @@ // printf("EVENT BATCH...\n"); for (l = (Ecore_Oldlist *)events; l; l = l->next) { - Ecore_Oldlist *ll; - Ecore_Event *e; - e = (Ecore_Event *)l; if (!e->delete_me) { - int handle_count; - handle_count = 0; ecore_raw_event_type = e->type; ecore_raw_event_event = e->event; // printf("HANDLE ev type %i, %p\n", e->type, e->event); - for (ll = (Ecore_Oldlist *)event_handlers; ll; ll = ll->next) + for (ll = (Ecore_Oldlist *)event_handlers[e->type]; ll; ll = ll->next) { - Ecore_Event_Handler *eh; - eh = (Ecore_Event_Handler *)ll; if (!eh->delete_me) { - if (eh->type == e->type) - { - handle_count++; - if (!eh->func(eh->data, e->type, e->event)) - break; /* 0 == "call no further handlers" */ - } + handle_count++; + if (!eh->func(eh->data, e->type, e->event)) + break; /* 0 == "call no further handlers" */ } } /* if no handlers were set for EXIT signal - then default is */ /* to quit the main loop */ if ((e->type == ECORE_EVENT_SIGNAL_EXIT) && (handle_count == 0)) ecore_main_loop_quit(); - ecore_raw_event_type = ECORE_EVENT_NONE; - ecore_raw_event_event = NULL; } } + ecore_raw_event_type = ECORE_EVENT_NONE; + ecore_raw_event_event = NULL; + while (events) _ecore_event_del(events); - if (!event_handlers_delete_me) return; - for (l = (Ecore_Oldlist *)event_handlers; l;) + while (event_handlers_delete_list) { - Ecore_Event_Handler *eh; - - eh = (Ecore_Event_Handler *)l; - l = l->next; - if (eh->delete_me) - { - event_handlers = _ecore_list_remove(event_handlers, eh); - ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE); - free(eh); - } + ehd = event_handlers_delete_list; + eh = ehd->data; + event_handlers[eh->type] = _ecore_list_remove(event_handlers[eh->type], eh); + event_handlers_delete_list = _ecore_list_remove(event_handlers_delete_list, ehd); + ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE); + free(eh); + free(ehd); } - event_handlers_delete_me = 0; } #ifndef WIN32 =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_private.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- ecore_private.h 28 Mar 2005 08:55:59 -0000 1.13 +++ ecore_private.h 28 May 2005 03:57:17 -0000 1.14 @@ -44,7 +44,8 @@ typedef unsigned int Ecore_Magic; -typedef struct _Ecore_Oldlist Ecore_Oldlist; +typedef struct _Ecore_Oldlist Ecore_Oldlist; +typedef struct _Ecore_Oldlist_Data Ecore_Oldlist_Data; struct _Ecore_Oldlist { @@ -52,6 +53,12 @@ Ecore_Oldlist *last; }; +struct _Ecore_Oldlist_Data +{ + Ecore_Oldlist __list_data; + void *data; +}; + #ifndef _ECORE_H enum _Ecore_Fd_Handler_Flags { ------------------------------------------------------- This SF.Net email is sponsored by Yahoo. Introducing Yahoo! Search Developer Network - Create apps using Yahoo! Search APIs Find out how you can build Yahoo! directly into your own Applications - visit http://developer.yahoo.net/?fr=offad-ysdn-ostg-q22005 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs