#include #include #include #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;imaxfd)maxfd=fd_list[i].fd; } int ret=select(maxfd+1,&inset,NULL,NULL,NULL); if(ret<=0){ if(errno==EINTR)continue; die_perror("select"); } for(size_t i=0;i