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 331872a5b378d324a66818d34891861e62bde721..33d205a96f52c1e58b8e1f42150c11ad6633b0a6 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;