]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Repair isc_task_purgeevent(), clean isc_task_unsend{,range}()
authorOndřej Surý <ondrej@isc.org>
Thu, 31 Mar 2022 19:55:15 +0000 (21:55 +0200)
committerOndřej Surý <ondrej@isc.org>
Fri, 1 Apr 2022 21:45:23 +0000 (23:45 +0200)
The isc_task_purgerange() was walking through all events on the task to
find a matching task.  Instead use the ISC_LINK_LINKED to find whether
the event is active.

Cleanup the related isc_task_unsend() and isc_task_unsendrange()
functions that were not used anywhere.

lib/isc/include/isc/task.h
lib/isc/task.c

index e5251aa4be159545e2d9c11a5d5ccb44dc208e58..efc50992c9e0df7aa8d29444ccfa8c6b327e4704 100644 (file)
  *
  * Purging calls isc_event_free() on the matching events.
  *
- * Unsending returns a list of events that matched the pattern.
- * The caller is then responsible for them.
- *
- * Consumers of events should purge, not unsend.
- *
- * Producers of events often want to remove events when the caller indicates
- * it is no longer interested in the object, e.g. by canceling a timer.
- * Sometimes this can be done by purging, but for some event types, the
- * calls to isc_event_free() cause deadlock because the event free routine
- * wants to acquire a lock the caller is already holding.  Unsending instead
- * of purging solves this problem.  As a general rule, producers should only
- * unsend events which they have sent.
  */
 
 /***
@@ -337,65 +325,6 @@ isc_task_purgeevent(isc_task_t *task, isc_event_t *event);
  *                                     or was marked unpurgeable.
  */
 
-unsigned int
-isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
-                    isc_eventtype_t last, void *tag, isc_eventlist_t *events);
-/*%<
- * Remove events from a task's event queue.
- *
- * Requires:
- *
- *\li  'task' is a valid task.
- *
- *\li  last >= first.
- *
- *\li  *events is a valid list.
- *
- * Ensures:
- *
- *\li  Events in the event queue of 'task' whose sender is 'sender', whose
- *     type is >= first and <= last, and whose tag is 'tag' will be dequeued
- *     and appended to *events.
- *
- *\li  A sender of NULL will match any sender.  A NULL tag matches any
- *     tag.
- *
- * Returns:
- *
- *\li  The number of events unsent.
- */
-
-unsigned int
-isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag,
-               isc_eventlist_t *events);
-/*%<
- * Remove events from a task's event queue.
- *
- * Notes:
- *
- *\li  This function is equivalent to
- *
- *\code
- *             isc_task_unsendrange(task, sender, type, type, tag, events);
- *\endcode
- *
- * Requires:
- *
- *\li  'task' is a valid task.
- *
- *\li  *events is a valid list.
- *
- * Ensures:
- *
- *\li  Events in the event queue of 'task' whose sender is 'sender', whose
- *     type is 'type', and whose tag is 'tag' will be dequeued and appended
- *     to *events.
- *
- * Returns:
- *
- *\li  The number of events unsent.
- */
-
 isc_result_t
 isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, void *arg);
 /*%<
index 5d86c9d4d2e1ddc03fd261867d3ae0c9aa4bdb49..df1f4d565aaf4e52768e26b981a33852eabcf487 100644 (file)
@@ -612,12 +612,10 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
 
 bool
 isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
-       isc_event_t *curr_event, *next_event;
+       bool found = false;
 
        /*
         * Purge 'event' from a task's event queue.
-        *
-        * XXXRTH:  WARNING:  This method may be removed before beta.
         */
 
        REQUIRE(VALID_TASK(task));
@@ -633,52 +631,22 @@ isc_task_purgeevent(isc_task_t *task, isc_event_t *event) {
         */
 
        LOCK(&task->lock);
-       for (curr_event = HEAD(task->events); curr_event != NULL;
-            curr_event = next_event)
-       {
-               next_event = NEXT(curr_event, ev_link);
-               if (curr_event == event && PURGE_OK(event)) {
-                       DEQUEUE(task->events, curr_event, ev_link);
-                       task->nevents--;
-                       break;
-               }
+       if (ISC_LINK_LINKED(event, ev_link)) {
+               DEQUEUE(task->events, event, ev_link);
+               task->nevents--;
+               found = true;
        }
        UNLOCK(&task->lock);
 
-       if (curr_event == NULL) {
+       if (!found) {
                return (false);
        }
 
-       isc_event_free(&curr_event);
+       isc_event_free(&event);
 
        return (true);
 }
 
-unsigned int
-isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
-                    isc_eventtype_t last, void *tag, isc_eventlist_t *events) {
-       /*
-        * Remove events from a task's event queue.
-        */
-       REQUIRE(VALID_TASK(task));
-
-       XTRACE("isc_task_unsendrange");
-
-       return (dequeue_events(task, sender, first, last, tag, events, false));
-}
-
-unsigned int
-isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag,
-               isc_eventlist_t *events) {
-       /*
-        * Remove events from a task's event queue.
-        */
-
-       XTRACE("isc_task_unsend");
-
-       return (dequeue_events(task, sender, type, type, tag, events, false));
-}
-
 isc_result_t
 isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action, void *arg) {
        bool disallowed = false;