From cc386ead87f5b5cd17b248e3e1ff2b10b0420a04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= <marek.vavrusa@nic.cz>
Date: Wed, 31 Dec 2014 01:27:12 +0100
Subject: [PATCH] worker: caller now creates (optional) cache

---
 daemon/worker.c | 21 +++++++++++++++++++--
 daemon/worker.h |  2 +-
 lib/context.c   | 19 +++++++++++--------
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/daemon/worker.c b/daemon/worker.c
index e61050190..2cbdb3590 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -23,6 +23,9 @@
 #include "daemon/worker.h"
 #include "daemon/layer/query.h"
 
+/* Defines */
+#define CACHE_DEFAULT_SIZE 10*1024*1024
+
 static void buf_alloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf)
 {
 	struct worker_ctx *worker = handle->data;
@@ -86,12 +89,26 @@ static void worker_recv(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf,
 	knot_pkt_free(&answer);
 }
 
-void worker_init(struct worker_ctx *worker, mm_ctx_t *mm)
+int worker_init(struct worker_ctx *worker, mm_ctx_t *mm)
 {
 	memset(worker, 0, sizeof(struct worker_ctx));
 	worker->pool = mm;
 
-	kr_context_init(&worker->resolve, mm);
+	/* Open resolution context */
+	int ret = kr_context_init(&worker->resolve, mm);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	/* Open resolution context cache */
+	worker->resolve.cache = kr_cache_open("/tmp/kresolved", mm, CACHE_DEFAULT_SIZE);
+	if (worker->resolve.cache == NULL) {
+		fprintf(stderr, "Cache directory '/tmp/kresolved' not exists, exitting.\n");
+		kr_context_deinit(&worker->resolve);
+		return KNOT_ERROR;
+	}
+
+	return KNOT_EOK;
 }
 
 void worker_deinit(struct worker_ctx *worker)
diff --git a/daemon/worker.h b/daemon/worker.h
index 6047ba58b..32b57fe40 100644
--- a/daemon/worker.h
+++ b/daemon/worker.h
@@ -26,7 +26,7 @@ struct worker_ctx {
 	mm_ctx_t *pool;
 };
 
-void worker_init(struct worker_ctx *worker, mm_ctx_t *mm);
+int worker_init(struct worker_ctx *worker, mm_ctx_t *mm);
 void worker_deinit(struct worker_ctx *worker);
 void worker_start(uv_udp_t *req, struct worker_ctx *worker);
 void worker_stop(uv_udp_t *req);
diff --git a/lib/context.c b/lib/context.c
index dd3139cb5..9de4c3d65 100644
--- a/lib/context.c
+++ b/lib/context.c
@@ -23,22 +23,25 @@
 
 int kr_context_init(struct kr_context *ctx, mm_ctx_t *mm)
 {
-	memset(ctx, 0, sizeof(struct kr_context));
+	if (ctx == NULL) {
+		return KNOT_EINVAL;
+	}
 
+	memset(ctx, 0, sizeof(struct kr_context));
 	ctx->pool = mm;
 
-	ctx->cache = kr_cache_open("/tmp/kresolved", mm);
-	if (ctx->cache == NULL) {
-		fprintf(stderr, "Cache directory '/tmp/kresolved' not exists, exitting.\n");
-		return KNOT_ERROR;
-	}
-
 	return KNOT_EOK;
 }
 
 int kr_context_deinit(struct kr_context *ctx)
 {
-	kr_cache_close(ctx->cache);
+	if (ctx == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	if (ctx->cache) {
+		kr_cache_close(ctx->cache);
+	}
 
 	return KNOT_EOK;
 }
-- 
GitLab