From a0e3a7363f0f0c2f1189358dd6670b05d59ede70 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Mon, 1 Jul 2013 18:38:42 +0200 Subject: watcher: unregister a watcher FD if its thread gets cancelled --- src/libstrongswan/processing/watcher.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/libstrongswan/processing/watcher.c') diff --git a/src/libstrongswan/processing/watcher.c b/src/libstrongswan/processing/watcher.c index ff3e11649..84a870f2c 100644 --- a/src/libstrongswan/processing/watcher.c +++ b/src/libstrongswan/processing/watcher.c @@ -106,12 +106,25 @@ static void update(private_watcher_t *this) } } +/** + * Cleanup function if callback gets cancelled + */ +static void unregister(notify_data_t *data) +{ + /* if a thread processing a callback gets cancelled, we mark the entry + * as cancelled, like the callback would return FALSE. This is required + * to not queue this watcher again if all threads have been gone. */ + data->keep = FALSE; +} + /** * Execute callback of registered FD, asynchronous */ static job_requeue_t notify_async(notify_data_t *data) { + thread_cleanup_push((void*)unregister, data); data->keep = data->cb(data->data, data->fd, data->event); + thread_cleanup_pop(FALSE); return JOB_REQUEUE_NONE; } -- cgit v1.2.3