Nicer code
This commit is contained in:
parent
17c7d9fc15
commit
9501343314
|
@ -29,5 +29,8 @@ int event_register_io_write(Event * event, int fd, EventIOFunc func,
|
||||||
void * userdata);
|
void * userdata);
|
||||||
int event_register_timeout(Event * event, struct timeval timeout,
|
int event_register_timeout(Event * event, struct timeval timeout,
|
||||||
EventTimeoutFunc func, void * userdata);
|
EventTimeoutFunc func, void * userdata);
|
||||||
|
int event_unregister_io_read(Event * event, int fd);
|
||||||
|
int event_unregister_io_write(Event * event, int fd);
|
||||||
|
int event_unregister_timeout(Event * event, EventTimeoutFunc func);
|
||||||
|
|
||||||
#endif /* !_EVENT_H */
|
#endif /* !_EVENT_H */
|
||||||
|
|
|
@ -28,8 +28,10 @@ typedef struct _AppServerClient
|
||||||
int fd;
|
int fd;
|
||||||
uint32_t addr; /* FIXME uint8_t[4] instead? */
|
uint32_t addr; /* FIXME uint8_t[4] instead? */
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
char buffer_read[ASC_BUFSIZE];
|
char buf_read[ASC_BUFSIZE];
|
||||||
char buffer_write[ASC_BUFSIZE];
|
unsigned int buf_read_cnt;
|
||||||
|
char buf_write[ASC_BUFSIZE];
|
||||||
|
unsigned int buf_write_cnt;
|
||||||
} AppServerClient;
|
} AppServerClient;
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,6 +46,8 @@ AppServerClient * appserverclient_new(int fd, uint32_t addr, uint16_t port)
|
||||||
asc->fd = fd;
|
asc->fd = fd;
|
||||||
asc->addr = addr;
|
asc->addr = addr;
|
||||||
asc->port = port;
|
asc->port = port;
|
||||||
|
asc->buf_read_cnt = 0;
|
||||||
|
asc->buf_write_cnt = 0;
|
||||||
return asc;
|
return asc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,25 +90,60 @@ static int _appserver_accept(int fd, AppServer * appserver)
|
||||||
return 1;
|
return 1;
|
||||||
if((asc = appserverclient_new(newfd, sa.sin_addr.s_addr, sa.sin_port))
|
if((asc = appserverclient_new(newfd, sa.sin_addr.s_addr, sa.sin_port))
|
||||||
== NULL)
|
== NULL)
|
||||||
return 1;
|
{
|
||||||
|
/* FIXME report error */
|
||||||
|
close(newfd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
array_append(appserver->clients, asc);
|
array_append(appserver->clients, asc);
|
||||||
event_register_io_read(appserver->event, newfd, _appserver_read,
|
event_register_io_read(appserver->event, newfd,
|
||||||
appserver);
|
(EventIOFunc)_appserver_read, appserver);
|
||||||
/* event_register_io_write(appserver->event, newfd, _appserver_write,
|
|
||||||
appserver); */
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int _appserver_read(int fd, AppServer * appserver)
|
static int _appserver_read(int fd, AppServer * appserver)
|
||||||
|
{
|
||||||
|
AppServerClient * asc = NULL;
|
||||||
|
unsigned int i;
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
for(i = 0; i < array_count(appserver->clients); i++)
|
||||||
|
{
|
||||||
|
if(array_get(appserver->clients, i, &asc))
|
||||||
|
break;
|
||||||
|
if(fd == asc->fd)
|
||||||
|
break;
|
||||||
|
asc = NULL;
|
||||||
|
}
|
||||||
|
if(asc == NULL)
|
||||||
|
return 1;
|
||||||
|
if((len = sizeof(asc->buf_read) - asc->buf_read_cnt) < 0
|
||||||
|
|| (len = read(fd, &asc->buf_read[asc->buf_read_cnt],
|
||||||
|
len)) <= 0)
|
||||||
|
{
|
||||||
|
if(asc->buf_write_cnt > 0)
|
||||||
|
event_unregister_io_write(appserver->event, fd);
|
||||||
|
event_unregister_io_read(appserver->event, fd);
|
||||||
|
appserverclient_delete(asc);
|
||||||
|
array_remove_pos(appserver->clients, i);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
asc->buf_read_cnt+=len;
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "%s%d%s%d%s", "_appserver_read(", fd,
|
||||||
|
", appserver): ", len, " characters read\n");
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int _appserver_write(int fd, AppServer * appserver)
|
||||||
{
|
{
|
||||||
AppServerClient * asc = NULL;
|
AppServerClient * asc = NULL;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "%s%d%s", "_appserver_read(", fd, ", appserver)\n");
|
|
||||||
#endif
|
|
||||||
for(i = 0; i < array_count(appserver->clients); i++)
|
for(i = 0; i < array_count(appserver->clients); i++)
|
||||||
{
|
{
|
||||||
if(!array_get(appserver->clients, i, &asc))
|
if(!array_get(appserver->clients, i, &asc))
|
||||||
|
@ -113,27 +152,23 @@ static int _appserver_read(int fd, AppServer * appserver)
|
||||||
break;
|
break;
|
||||||
asc = NULL;
|
asc = NULL;
|
||||||
}
|
}
|
||||||
if(asc == NULL || (len = read(fd, asc->buffer_read,
|
if(asc == NULL)
|
||||||
sizeof(asc->buffer_read)-1)) < 0)
|
|
||||||
return 1;
|
return 1;
|
||||||
if(len == 0)
|
len = asc->buf_read_cnt;
|
||||||
|
if((len = write(fd, asc->buf_write, len)) <= 0)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
if(asc->buf_read_cnt == ASC_BUFSIZE)
|
||||||
perror("read");
|
event_unregister_io_read(appserver->event, fd);
|
||||||
#endif
|
event_unregister_io_write(appserver->event, fd);
|
||||||
close(fd);
|
array_remove_pos(appserver->clients, i);
|
||||||
|
appserverclient_delete(asc);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
asc->buffer_read[len] = '\0';
|
memmove(asc->buf_write, &asc->buf_write[len], len);
|
||||||
fprintf(stderr, "\"%s\"\n", asc->buffer_read);
|
asc->buf_write_cnt-=len;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int _appserver_write(int fd, AppServer * appserver)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "%s%d%s", "_appserver_write(", fd, ", appserver)\n");
|
fprintf(stderr, "%s%d%s%d%s", "_appserver_write(", fd,
|
||||||
|
", appserver): ", len, " characters written\n");
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -216,8 +251,8 @@ static int _new_server(AppServer * appserver, int options)
|
||||||
perror("close"); /* FIXME report error appropriately */
|
perror("close"); /* FIXME report error appropriately */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
event_register_io_read(appserver->event, fd, _appserver_accept,
|
event_register_io_read(appserver->event, fd,
|
||||||
appserver);
|
(EventIOFunc)_appserver_accept, appserver);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
138
src/event.c
138
src/event.c
|
@ -61,12 +61,13 @@ Event * event_new(void)
|
||||||
free(event);
|
free(event);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
event->timeout.tv_sec = LONG_MAX;
|
event->fdmax = -1;
|
||||||
event->timeout.tv_usec = LONG_MAX;
|
|
||||||
event->reads = eventioarray_new(); /* FIXME */
|
|
||||||
event->writes = eventioarray_new(); /* FIXME */
|
|
||||||
FD_ZERO(&event->rfds);
|
FD_ZERO(&event->rfds);
|
||||||
FD_ZERO(&event->wfds);
|
FD_ZERO(&event->wfds);
|
||||||
|
event->reads = eventioarray_new(); /* FIXME */
|
||||||
|
event->writes = eventioarray_new(); /* FIXME */
|
||||||
|
event->timeout.tv_sec = LONG_MAX;
|
||||||
|
event->timeout.tv_usec = LONG_MAX;
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,8 +84,7 @@ void event_delete(Event * event)
|
||||||
|
|
||||||
/* useful */
|
/* useful */
|
||||||
static void _loop_timeout(Event * event);
|
static void _loop_timeout(Event * event);
|
||||||
static void _loop_io_read(Event * event, fd_set * rfds);
|
static void _loop_io(Event * event, eventioArray * eios, fd_set * fds);
|
||||||
static void _loop_io_write(Event * event, fd_set * wfds);
|
|
||||||
int event_loop(Event * event)
|
int event_loop(Event * event)
|
||||||
{
|
{
|
||||||
struct timeval * timeout = event->timeout.tv_sec == LONG_MAX
|
struct timeval * timeout = event->timeout.tv_sec == LONG_MAX
|
||||||
|
@ -96,8 +96,8 @@ int event_loop(Event * event)
|
||||||
while((ret = select(event->fdmax+1, &rfds, &wfds, NULL, timeout)) != -1)
|
while((ret = select(event->fdmax+1, &rfds, &wfds, NULL, timeout)) != -1)
|
||||||
{
|
{
|
||||||
_loop_timeout(event);
|
_loop_timeout(event);
|
||||||
_loop_io_read(event, &rfds);
|
_loop_io(event, event->reads, &rfds);
|
||||||
_loop_io_write(event, &wfds);
|
_loop_io(event, event->writes, &wfds);
|
||||||
timeout = event->timeout.tv_sec == LONG_MAX
|
timeout = event->timeout.tv_sec == LONG_MAX
|
||||||
&& event->timeout.tv_usec == LONG_MAX
|
&& event->timeout.tv_usec == LONG_MAX
|
||||||
? NULL : &event->timeout;
|
? NULL : &event->timeout;
|
||||||
|
@ -107,8 +107,8 @@ int event_loop(Event * event)
|
||||||
if(ret != -1)
|
if(ret != -1)
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
sleep(1);
|
|
||||||
perror("select");
|
perror("select");
|
||||||
|
sleep(1);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -131,84 +131,27 @@ static void _loop_timeout(Event * event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _io_fd_remove(Event * event, int fd);
|
static void _loop_io(Event * event, eventioArray * eios, fd_set * fds)
|
||||||
static void _loop_io_read(Event * event, fd_set * rfds)
|
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
EventIO * eio;
|
EventIO * eio;
|
||||||
|
int fd;
|
||||||
|
|
||||||
while(i < array_count(event->reads))
|
while(i < array_count(eios))
|
||||||
{
|
{
|
||||||
array_get(event->reads, i, &eio);
|
array_get(eios, i, &eio);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "%s%d%s%p%s", "_loop_reads(): i=", i,
|
fprintf(stderr, "%s%d%s%p%s", "_loop_io(): i=", i,
|
||||||
", eio=", eio, "\n");
|
", eio=", eio, "\n");
|
||||||
#endif
|
#endif
|
||||||
if(FD_ISSET(eio->fd, rfds)
|
if((fd = eio->fd) <= event->fdmax && FD_ISSET(fd, fds)
|
||||||
&& eio->func(eio->fd, eio->data) != 0)
|
&& eio->func(fd, eio->data) != 0)
|
||||||
{
|
event_unregister_io_read(event, fd);
|
||||||
event->fdmax = _io_fd_remove(event, eio->fd);
|
else
|
||||||
continue;
|
i++;
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _loop_io_write(Event * event, fd_set * wfds)
|
|
||||||
{
|
|
||||||
unsigned int i = 0;
|
|
||||||
EventIO * eio;
|
|
||||||
|
|
||||||
while(i < array_count(event->writes))
|
|
||||||
{
|
|
||||||
array_get(event->writes, i, &eio); /* FIXME check error */
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "%s%d%s%p%s", "_loop_writes(): i=", i,
|
|
||||||
", eio=", eio, "\n");
|
|
||||||
#endif
|
|
||||||
if(FD_ISSET(eio->fd, wfds)
|
|
||||||
&& eio->func(eio->fd, eio->data) != 0)
|
|
||||||
{
|
|
||||||
event->fdmax = _io_fd_remove(event, eio->fd);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _io_fd_remove(Event * event, int fd)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
int fdmax = -1;
|
|
||||||
EventIO * eio;
|
|
||||||
|
|
||||||
for(i = 0; i < array_count(event->reads); i++)
|
|
||||||
{
|
|
||||||
array_get(event->reads, i, &eio); /* FIXME check error */
|
|
||||||
if(eio->fd != fd)
|
|
||||||
{
|
|
||||||
fdmax = max(fdmax, eio->fd);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
FD_CLR(eio->fd, &event->rfds);
|
|
||||||
free(eio);
|
|
||||||
array_remove_pos(event->reads, i);
|
|
||||||
}
|
|
||||||
for(i = 0; i < array_count(event->writes); i++)
|
|
||||||
{
|
|
||||||
array_get(event->writes, i, &eio); /* FIXME check error */
|
|
||||||
if(eio->fd != fd)
|
|
||||||
{
|
|
||||||
fdmax = max(fdmax, eio->fd);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
FD_CLR(eio->fd, &event->wfds);
|
|
||||||
free(eio);
|
|
||||||
array_remove_pos(event->writes, i);
|
|
||||||
}
|
|
||||||
return fdmax;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* event_register_io_read */
|
/* event_register_io_read */
|
||||||
int event_register_io_read(Event * event, int fd, EventIOFunc func,
|
int event_register_io_read(Event * event, int fd, EventIOFunc func,
|
||||||
|
@ -267,3 +210,46 @@ int event_register_timeout(Event * event, struct timeval timeout,
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* event_unregister_io_read */
|
||||||
|
static int _unregister_io(eventioArray * eios, fd_set * fds, int fd);
|
||||||
|
int event_unregister_io_read(Event * event, int fd)
|
||||||
|
{
|
||||||
|
event->fdmax = _unregister_io(event->reads, &event->rfds, fd);
|
||||||
|
event->fdmax = max(event->fdmax, _unregister_io(event->writes, NULL,
|
||||||
|
-1));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* event_unregister_io_write */
|
||||||
|
int event_unregister_io_write(Event * event, int fd)
|
||||||
|
{
|
||||||
|
event->fdmax = _unregister_io(event->writes, &event->wfds, fd);
|
||||||
|
event->fdmax = max(event->fdmax, _unregister_io(event->reads, NULL,
|
||||||
|
-1));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _unregister_io(eventioArray * eios, fd_set * fds, int fd)
|
||||||
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
EventIO * eio;
|
||||||
|
int fdmax = -1;
|
||||||
|
|
||||||
|
while(i < array_count(eios))
|
||||||
|
{
|
||||||
|
array_get(eios, i, &eio);
|
||||||
|
if(eio->fd != fd)
|
||||||
|
{
|
||||||
|
fdmax = max(fdmax, eio->fd);
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
FD_CLR(fd, fds);
|
||||||
|
array_remove_pos(eios, i);
|
||||||
|
free(eio);
|
||||||
|
}
|
||||||
|
return fdmax;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user