diff options
Diffstat (limited to 'runloop.c')
-rw-r--r-- | runloop.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/runloop.c b/runloop.c new file mode 100644 index 0000000..d2865a2 --- /dev/null +++ b/runloop.c @@ -0,0 +1,53 @@ +#include <string.h> +#include <sys/select.h> +#include "runloop.h" + + +struct fd_list_item{ + int fd; + runloop_callback *func; +}; + +static struct fd_list_item *fd_list; +static size_t fd_list_len,fd_list_cap; + +__attribute__((constructor)) +static void constructor(void){ + fd_list_cap=16; + fd_list_len=0; + fd_list=malloc(fd_list_cap,struct fd_list_item); +} + + +void runloop_add_fd(int fd,runloop_callback *func){ + if(fd_list_len==fd_list_cap){ + fd_list_cap*=2; + fd_list=realloc(fd_list,fd_list_cap,struct fd_list_item); + } + fd_list[fd_list_len].fd=fd; + fd_list[fd_list_len].func=func; + fd_list_len++; +} + +void runloop_run(void){ + while(true){ + fd_set inset; + FD_ZERO(&inset); + int maxfd=-1; + for(size_t i=0;i<fd_list_len;i++){ + FD_SET(fd_list[i].fd,&inset); + if(fd_list[i].fd>maxfd)maxfd=fd_list[i].fd; + } + int ret=select(maxfd+1,&inset,NULL,NULL,NULL); + if(ret<=0)die_perror("select"); + for(size_t i=0;i<fd_list_len;i++){ + if(FD_ISSET(fd_list[i].fd,&inset)){ + if(fd_list[i].func(fd_list[i].fd)){ + memmove(fd_list+i,fd_list+i+1,fd_list_len-i-1); + i--; + fd_list_len--; + } + } + } + } +} |