Add argument to loop exit, and cache FD_SET
authoraland <aland>
Tue, 9 Oct 2007 13:24:22 +0000 (13:24 +0000)
committeraland <aland>
Tue, 9 Oct 2007 13:24:22 +0000 (13:24 +0000)
src/include/event.h
src/lib/event.c

index d61aea5..66a24ac 100644 (file)
@@ -52,6 +52,6 @@ int lrad_event_fd_insert(lrad_event_list_t *el, int type, int fd,
                         lrad_event_fd_handler_t handler, void *ctx);
 int lrad_event_fd_delete(lrad_event_list_t *el, int type, int fd);
 int lrad_event_loop(lrad_event_list_t *el);
-void lrad_event_loop_exit(lrad_event_list_t *el);
+void lrad_event_loop_exit(lrad_event_list_t *el, int code);
 
 #endif /* LRAD_HASH_H */
index 147cf59..b48c01c 100644 (file)
@@ -39,6 +39,7 @@ struct lrad_event_list_t {
        rbtree_t        *times;
 
        rbtree_t        *readers;
+       fd_set          read_fds;
        int             changed;
        int             maxfd;
 
@@ -304,11 +305,11 @@ int lrad_event_fd_delete(lrad_event_list_t *el, int type, int fd)
 }                       
 
 
-void lrad_event_loop_exit(lrad_event_list_t *el)
+void lrad_event_loop_exit(lrad_event_list_t *el, int code)
 {
        if (!el) return;
 
-       el->exit = 1;
+       el->exit = code;
 }
 
 
@@ -353,8 +354,20 @@ int lrad_event_loop(lrad_event_list_t *el)
        struct timeval now, when, *wake;
        lrad_fd_walk_t ew;
 
+       /*
+        *      Cache the list of FD's to watch.
+        */
+       if (el->changed) {
+               FD_ZERO(&el->read_fds);
+
+               rbtree_walk(el->readers, InOrder, lrad_event_fd_set,
+                           &el->read_fds);
+               el->changed = 0;
+       }
+
+       el->exit = 0;
+
        while (!el->exit) {
-               FD_ZERO(&read_fds);
 
                /*
                 *      Find the first event.  If there's none, we wait
@@ -389,7 +402,7 @@ int lrad_event_loop(lrad_event_list_t *el)
                        wake = NULL;
                }
 
-               rbtree_walk(el->readers, InOrder, lrad_event_fd_set, &read_fds);
+               read_fds = el->read_fds;
 
                /*
                 *      Tell someone what the status is.
@@ -419,7 +432,7 @@ int lrad_event_loop(lrad_event_list_t *el)
                rbtree_walk(el->readers, InOrder, lrad_event_fd_dispatch, &ew);
        }
 
-       return 1;
+       return el->exit;
 }