watcher: unregister a watcher FD if its thread gets cancelled
This commit is contained in:
@@ -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
|
* Execute callback of registered FD, asynchronous
|
||||||
*/
|
*/
|
||||||
static job_requeue_t notify_async(notify_data_t *data)
|
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);
|
data->keep = data->cb(data->data, data->fd, data->event);
|
||||||
|
thread_cleanup_pop(FALSE);
|
||||||
return JOB_REQUEUE_NONE;
|
return JOB_REQUEUE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user