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;
else
*next_time = 0;
- _ecore_main_prepare_handlers();
+ if (fd_handlers_with_prep)
+ _ecore_main_prepare_handlers();
}
in_main_loop--;
{
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();
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),
_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;
}
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;
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));
_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;
}
}
/* 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())
/* 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 ... */