#endif /* ENABLE_CAP_NG */
}
+int print_task(const char *t, void *p, void *pp) {
+ printf("%p\n", t);
+ return 0;
+}
+
int main(int argc, char **argv)
{
if (setvbuf(stdout, NULL, _IONBF, 0) || setvbuf(stderr, NULL, _IONBF, 0)) {
ret = run_worker(loop, &engine, fork_id == 0, the_args);
cleanup:/* Cleanup. */
- for (int j=0; j<1<<20; j++) {
- if (the_worker->tasks[j] && the_worker->tasks[j]->refs) {
- printf("%p\n", the_worker->tasks[j]);
- }
- }
+ set_walk(&the_worker->tasks, print_task, NULL);
printf("bye!");
engine_deinit(&engine);
worker_deinit();
qr_task_ref(task);
task->creation_time = kr_now();
ctx->worker->stats.concurrent += 1;
- the_worker->tasks[the_worker->task_index] = task;
- the_worker->task_index++;
- the_worker->task_index %= 1<<20;
+ char addr[9] = {0};
+ memcpy(addr, &task, 8);
+ set_add(&the_worker->tasks, addr);
return task;
}
/* This is called when the task refcount is zero, free memory. */
static void qr_task_free(struct qr_task *task)
{
+ char addr[9] = {0};
+ memcpy(addr, &task, 8);
+ set_del(&the_worker->tasks, addr);
struct request_ctx *ctx = task->ctx;
assert(ctx);
#include "daemon/engine.h"
#include "lib/generic/array.h"
#include "lib/generic/map.h"
+#include "lib/generic/set.h"
/** Query resolution task (opaque). */
knot_mm_t pkt_pool;
unsigned int next_request_uid;
- struct qr_task *tasks[1<<20];
- int task_index;
+ set_t tasks;
};
/** @endcond */