* add a _del function for win32 HANDLEs

* delete HANDLES when asked
 * minor fixes in the win32 code

SVN revision: 43939
This commit is contained in:
Vincent Torri 2009-11-23 23:09:48 +00:00
parent 76fd6276a6
commit f4e1c3a9b9
4 changed files with 89 additions and 19 deletions

View File

@ -298,6 +298,7 @@ extern "C" {
EAPI void ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags); EAPI void ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
EAPI Ecore_Win32_Handler *ecore_main_win32_handler_add(void *h, int (*func) (void *data, Ecore_Win32_Handler *wh), const void *data); EAPI Ecore_Win32_Handler *ecore_main_win32_handler_add(void *h, int (*func) (void *data, Ecore_Win32_Handler *wh), const void *data);
EAPI void *ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler);
EAPI Ecore_Pipe *ecore_pipe_add(void (*handler) (void *data, void *buffer, unsigned int nbyte), const void *data); EAPI Ecore_Pipe *ecore_pipe_add(void (*handler) (void *data, void *buffer, unsigned int nbyte), const void *data);
EAPI void *ecore_pipe_del(Ecore_Pipe *p); EAPI void *ecore_pipe_del(Ecore_Pipe *p);

View File

@ -193,6 +193,9 @@ _ecore_magic_string_get(Ecore_Magic m)
case ECORE_MAGIC_FD_HANDLER: case ECORE_MAGIC_FD_HANDLER:
return "Ecore_Fd_Handler (Fd Handler)"; return "Ecore_Fd_Handler (Fd Handler)";
break; break;
case ECORE_MAGIC_WIN32_HANDLER:
return "Ecore_Win32_Handler (Win32 Handler)";
break;
case ECORE_MAGIC_EVENT_HANDLER: case ECORE_MAGIC_EVENT_HANDLER:
return "Ecore_Event_Handler (Event Handler)"; return "Ecore_Event_Handler (Event Handler)";
break; break;

View File

