Initial release

This commit is contained in:
Pierre Pronchery 2005-09-02 20:22:21 +00:00
parent fc939a0353
commit 36a37e0b00
2 changed files with 198 additions and 0 deletions

67
src/array.c Normal file
View File

@ -0,0 +1,67 @@
/* array.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "array.h"
/* Array */
struct _Array
{
void * data;
unsigned int count;
unsigned int size;
};
Array * array_new(unsigned int size)
{
Array * array;
if((array = malloc(sizeof(Array))) == NULL)
return NULL;
array->data = NULL;
array->count = 0;
array->size = size;
return array;
}
void array_delete(Array * array)
{
free(array);
}
/* useful */
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++;
return 0;
}
void array_apply(Array * array, ArrayApplyFunc func, void * userdata)
{
unsigned int i;
for(i = 0; i < array->count; i++)
func(&array->data + (i * array->size), userdata);
}
unsigned int array_count(Array * array)
{
return array->count;
}

131
src/event.c Normal file
View File

@ -0,0 +1,131 @@
/* event.c */
#include <sys/time.h>
#include <time.h>
#include <sys/select.h>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include "array.h"
#include "event.h"
/* Event */
typedef struct _EventTimeout
{
EventTimeoutFunc * func;
void * data;
struct timeval now;
struct timeval timeout;
} EventTimeout;
ARRAY(EventTimeout, EventTimeout);
struct _Event
{
fd_set rfds;
fd_set wfds;
EventTimeoutArray * timeouts;
struct timeval now;
struct timeval * timeout;
};
#ifdef DEBUG
static void _debug_timeval(struct timeval * tv, char * message)
{
fprintf(stderr, "%s%s%lu%s%lu%s", message, ": ", tv->tv_sec, "s, ",
tv->tv_usec, "us\n");
}
#endif
Event * event_new(void)
{
Event * event;
if((event = malloc(sizeof(Event))) == NULL)
return NULL;
if(gettimeofday(&event->now, NULL) != 0
|| (event->timeouts = EventTimeoutArrayNew()) == NULL)
{
perror("event");
free(event);
return NULL;
}
#ifdef DEBUG
_debug_timeval(&event->now, "event_new()");
#endif
FD_ZERO(&event->rfds);
FD_ZERO(&event->wfds);
event->timeout = NULL;
return event;
}
void event_delete(Event * event)
{
free(event);
}
/* internal */
static void _event_timeout_set(Event * event)
{
static struct timeval tv;
if(array_count(event->timeouts) == 0)
{
event->timeout = NULL;
return;
}
if(gettimeofday(&tv, NULL) != 0)
perror("gettimeofday");
/* FIXME set event->timeout */
}
static int _event_timeout_hit(Event * event)
{
if(event->timeout == NULL)
return 0;
/* FIXME look at every timeout func and run it if necessary */
return 0;
}
/* useful */
int event_loop(Event * event)
{
int ret;
for(_event_timeout_set(event);
(ret = select(0, &event->rfds, &event->wfds, NULL,
event->timeout)) != -1;
_event_timeout_set(event))
{
if(_event_timeout_hit(event))
continue;
/* FIXME */
}
if(ret != -1)
return 0;
perror("select");
return 1;
}
int event_timeout(Event * event, EventTimeoutFunc * func,
struct timeval timeout, void * data)
{
EventTimeout * eventtimeout;
if((eventtimeout = malloc(sizeof(EventTimeout))) == NULL)
return 1;
eventtimeout->func = func;
eventtimeout->timeout = timeout;
eventtimeout->data = data;
array_append(event->timeouts, eventtimeout);
/* FIXME fast recompute next timeout */
return 0;
}