diff --git a/include/array.h b/include/array.h index 44cd290..d5dab00 100644 --- a/include/array.h +++ b/include/array.h @@ -7,7 +7,7 @@ # define ARRAY(type, name) \ - typedef Array type ## Array; \ + typedef Array name ## Array; \ Array * name ## array_new(void) { return array_new(sizeof(type)); } @@ -25,7 +25,7 @@ void array_delete(Array * array); int array_append(Array * array, void * data); void array_apply(Array * array, ArrayApplyFunc func, void * userdata); unsigned int array_count(Array * array); -int array_get(Array * array, unsigned int pos, void ** data); +int array_get(Array * array, unsigned int pos, void * data); int array_remove_pos(Array * array, unsigned int pos); int array_set(Array * array, unsigned int pos, void * data); diff --git a/include/event.h b/include/event.h index a339f2c..5e62985 100644 --- a/include/event.h +++ b/include/event.h @@ -28,6 +28,6 @@ int event_register_io_read(Event * event, int fd, EventIOFunc func, int event_register_io_write(Event * event, int fd, EventIOFunc func, void * userdata); int event_register_timeout(Event * event, struct timeval timeout, - EventTimeoutFunc * func, void * userdata); + EventTimeoutFunc func, void * userdata); #endif /* !_EVENT_H */ diff --git a/src/array.c b/src/array.c index d9d58db..f20a64c 100644 --- a/src/array.c +++ b/src/array.c @@ -3,7 +3,9 @@ #include -#include +#ifdef DEBUG +# include +#endif #include #include "array.h" @@ -20,6 +22,9 @@ Array * array_new(unsigned int size) { Array * array; +#ifdef DEBUG + fprintf(stderr, "%s%d%s", "array_new(", size, ")\n"); +#endif if((array = malloc(sizeof(Array))) == NULL) return NULL; array->data = NULL; @@ -41,10 +46,7 @@ int array_append(Array * array, void * data) void * p; if((p = realloc(array->data, array->size * (array->count + 1))) == NULL) - { - perror("malloc"); return 1; - } array->data = p; memcpy(&p[array->size * array->count], data, array->size); array->count++; @@ -67,11 +69,14 @@ unsigned int array_count(Array * array) } -int array_get(Array * array, unsigned int pos, void ** data) +int array_get(Array * array, unsigned int pos, void * data) { +#ifdef DEBUG + fprintf(stderr, "%s%d%s", "array_get(array, ", pos, ", data)\n"); +#endif if(pos >= array->count) return 1; - memcpy(*data, &array->data[pos * array->size], array->size); + memcpy(data, &array->data[pos * array->size], array->size); return 0; } diff --git a/src/event.c b/src/event.c index e75f075..7b672d2 100644 --- a/src/event.c +++ b/src/event.c @@ -25,7 +25,7 @@ typedef struct _EventTimeout EventTimeoutFunc func; void * data; } EventTimeout; -ARRAY(EventTimeout, eventtimeout); +ARRAY(EventTimeout *, eventtimeout); typedef struct _EventIO { @@ -33,17 +33,17 @@ typedef struct _EventIO EventIOFunc func; void * data; } EventIO; -ARRAY(EventIO, eventio); +ARRAY(EventIO *, eventio); struct _Event { + int fdmax; fd_set rfds; fd_set wfds; - EventTimeoutArray * timeouts; + eventioArray * reads; + eventioArray * writes; + eventtimeoutArray * timeouts; struct timeval timeout; - EventIOArray * reads; - EventIOArray * writes; - int fdmax; }; @@ -89,17 +89,21 @@ int event_loop(Event * event) { struct timeval * timeout = event->timeout.tv_sec == LONG_MAX && event->timeout.tv_usec == LONG_MAX ? NULL : &event->timeout; + fd_set rfds; + fd_set wfds; int ret; - for(; (ret = select(event->fdmax+1, &event->rfds, &event->wfds, NULL, + for(rfds = event->rfds, wfds = event->wfds; + (ret = select(event->fdmax+1, &rfds, &wfds, NULL, timeout)) != -1; - timeout = event->timeout.tv_sec == LONG_MAX - && event->timeout.tv_usec == LONG_MAX - ? NULL : &event->timeout) + rfds = event->rfds, wfds = event->wfds) { _loop_timeouts(event); _loop_reads(event); _loop_writes(event); + timeout = event->timeout.tv_sec == LONG_MAX + && event->timeout.tv_usec == LONG_MAX + ? NULL : &event->timeout; } if(ret != -1) return 0; @@ -169,8 +173,9 @@ int event_register_io_read(Event * event, int fd, EventIOFunc func, eventio->fd = fd; eventio->func = func; eventio->data = userdata; - array_append(event->reads, eventio); event->fdmax = max(event->fdmax, fd); + FD_SET(fd, &event->rfds); + array_append(event->reads, eventio); return 0; } @@ -186,15 +191,16 @@ int event_register_io_write(Event * event, int fd, EventIOFunc func, eventio->fd = fd; eventio->func = func; eventio->data = userdata; - array_append(event->writes, eventio); event->fdmax = max(event->fdmax, fd); + FD_SET(fd, &event->wfds); + array_append(event->writes, eventio); return 0; } /* event_register_timeout */ int event_register_timeout(Event * event, struct timeval timeout, - EventTimeoutFunc * func, void * data) + EventTimeoutFunc func, void * data) { EventTimeout * eventtimeout;