add doxy for ecore_main_fd_handler_prepare_callback_set, add massive optimization for fd handler scaling (only noticeable with 10000+ fd handlers) to only attempt running prep functions for handlers which have them

SVN revision: 54617
This commit is contained in:
Mike Blumenkrantz 2010-11-17 06:24:49 +00:00
parent 027c174f9d
commit d9882a6c00
1 changed files with 23 additions and 4 deletions

View File

@ -116,6 +116,7 @@ static int do_quit = 0;
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;
#ifdef _WIN32
static Ecore_Win32_Handler *win32_handlers = NULL;
static Ecore_Win32_Handler *win32_handler_current = NULL;
@ -803,6 +804,8 @@ ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
fd_handler->delete_me = 1;
fd_handlers_delete_me = 1;
_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);
return fd_handler->data;
}
@ -828,6 +831,13 @@ ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler __UNUSED__)
}
#endif
/**
* @brief Set the prepare callback with data for a given #Ecore_Fd_Handler
* @param fd_handler The fd handler
* @param func The prep function
* @param data The data to pass to the prep function
* This function will be called prior to the the fd handler's callback function.
*/
EAPI void
ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Prep_Cb func, const void *data)
{
@ -839,6 +849,9 @@ ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_F
}
fd_handler->prep_func = func;
fd_handler->prep_data = (void *)data;
if (fd_handlers_with_prep)
fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler);
fd_handlers_with_prep = eina_list_append(fd_handlers_with_prep, fd_handler);
}
/**
@ -935,6 +948,8 @@ _ecore_main_shutdown(void)
ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
free(fdh);
}
eina_list_free(fd_handlers_with_prep);
fd_handlers_with_prep = NULL;
fd_handlers_delete_me = 0;
fd_handler_current = NULL;
@ -958,16 +973,19 @@ static void
_ecore_main_prepare_handlers(void)
{
Ecore_Fd_Handler *fdh;
Eina_List *l, *l2;
/* call the prepare callback for all handlers */
EINA_INLIST_FOREACH(fd_handlers, fdh)
/* call the prepare callback for all handlers with prep functions */
EINA_LIST_FOREACH_SAFE(fd_handlers_with_prep, l, l2, fdh)
{
if (!fdh->delete_me && fdh->prep_func)
{
fdh->references++;
fdh->prep_func (fdh->prep_data, fdh);
fdh->prep_func(fdh->prep_data, fdh);
fdh->references--;
}
else
fd_handlers_with_prep = eina_list_remove_list(fd_handlers_with_prep, l);
}
}
@ -1008,7 +1026,8 @@ _ecore_main_select(double timeout)
FD_ZERO(&exfds);
/* call the prepare callback for all handlers */
_ecore_main_prepare_handlers();
if (fd_handlers_with_prep)
_ecore_main_prepare_handlers();
#ifndef HAVE_EPOLL
Ecore_Fd_Handler *fdh;