X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fivac.git;a=blobdiff_plain;f=src%2Fevent.c;h=03e96565d26a32462a46cbb55910c7e55b85593b;hp=d7ea42d8fbfef55ea17f44db8b31c596e4064ffb;hb=b5b0be927dd4400a2edb46efe7aba20331dff547;hpb=4d58fd24070e19da1438f6723935df782d33133f diff --git a/src/event.c b/src/event.c index d7ea42d..03e9656 100644 --- a/src/event.c +++ b/src/event.c @@ -6,16 +6,83 @@ #include "event.h" -int event_init(t_ivac *ivac) { +int event_init(t_event *event) { - puts("[ivac] event: initializing event system ..."); + puts("[event] initializing event system ..."); - ivac->event.maxfd=0; + event->maxfd=0; - FD_ZERO(ivac->event.rfds); - FD_ZERO(ivac->event.rfds_c); - FD_ZERO(ivac->event.wfds); - FD_ZERO(ivac->event.wfds_c); + FD_ZERO(&(event->rfds)); + FD_ZERO(&(event->rfds_o)); + FD_ZERO(&(event->wfds)); + FD_ZERO(&(event->wfds_o)); - return SUCCESS; + return E_SUCCESS; +} + +int event_math(int fd,t_event *event,char rw,char ar) { + + if(ar==ADD) { + if(rw==READ) FD_SET(fd,&(event->rfds_o)); + else FD_SET(fd,&(event->wfds_o)); + if(fd>event->maxfd) event->maxfd=fd; + } else { + if(rw==READ) FD_CLR(fd,&(event->rfds_o)); + else FD_CLR(fd,&(event->wfds_o)); + if(fd==event->maxfd) event->maxfd-=1; + } + + printf("[event] %c fd %d to %c file descriptor set\n",ar==ADD?'+':'-',fd, + rw==READ?'r':'w'); + + return E_SUCCESS; +} + +int event_start(t_event *event,void *ptr, + int (*callback0)(t_event *event,void *ptr), + int (*callback1)(t_event *event,void *ptr)) { + + int s_ret; + struct timeval tv; + + /* switch on event system */ + event->status=ENABLED; + + while(event->status&ENABLED) { + + event->rfds=event->rfds_o; + event->wfds=event->wfds_o; + tv=event->timeout; + + if((s_ret=select(event->maxfd+1,&(event->rfds),&(event->wfds),NULL, + &tv))==-1) { + perror("[event] select call"); + return E_ERROR; + } + + if(s_ret) { + /* 1+ fd(s) available for reading/writing */ + if(callback0(event,ptr)==CALLBACK_ERROR) { + puts("[event] callback0 returned error"); + return E_ERROR; + } + } + + /* usual stuff to be executed */ + if(callback1(event,ptr)==CALLBACK_ERROR) { + puts("[event] callback returned error"); + return E_ERROR; + } + + } + + return E_SUCCESS; +} + +int event_stop(t_event *event) { + + puts("[event] shutdown"); + event->status=DISABLED; + + return E_SUCCESS; }