#define USEC (1000000)
/*
- * Macros to manage a doubly linked list.
+ * Functions to manage a doubly linked list.
*/
#define FR_DLIST_INIT(head) do { head.prev = head.next = &head; } while (0)
static inline void fr_dlist_insert_head(fr_dlist_t *head, fr_dlist_t *entry)
head->prev = entry;
}
-#define FR_DLIST_REMOVE(entry) do { entry.prev->next = entry.next; entry.next->prev = entry.prev; FR_DLIST_INIT(entry); } while (0)
+static inline void fr_dlist_remove(fr_dlist_t *entry)
+{
+ entry->prev->next = entry->next;
+ entry->next->prev = entry->prev;
+ entry->prev = entry->next = entry;
+}
+
#define FR_DLIST_FIRST(head) (head.next == &head) ? NULL : head.next
#define FR_DLIST_NEXT(head, p_entry) (p_entry->next == &head) ? NULL : p_entry->next
#define FR_DLIST_TAIL(head) (head.prev == &head) ? NULL : head.prev
#define WORKER_HEAP_POP(_name, _var, _member) do { \
_var = fr_heap_pop(worker->_name.heap); \
- if (_var) FR_DLIST_REMOVE(_var->_member); \
+ if (_var) fr_dlist_remove(&_var->_member); \
} while (0)
#define WORKER_HEAP_EXTRACT(_name, _var, _member) do { \
(void) fr_heap_extract(worker->_name.heap, _var); \
- FR_DLIST_REMOVE(_var->_member); \
+ fr_dlist_remove(&_var->_member); \
} while (0)
* @todo Use a talloc pool for the request. Clean it up,
* and insert it back into a slab allocator.
*/
- FR_DLIST_REMOVE(request->time_order);
+ fr_dlist_remove(&request->time_order);
talloc_free(request);
}
/*
* Waiting too long, delete it.
*/
- FR_DLIST_REMOVE(request->time_order);
+ fr_dlist_remove(&request->time_order);
(void) fr_heap_extract(worker->runnable, request);
final = request->process_async(request, FR_TRANSPORT_ACTION_DONE);
final = request->process_async(request, FR_TRANSPORT_ACTION_DONE);
if (final == FR_TRANSPORT_DONE) {
- FR_DLIST_REMOVE(worker->waiting_to_die);
+ fr_dlist_remove(&worker->waiting_to_die);
fr_log(worker->log, L_DBG, "(%zd) finally finished", request->number);
* async cleanup queue.
*/
if (final != FR_TRANSPORT_DONE) {
- FR_DLIST_REMOVE(request->time_order);
+ fr_dlist_remove(&request->time_order);
fr_dlist_insert_tail(&worker->waiting_to_die, &request->time_order);
return;
}
* it isn't resumed (yet) so we don't add CPU time for
* it.
*/
- FR_DLIST_REMOVE(request->tracking.list);
+ fr_dlist_remove(&request->tracking.list);
/*
* It's runnable again.