make the avl node key const
[project/libubox.git] / uloop.c
diff --git a/uloop.c b/uloop.c
index 4be5f45..f60eb41 100644 (file)
--- a/uloop.c
+++ b/uloop.c
 #endif
 #define ULOOP_MAX_EVENTS 10
 
-struct uloop_timeout *first_timeout;
-static int poll_fd;
+static struct uloop_timeout *first_timeout;
+static int poll_fd = -1;
 bool uloop_cancelled = false;
 
 #ifdef USE_KQUEUE
 
 int uloop_init(void)
 {
+       if (poll_fd >= 0)
+               return 0;
+
        poll_fd = kqueue();
        if (poll_fd < 0)
                return -1;
@@ -118,7 +121,7 @@ static void uloop_run_events(int timeout)
 
        if (timeout > 0) {
                ts.tv_sec = timeout / 1000;
-               ts.tv_nsec = timeout * 1000000;
+               ts.tv_nsec = (timeout % 1000) * 1000000;
        }
 
        nfds = kevent(poll_fd, NULL, 0, events, ARRAY_SIZE(events), timeout > 0 ? &ts : NULL);
@@ -160,6 +163,9 @@ static void uloop_run_events(int timeout)
 
 int uloop_init(void)
 {
+       if (poll_fd >= 0)
+               return 0;
+
        poll_fd = epoll_create(32);
        if (poll_fd < 0)
                return -1;
@@ -368,11 +374,6 @@ static void uloop_process_timeouts(struct timeval *tv)
        }
 }
 
-void uloop_end(void)
-{
-       uloop_cancelled = true;
-}
-
 void uloop_run(void)
 {
        struct timeval tv;
@@ -382,11 +383,17 @@ void uloop_run(void)
        {
                gettimeofday(&tv, NULL);
                uloop_process_timeouts(&tv);
+               if (uloop_cancelled)
+                       break;
                uloop_run_events(uloop_get_next_timeout(&tv));
        }
 }
 
 void uloop_done(void)
 {
+       if (poll_fd < 0)
+               return;
+
        close(poll_fd);
+       poll_fd = -1;
 }