Unconditionally remove timeouts from the queue before calling the callback.
authorGuus Sliepen <guus@tinc-vpn.org>
Mon, 26 Feb 2018 21:19:43 +0000 (22:19 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 26 Feb 2018 21:19:43 +0000 (22:19 +0100)
We are going to unlink the timeout from the splay tree anyway, so do it
unconditionally before the callback, instead of waiting until after the
callback to check whether or not to remove it based on its expiration
time.

src/event.c

index 331872a..33d205a 100644 (file)
@@ -300,11 +300,9 @@ static struct timeval *get_time_remaining(struct timeval *diff) {
                timersub(&timeout->tv, &now, diff);
 
                if(diff->tv_sec < 0) {
-                       timeout->cb(timeout->data);
-
-                       if(timercmp(&timeout->tv, &now, <)) {
-                               timeout_del(timeout);
-                       }
+                       timeout_cb_t cb = timeout->cb;
+                       timeout_del(timeout);
+                       cb(timeout->data);
                } else {
                        tv = diff;
                        break;