2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-28 21:17:54 +00:00

add isc_task_purgeevent

This commit is contained in:
Bob Halley 1999-06-12 01:10:32 +00:00
parent ecb6819fdf
commit 0941b4e809
2 changed files with 82 additions and 8 deletions

View File

@ -184,17 +184,18 @@ isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
/* /*
* Purge events from a task's event queue. * Purge events from a task's event queue.
* *
* Notes:
* Events whose sender is 'sender', and whose type is >= first and
* <= last will be purged, unless they are marked as unpurgable.
* A sender of NULL will match any sender.
*
* Requires: * Requires:
* *
* 'task' is a valid task. * 'task' is a valid task.
* *
* last >= first * last >= first
* *
* Ensures:
*
* Events whose sender is 'sender', and whose type is >= first and
* <= last will be purged, unless they are marked as unpurgable.
* A sender of NULL will match any sender.
*
* Returns: * Returns:
* *
* The number of events purged. * The number of events purged.
@ -206,9 +207,6 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type);
* Purge events from a task's event queue. * Purge events from a task's event queue.
* *
* Notes: * Notes:
* Events whose sender is 'sender', and whose type is 'type'
* will be purged, unless they are marked as unpurgable.
* A sender of NULL will match any sender.
* *
* This function is equivalent to * This function is equivalent to
* *
@ -220,11 +218,46 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type);
* *
* last >= first * last >= first
* *
* Ensures:
*
* Events whose sender is 'sender', and whose type is 'type'
* will be purged, unless they are marked as unpurgable.
* A sender of NULL will match any sender.
*
* Returns: * Returns:
* *
* The number of events purged. * The number of events purged.
*/ */
isc_boolean_t
isc_task_purgeevent(isc_task_t *task, isc_event_t *event);
/*
* Purge 'event' from a task's event queue.
*
* Notes:
*
* If 'event' is on the task's event queue, it will be purged,
* unless it is marked as unpurgeable. 'event' does not have to be
* on the task's event queue; in fact, it can even be an invalid
* pointer. Purging only occurs if the event is actually on the task's
* event queue.
*
* Purging never changes the state of the task.
*
* Requires:
*
* 'task' is a valid task.
*
* Ensures:
*
* 'event' is not in the event queue for 'task'.
*
* Returns:
*
* ISC_TRUE The event was purged.
* ISC_FALSE The event was not in the event queue,
* or was marked unpurgeable.
*/
isc_result_t isc_result_t
isc_task_allowsend(isc_task_t *task, isc_boolean_t allow); isc_task_allowsend(isc_task_t *task, isc_boolean_t allow);

View File

@ -391,6 +391,47 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type) {
return (isc_task_purgerange(task, sender, type, type)); return (isc_task_purgerange(task, sender, type, type));
} }
isc_boolean_t
isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
isc_event_t *curr_event, *next_event;
/*
* Purge 'event' from a task's event queue.
*/
REQUIRE(VALID_TASK(task));
/*
* If 'event' is on the task's event queue, it will be purged,
* unless it is marked as unpurgeable. 'event' does not have to be
* on the task's event queue; in fact, it can even be an invalid
* pointer. Purging only occurs if the event is actually on the task's
* event queue.
*
* Purging never changes the state of the task.
*/
LOCK(&task->lock);
for (curr_event = HEAD(task->events);
curr_event != NULL;
curr_event = next_event) {
next_event = NEXT(curr_event, link);
if (curr_event == event &&
(event->attributes & ISC_EVENTATTR_NOPURGE) == 0) {
DEQUEUE(task->events, curr_event, link);
break;
}
}
UNLOCK(&task->lock);
if (curr_event == NULL)
return (ISC_FALSE);
isc_event_free(&curr_event);
return (ISC_TRUE);
}
isc_result_t isc_result_t
isc_task_allowsend(isc_task_t *task, isc_boolean_t allowed) { isc_task_allowsend(isc_task_t *task, isc_boolean_t allowed) {
isc_result_t result = ISC_R_SUCCESS; isc_result_t result = ISC_R_SUCCESS;