Make the event loop expose a Windows event interface.

This allows event loop users to specify Win32 events to wait on,
thus making the event loop more flexible.
This commit is contained in:
Etienne Dechamps 2014-06-28 15:15:41 +01:00
parent 611217c96e
commit 2f9a1d4ab5
2 changed files with 29 additions and 11 deletions

View file

@ -72,9 +72,11 @@ void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags) {
io->fd = fd;
#ifdef HAVE_MINGW
io->event = WSACreateEvent();
if (io->event == WSA_INVALID_EVENT)
abort();
if (io->fd != -1) {
io->event = WSACreateEvent();
if (io->event == WSA_INVALID_EVENT)
abort();
}
event_count++;
#endif
io->cb = cb;
@ -87,10 +89,19 @@ void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags) {
abort();
}
#ifdef HAVE_MINGW
void io_add_event(io_t *io, io_cb_t cb, void *data, WSAEVENT event) {
io_add(io, cb, data, -1, 0);
io->event = event;
}
#endif
void io_set(io_t *io, int flags) {
if (flags == io->flags)
return;
io->flags = flags;
if (io->fd == -1)
return;
#ifndef HAVE_MINGW
if(flags & IO_READ)
@ -119,7 +130,7 @@ void io_del(io_t *io) {
io_set(io, 0);
#ifdef HAVE_MINGW
if (WSACloseEvent(io->event) == FALSE)
if (io->fd != -1 && WSACloseEvent(io->event) == FALSE)
abort();
event_count--;
#endif
@ -334,13 +345,17 @@ bool event_loop(void) {
if (!io)
abort();
WSANETWORKEVENTS network_events;
if (WSAEnumNetworkEvents(io->fd, io->event, &network_events) != 0)
return false;
if (network_events.lNetworkEvents & WRITE_EVENTS)
io->cb(io->data, IO_WRITE);
if (network_events.lNetworkEvents & READ_EVENTS)
io->cb(io->data, IO_READ);
if (io->fd == -1) {
io->cb(io->data, 0);
} else {
WSANETWORKEVENTS network_events;
if (WSAEnumNetworkEvents(io->fd, io->event, &network_events) != 0)
return false;
if (network_events.lNetworkEvents & WRITE_EVENTS)
io->cb(io->data, IO_WRITE);
if (network_events.lNetworkEvents & READ_EVENTS)
io->cb(io->data, IO_READ);
}
}
#endif

View file

@ -57,6 +57,9 @@ typedef struct signal_t {
extern struct timeval now;
extern void io_add(io_t *io, io_cb_t cb, void *data, int fd, int flags);
#ifdef HAVE_MINGW
extern void io_add_event(io_t *io, io_cb_t cb, void* data, WSAEVENT event);
#endif
extern void io_del(io_t *io);
extern void io_set(io_t *io, int flags);