uloop: add uloop_cancelling function

Returns true if uloop_run is still running and uloop_cancelled is set

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2017-02-03 16:52:17 +01:00
parent 3b6181b63d
commit de3f14b643
2 changed files with 10 additions and 3 deletions

11
uloop.c
View file

@ -63,6 +63,7 @@ static bool do_sigchld = false;
static struct uloop_fd_event cur_fds[ULOOP_MAX_EVENTS]; static struct uloop_fd_event cur_fds[ULOOP_MAX_EVENTS];
static int cur_fd, cur_nfds; static int cur_fd, cur_nfds;
static int uloop_run_depth = 0;
int uloop_fd_add(struct uloop_fd *sock, unsigned int flags); int uloop_fd_add(struct uloop_fd *sock, unsigned int flags);
@ -514,16 +515,20 @@ static void uloop_clear_processes(void)
uloop_process_delete(p); uloop_process_delete(p);
} }
bool uloop_cancelling(void)
{
return uloop_run_depth > 0 && uloop_cancelled;
}
int uloop_run(void) int uloop_run(void)
{ {
static int recursive_calls = 0;
struct timeval tv; struct timeval tv;
/* /*
* Handlers are only updated for the first call to uloop_run() (and restored * Handlers are only updated for the first call to uloop_run() (and restored
* when this call is done). * when this call is done).
*/ */
if (!recursive_calls++) if (!uloop_run_depth++)
uloop_setup_signals(true); uloop_setup_signals(true);
uloop_status = 0; uloop_status = 0;
@ -543,7 +548,7 @@ int uloop_run(void)
uloop_run_events(uloop_get_next_timeout(&tv)); uloop_run_events(uloop_get_next_timeout(&tv));
} }
if (!--recursive_calls) if (!--uloop_run_depth)
uloop_setup_signals(false); uloop_setup_signals(false);
return uloop_status; return uloop_status;

View file

@ -97,6 +97,8 @@ int uloop_timeout_remaining(struct uloop_timeout *timeout);
int uloop_process_add(struct uloop_process *p); int uloop_process_add(struct uloop_process *p);
int uloop_process_delete(struct uloop_process *p); int uloop_process_delete(struct uloop_process *p);
bool uloop_cancelling(void);
static inline void uloop_end(void) static inline void uloop_end(void)
{ {
uloop_cancelled = true; uloop_cancelled = true;