#include <sys/time.h>
#include <common/config.h>
+#include <common/eb32tree.h>
#include <common/memory.h>
#include <common/mini-clist.h>
#include <common/standard.h>
extern unsigned int run_queue; /* run queue size */
extern unsigned int niced_tasks; /* number of niced tasks in the run queue */
extern struct pool_head *pool2_task;
-extern struct task *last_timer; /* optimization: last queued timer */
+extern struct eb32_node *last_timer; /* optimization: last queued timer */
/* return 0 if task is in run queue, otherwise non-zero */
static inline int task_in_rq(struct task *t)
static inline struct task *__task_unlink_wq(struct task *t)
{
eb32_delete(&t->wq);
- if (last_timer == t)
+ if (last_timer == &t->wq)
last_timer = NULL;
return t;
}
unsigned int run_queue = 0;
unsigned int niced_tasks = 0; /* number of niced tasks in the run queue */
-struct task *last_timer = NULL; /* optimization: last queued timer */
+struct eb32_node *last_timer = NULL; /* optimization: last queued timer */
static struct eb_root timers; /* sorted timers tree */
static struct eb_root rqueue; /* tree constituting the run queue */
#endif
if (likely(last_timer &&
- last_timer->wq.key == task->wq.key &&
- last_timer->wq.node.bit == -1 &&
- last_timer->wq.node.node_p)) {
+ last_timer->node.bit < 0 &&
+ last_timer->key == task->wq.key &&
+ last_timer->node.node_p)) {
/* Most often, last queued timer has the same expiration date, so
* if it's not queued at the root, let's queue a dup directly there.
- * Note that we can only use dups at the dup tree's root (bit==-1).
+ * Note that we can only use dups at the dup tree's root (most
+ * negative bit).
*/
- eb_insert_dup(&last_timer->wq.node, &task->wq.node);
+ eb_insert_dup(&last_timer->node, &task->wq.node);
+ if (task->wq.node.bit < last_timer->node.bit)
+ last_timer = &task->wq;
return;
}
eb32_insert(&timers, &task->wq);
- if (task->wq.node.bit == -1)
- last_timer = task; /* we only want a dup tree's root */
+ if (!last_timer || (task->wq.node.bit < last_timer->node.bit))
+ last_timer = &task->wq;
return;
}