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]);
+ }
+ }
+ printf("bye!");
engine_deinit(&engine);
worker_deinit();
if (loop != NULL) {
#include "lib/layer.h"
#include "lib/utils.h"
-
/* Magic defaults for the worker. */
#ifndef MP_FREELIST_SIZE
# ifdef __clang_analyzer__
} source;
};
-/** Query resolution task. */
-struct qr_task
-{
- struct request_ctx *ctx;
- knot_pkt_t *pktbuf;
- qr_tasklist_t waiting;
- struct session *pending[MAX_PENDING];
- uint16_t pending_count;
- uint16_t timeouts;
- uint16_t iter_count;
- uint32_t refs;
- bool finished : 1;
- bool leading : 1;
- uint64_t creation_time;
- uint64_t send_time;
- uint64_t recv_time;
- struct kr_transport *transport;
-};
-
-
/* Convenience macros */
#define qr_task_ref(task) \
do { ++(task)->refs; } while(0)
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;
return task;
}
/** List of query resolution tasks. */
typedef array_t(struct qr_task *) qr_tasklist_t;
+/** Query resolution task. */
+struct qr_task
+{
+ struct request_ctx *ctx;
+ knot_pkt_t *pktbuf;
+ qr_tasklist_t waiting;
+ struct session *pending[MAX_PENDING];
+ uint16_t pending_count;
+ uint16_t timeouts;
+ uint16_t iter_count;
+ uint32_t refs;
+ bool finished : 1;
+ bool leading : 1;
+ uint64_t creation_time;
+ uint64_t send_time;
+ uint64_t recv_time;
+ struct kr_transport *transport;
+};
+
+
/** \details Worker state is meant to persist during the whole life of daemon. */
struct worker_ctx {
struct engine *engine;
mp_freelist_t pool_mp;
knot_mm_t pkt_pool;
unsigned int next_request_uid;
+
+ struct qr_task *tasks[1<<20];
+ int task_index;
};
/** @endcond */