ecore: Create a lockless ecore_main_fd_handler_del

Signed-off-by: Mike McCormack <mj.mccormack@samsung.com>

SVN revision: 62374
This commit is contained in:
Mike McCormack 2011-08-12 05:22:07 +00:00 committed by Mike McCormack
parent 25b0ab9ca7
commit 01e790ed40
3 changed files with 26 additions and 17 deletions

View File

@ -789,6 +789,25 @@ _ecore_main_loop_shutdown(void)
}
}
void *
_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
{
if (fd_handler->delete_me)
{
ERR("fdh %p deleted twice", fd_handler);
return NULL;
}
_ecore_main_fdh_poll_del(fd_handler);
fd_handler->delete_me = EINA_TRUE;
fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fd_handler);
if (fd_handler->prep_func && fd_handlers_with_prep)
fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler);
if (fd_handler->buf_func && fd_handlers_with_buffer)
fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler);
return fd_handler->data;
}
/**
* @addtogroup Ecore_Main_Loop_Group
*
@ -998,6 +1017,7 @@ ecore_main_win32_handler_add(void *h __UNUSED__, Ecore_Win32_Handle_Cb func __UN
}
#endif
/**
* Deletes the given FD handler.
* @param fd_handler The given FD handler.
@ -1023,20 +1043,7 @@ ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
"ecore_main_fd_handler_del");
goto unlock;
}
if (fd_handler->delete_me)
{
ERR("fdh %p deleted twice", fd_handler);
goto unlock;
}
_ecore_main_fdh_poll_del(fd_handler);
fd_handler->delete_me = EINA_TRUE;
fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fd_handler);
if (fd_handler->prep_func && fd_handlers_with_prep)
fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler);
if (fd_handler->buf_func && fd_handlers_with_buffer)
fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler);
ret = fd_handler->data;
ret = _ecore_main_fd_handler_del(fd_handler);
unlock:
_ecore_unlock();
return ret;

View File

@ -157,7 +157,7 @@ ecore_pipe_del(Ecore_Pipe *p)
}
p->delete_me = EINA_TRUE;
if (p->handling > 0) return (void *)p->data;
if (p->fd_handler) ecore_main_fd_handler_del(p->fd_handler);
if (p->fd_handler) _ecore_main_fd_handler_del(p->fd_handler);
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;
@ -180,7 +180,7 @@ ecore_pipe_read_close(Ecore_Pipe *p)
}
if (p->fd_handler)
{
ecore_main_fd_handler_del(p->fd_handler);
_ecore_main_fd_handler_del(p->fd_handler);
p->fd_handler = NULL;
}
if (p->fd_read != PIPE_FD_INVALID)
@ -207,7 +207,7 @@ ecore_pipe_freeze(Ecore_Pipe *p)
}
if (p->fd_handler)
{
ecore_main_fd_handler_del(p->fd_handler);
_ecore_main_fd_handler_del(p->fd_handler);
p->fd_handler = NULL;
}
}

View File

@ -157,6 +157,8 @@ void *_ecore_event_signal_exit_new(void);
void *_ecore_event_signal_power_new(void);
void *_ecore_event_signal_realtime_new(void);
void *_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
void _ecore_main_shutdown(void);
#ifdef _WIN32