watcher: unregister a watcher FD if its thread gets cancelled

This commit is contained in:
Martin Willi
2013-07-18 16:00:29 +02:00
parent a558ba16f3
commit a0e3a7363f
+13
View File
@@ -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;
}