diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-06-18 14:01:08 +0400 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-06-18 14:05:09 +0400 |
commit | b9ebdbcc648274cc630b6349374f9fb21e53f396 (patch) | |
tree | cf92d4150ced9240a51bec85e89ef48fbf5497a6 /uloop.h | |
parent | 35cee2c2067246b5e3dede9caac5d8b7a60ccba1 (diff) |
uloop: fix corner cases with recursive uloop_run calls
With multiple recursive calls to uloop_run, the callback for the same fd
can be run multiple times from different levels in the stack.
Prevent this by tracking the stack of uloop_fd callbacks and buffering new
incoming events for fds already on the stack.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Diffstat (limited to 'uloop.h')
-rw-r--r-- | uloop.h | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -44,8 +44,13 @@ typedef void (*uloop_process_handler)(struct uloop_process *c, int ret); #define ULOOP_WRITE (1 << 1) #define ULOOP_EDGE_TRIGGER (1 << 2) #define ULOOP_BLOCKING (1 << 3) + +#define ULOOP_EVENT_MASK (ULOOP_READ | ULOOP_WRITE) + +/* internal flags */ +#define ULOOP_EVENT_BUFFERED (1 << 4) #ifdef USE_KQUEUE -#define ULOOP_EDGE_DEFER (1 << 4) +#define ULOOP_EDGE_DEFER (1 << 5) #endif struct uloop_fd |