@ -38,7 +38,9 @@
static int _ecore_main_select(double timeout); static int _ecore_main_select(double timeout);
static void _ecore_main_fd_handlers_cleanup(void); static void _ecore_main_fd_handlers_cleanup(void);
#ifndef _WIN32
static void _ecore_main_fd_handlers_bads_rem(void); static void _ecore_main_fd_handlers_bads_rem(void);
#endif
static void _ecore_main_fd_handlers_call(void); static void _ecore_main_fd_handlers_call(void);
static int _ecore_main_fd_handlers_buf_call(void); static int _ecore_main_fd_handlers_buf_call(void);
static void _ecore_main_loop_iterate_internal(int once_only); static void _ecore_main_loop_iterate_internal(int once_only);
@ -46,6 +48,7 @@ static void _ecore_main_loop_iterate_internal(int once_only);
#ifdef _WIN32 #ifdef _WIN32
static int _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, static int _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout); fd_set *exceptfds, struct timeval *timeout);
static void _ecore_main_win32_handlers_cleanup(void);
#endif #endif
static int in_main_loop = 0; static int in_main_loop = 0;
@ -54,6 +57,7 @@ static Ecore_Fd_Handler *fd_handlers = NULL;
static int fd_handlers_delete_me = 0; static int fd_handlers_delete_me = 0;
#ifdef _WIN32 #ifdef _WIN32
static Ecore_Win32_Handler *win32_handlers = NULL; static Ecore_Win32_Handler *win32_handlers = NULL;
static int win32_handlers_delete_me = 0;
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
@ -234,6 +238,7 @@ ecore_main_win32_handler_add(void *h,
if (!wh) return NULL; if (!wh) return NULL;
ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER); ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER);
wh->h = (HANDLE)h; wh->h = (HANDLE)h;
wh->delete_me = 0;
wh->func = func; wh->func = func;
wh->data = (void *)data; wh->data = (void *)data;
win32_handlers = (Ecore_Win32_Handler *)eina_inlist_append(EINA_INLIST_GET(win32_handlers), win32_handlers = (Ecore_Win32_Handler *)eina_inlist_append(EINA_INLIST_GET(win32_handlers),
@ -271,6 +276,28 @@ ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
return fd_handler->data; return fd_handler->data;
} }
#ifdef _WIN32
EAPI void *
ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler)
{
if (!ECORE_MAGIC_CHECK(win32_handler, ECORE_MAGIC_WIN32_HANDLER))
{
ECORE_MAGIC_FAIL(win32_handler, ECORE_MAGIC_WIN32_HANDLER,
"ecore_main_win32_handler_del");
return NULL;
}
win32_handler->delete_me = 1;
win32_handlers_delete_me = 1;
return win32_handler->data;
}
#else
EAPI void *
ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler)
{
return NULL;
}
#endif
EAPI void EAPI void
ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, void (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data) ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, void (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data)
{ {
@ -369,6 +396,20 @@ _ecore_main_shutdown(void)
free(fdh); free(fdh);
} }
fd_handlers_delete_me = 0; fd_handlers_delete_me = 0;
#ifdef _WIN32
while (win32_handlers)
{
Ecore_Win32_Handler *wh;
wh = win32_handlers;
win32_handlers = (Ecore_Win32_Handler *) eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
EINA_INLIST_GET(wh));
ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
free(wh);
}
win32_handlers_delete_me = 0;
#endif
} }
static int static int
@ -437,10 +478,7 @@ _ecore_main_select(double timeout)
_ecore_loop_time = ecore_time_get(); _ecore_loop_time = ecore_time_get();
if (ret < 0) if (ret < 0)
{ {
#ifdef _WIN32 #ifndef _WIN32
fprintf(stderr, "main_loop_select error %d\n", WSAGetLastError());
if (WSAEINTR == WSAGetLastError()) return -1;
#else
if (errno == EINTR) return -1; if (errno == EINTR) return -1;
else if (errno == EBADF) else if (errno == EBADF)
_ecore_main_fd_handlers_bads_rem(); _ecore_main_fd_handlers_bads_rem();
@ -459,11 +497,15 @@ _ecore_main_select(double timeout)
fdh->error_active = 1; fdh->error_active = 1;
} }
_ecore_main_fd_handlers_cleanup(); _ecore_main_fd_handlers_cleanup();
#ifdef _WIN32
_ecore_main_win32_handlers_cleanup();
#endif
return 1; return 1;
} }
return 0; return 0;
} }
#ifndef _WIN32
static void static void
_ecore_main_fd_handlers_bads_rem(void) _ecore_main_fd_handlers_bads_rem(void)
{ {
@ -501,6 +543,7 @@ _ecore_main_fd_handlers_bads_rem(void)
_ecore_main_fd_handlers_cleanup(); _ecore_main_fd_handlers_cleanup();
} }
#endif
static void static void
_ecore_main_fd_handlers_cleanup(void) _ecore_main_fd_handlers_cleanup(void)
@ -526,6 +569,31 @@ _ecore_main_fd_handlers_cleanup(void)
fd_handlers_delete_me = 0; fd_handlers_delete_me = 0;
} }
#ifdef _WIN32
static void
_ecore_main_win32_handlers_cleanup(void)
{
Ecore_Win32_Handler *wh;
Eina_Inlist *l;
if (!win32_handlers_delete_me) return;
for (l = EINA_INLIST_GET(win32_handlers); l; )
{
wh = (Ecore_Win32_Handler *)l;
l = l->next;
if (wh->delete_me)
{
win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
EINA_INLIST_GET(wh));
ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
free(wh);
}
}
win32_handlers_delete_me = 0;
}
#endif
static void static void
_ecore_main_fd_handlers_call(void) _ecore_main_fd_handlers_call(void)
{ {
@ -742,9 +810,9 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds,
HANDLE objects[MAXIMUM_WAIT_OBJECTS]; HANDLE objects[MAXIMUM_WAIT_OBJECTS];
int sockets[MAXIMUM_WAIT_OBJECTS]; int sockets[MAXIMUM_WAIT_OBJECTS];
Ecore_Win32_Handler *wh; Ecore_Win32_Handler *wh;
int objects_nbr = 0; unsigned int objects_nbr = 0;
int handles_nbr = 0; unsigned int handles_nbr = 0;
int events_nbr = 0; unsigned int events_nbr = 0;
DWORD result; DWORD result;
DWORD timeout; DWORD timeout;
MSG msg; MSG msg;
@ -798,7 +866,7 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds,
else else
timeout = (DWORD)(tv->tv_sec * 1000.0 + tv->tv_usec / 1000.0); timeout = (DWORD)(tv->tv_sec * 1000.0 + tv->tv_usec / 1000.0);
if (timeout == 0) return; if (timeout == 0) return 0;
result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, FALSE, result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, FALSE,
timeout, QS_ALLINPUT); timeout, QS_ALLINPUT);
@ -815,7 +883,7 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds,
msg = evil_last_error_get(); msg = evil_last_error_get();
printf (" * %s\n", msg); printf (" * %s\n", msg);
free(msg); free(msg);
res = 0; res = -1;
} }
else if (result == WAIT_TIMEOUT) else if (result == WAIT_TIMEOUT)
{ {
@ -852,28 +920,25 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds,
EINA_INLIST_FOREACH(win32_handlers, wh) EINA_INLIST_FOREACH(win32_handlers, wh)
{ {
if (objects[result - WAIT_OBJECT_0] == wh->h) if (objects[result - WAIT_OBJECT_0] == wh->h)
wh->func(wh->data, wh); if (!wh->delete_me)
if (!wh->func(wh->data, wh))
{
wh->delete_me = 1;
win32_handlers_delete_me = 1;
}
} }
res = 1; res = 1;
} }
else else
{ {
fprintf(stderr, "unknown result...\n"); fprintf(stderr, "unknown result...\n");
res = -1;
} }
/* Remove event objects again */ /* Remove event objects again */
for(i = 0; i < events_nbr; i++) for(i = 0; i < events_nbr; i++)
WSACloseEvent(objects[i]); WSACloseEvent(objects[i]);
/* remove HANDLEs */
while (win32_handlers)
{
wh = win32_handlers;
win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
EINA_INLIST_GET(wh));
free(wh);
}
return res; return res;
} }
#endif #endif

View File

@ -338,6 +338,7 @@ struct _Ecore_Win32_Handler
HANDLE h; HANDLE h;
int (*func) (void *data, Ecore_Win32_Handler *win32_handler); int (*func) (void *data, Ecore_Win32_Handler *win32_handler);
void *data; void *data;
int delete_me : 1;
}; };
#endif #endif