fr_channel_t *ch;
fr_message_set_t *ms;
+ /*
+ * If we're sending a reply, then it's no longer runnable.
+ */
+ rad_assert(request->runnable_id < 0);
+
/*
* If it's a detached request, don't send a real reply.
* Just toss the request.
return;
}
+ /*
+ * The request must still be tracked for max_request_time
+ */
+ rad_assert(request->time_order_id >= 0);
+
/*
* Allocate and send the reply.
*/
(void) rbtree_deletebydata(worker->dedup, request);
#ifndef NDEBUG
- rad_assert(request->runnable_id < 0);
- rad_assert(request->time_order_id < 0);
request->async->original_recv_time = NULL;
request->async->el = NULL;
request->async->process = NULL;
* be in the runnable list, but if not, no worries. It
* MAY be in the dedup list, but if not, no worries.
*/
- (void) fr_heap_extract(worker->time_order, request);
- (void) fr_heap_extract(worker->runnable, request);
+ if (request->time_order_id >= 0) (void) fr_heap_extract(worker->time_order, request);
+ if (request->runnable_id >= 0) (void) fr_heap_extract(worker->runnable, request);
(void) rbtree_deletebydata(worker->dedup, request);
+
+#ifndef NDEBUG
+ request->async->process = NULL;
+#endif
}
/** Enforce max_request_time
rad_assert(request->parent == NULL);
rad_assert(request->async->process != NULL);
rad_assert(request->async->listen != NULL);
+ rad_assert(request->runnable_id < 0); /* removed from the runnable heap */
RDEBUG("running request");
RDEBUG("done request");
+ (void) rbtree_deletebydata(worker->dedup, request);
+
fr_worker_send_reply(worker, request, size);
}