aboutsummaryrefslogtreecommitdiff
path: root/runloop.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-14 11:05:35 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-14 11:05:35 +0100
commit54064158d84fc4006e651deb314cde156cc383e8 (patch)
treea534f160fe02b593143e03aaaf52f65513352c90 /runloop.c
Register working
Diffstat (limited to 'runloop.c')
-rw-r--r--runloop.c53
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--;
+ }
+ }
+ }
+ }
+}