*/
void fr_time_tracking_start(fr_time_tracking_t *tt, fr_time_t when)
{
- fr_dlist_t *l = &(tt->list);
-
memset(tt, 0, sizeof(*tt));
tt->when = when;
tt->start = when;
tt->resumed = when;
- l->prev = l;
- l->next = l;
+ FR_DLIST_INIT(tt->list);
}
*/
void fr_time_tracking_yield(fr_time_tracking_t *tt, fr_time_t when, fr_time_tracking_t *worker)
{
- fr_dlist_t *l = &(tt->list);
- fr_dlist_t *head = &(worker->list);
-
tt->when = when;
tt->yielded = when;
tt->running += (tt->yielded - tt->resumed);
/*
- * Insert this request into the TAIL of the workers list
+ * Insert this request into the TAIL of the worker's list
* of waiting requests.
*/
- l->prev = head->prev;
- l->next = head;
-
- head->prev->next = l;
- head->prev = l;
+ FR_DLIST_INSERT_TAIL(worker->list, tt->list);
}
*/
void fr_time_tracking_resume(fr_time_tracking_t *tt, fr_time_t when)
{
- fr_dlist_t *l = &(tt->list);
-
tt->when = when;
tt->resumed = when;
* Remove this request into the workers list of waiting
* requests.
*/
- l->prev->next = l->next;
- l->next->prev = l->prev;
-
- l->prev = l;
- l->next = l;
+ FR_DLIST_REMOVE(tt->list);
}
#define NANOSEC (1000000000)
#define USEC (1000000)
+/*
+ * Macros to manage a doubly linked list.
+ */
+#define FR_DLIST_INIT(head) do { head.prev = head.next = &head; } while (0)
+#define FR_DLIST_INSERT_TAIL(head, entry) do { entry.prev = head.prev; entry.next = &head; head.prev->next = &entry; head.prev = &entry; } while (0)
+#define FR_DLIST_REMOVE(entry) do { entry.prev->next = entry.next; entry.next->prev = entry.prev; FR_DLIST_INIT(entry); } while (0)
+
int fr_time_start(void);
fr_time_t fr_time(void);
void fr_time_to_timeval(struct timeval *tv, fr_time_t when) CC_HINT(nonnull);