From 1f28b68fe032db67ede9f85bcefd43e66f074cc0 Mon Sep 17 00:00:00 2001 From: discomfitor Date: Wed, 17 Nov 2010 06:50:52 +0000 Subject: [PATCH] scaling optimizations round 2: add list for fd handler buffer functions also delete fdhs from prep/buf lists on cleanups when possible git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@54619 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/ecore/ecore_main.c | 48 ++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index 064ec8c..4a28440 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -117,6 +117,7 @@ static Ecore_Fd_Handler *fd_handlers = NULL; static Ecore_Fd_Handler *fd_handler_current = NULL; static int fd_handlers_delete_me = 0; static Eina_List *fd_handlers_with_prep = NULL; +static Eina_List *fd_handlers_with_buffer = NULL; #ifdef _WIN32 static Ecore_Win32_Handler *win32_handlers = NULL; static Ecore_Win32_Handler *win32_handler_current = NULL; @@ -400,7 +401,8 @@ _ecore_main_gsource_prepare(GSource *source, gint *next_time) else *next_time = 0; - _ecore_main_prepare_handlers(); + if (fd_handlers_with_prep) + _ecore_main_prepare_handlers(); } in_main_loop--; @@ -479,7 +481,8 @@ _ecore_main_gsource_dispatch(GSource *source, GSourceFunc callback, gpointer use { INF("work"); _ecore_main_fd_handlers_call(); - _ecore_main_fd_handlers_buf_call(); + if (fd_handlers_with_buffer) + _ecore_main_fd_handlers_buf_call(); while (_ecore_signal_count_get()) _ecore_signal_call(); _ecore_event_call(); _ecore_main_fd_handlers_cleanup(); @@ -744,6 +747,8 @@ ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func fdh->func = func; fdh->data = (void *)data; fdh->buf_func = buf_func; + if (buf_func) + fd_handlers_with_buffer = eina_list_append(fd_handlers_with_buffer, fdh); fdh->buf_data = (void *)buf_data; fd_handlers = (Ecore_Fd_Handler *) eina_inlist_append(EINA_INLIST_GET(fd_handlers), @@ -806,6 +811,8 @@ ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler) _ecore_main_fdh_poll_del(fd_handler); if (fd_handler->prep_func) fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler); + if (fd_handler->buf_func) + fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler); return fd_handler->data; } @@ -948,7 +955,11 @@ _ecore_main_shutdown(void) ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE); free(fdh); } - eina_list_free(fd_handlers_with_prep); + if (fd_handlers_with_buffer) + eina_list_free(fd_handlers_with_buffer); + fd_handlers_with_buffer = NULL; + if (fd_handlers_with_prep) + eina_list_free(fd_handlers_with_prep); fd_handlers_with_prep = NULL; fd_handlers_delete_me = 0; fd_handler_current = NULL; @@ -1171,7 +1182,10 @@ _ecore_main_fd_handlers_cleanup(void) deleted_in_use++; continue; } - + if (fdh->buf_func) + fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fdh); + if (fdh->prep_func) + fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fdh); fd_handlers = (Ecore_Fd_Handler *) eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh)); @@ -1262,24 +1276,24 @@ static int _ecore_main_fd_handlers_buf_call(void) { Ecore_Fd_Handler *fdh; + Eina_List *l, *l2; int ret; ret = 0; - EINA_INLIST_FOREACH(fd_handlers, fdh) + EINA_LIST_FOREACH_SAFE(fd_handlers_with_buffer, l, l2, fdh) { - if (!fdh->delete_me) + if ((!fdh->delete_me) && fdh->buf_func) { - if (fdh->buf_func) + fdh->references++; + if (fdh->buf_func(fdh->buf_data, fdh)) { - fdh->references++; - if (fdh->buf_func(fdh->buf_data, fdh)) - { - ret |= fdh->func(fdh->data, fdh); - fdh->read_active = 1; - } - fdh->references--; + ret |= fdh->func(fdh->data, fdh); + fdh->read_active = 1; } + fdh->references--; } + else + fd_handlers_with_buffer = eina_list_remove_list(fd_handlers_with_buffer, l); } return ret; } @@ -1325,7 +1339,8 @@ _ecore_main_loop_iterate_internal(int once_only) } /* if these calls caused any buffered events to appear - deal with them */ - _ecore_main_fd_handlers_buf_call(); + if (fd_handlers_with_buffer) + _ecore_main_fd_handlers_buf_call(); /* if there are any - jump to processing them */ if (_ecore_event_exist()) @@ -1423,7 +1438,8 @@ _ecore_main_loop_iterate_internal(int once_only) /* post events onto the ecore event pipe if necessary */ process_events: _ecore_main_fd_handlers_call(); - _ecore_main_fd_handlers_buf_call(); + if (fd_handlers_with_buffer) + _ecore_main_fd_handlers_buf_call(); /* process signals into events .... */ while (_ecore_signal_count_get()) _ecore_signal_call(); /* handle events ... */ -- 2.7.4