changeset 20341:b9a3058184f1

lib-dict: Added dict_switch_ioloop()
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 13 Jun 2016 17:10:22 +0300
parents 0788113759af
children ddf54fabf231
files src/lib-dict/dict-client.c src/lib-dict/dict-file.c src/lib-dict/dict-memcached-ascii.c src/lib-dict/dict-private.h src/lib-dict/dict-redis.c src/lib-dict/dict-sql.c src/lib-dict/dict.c src/lib-dict/dict.h src/plugins/dict-ldap/dict-ldap.c
diffstat 9 files changed, 47 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-client.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict-client.c	Mon Jun 13 17:10:22 2016 +0300
@@ -552,25 +552,27 @@
 
 	dict->prev_ioloop = current_ioloop;
 	io_loop_set_current(dict->ioloop);
+	dict_switch_ioloop(_dict);
+	while (array_count(&dict->cmds) > 0)
+		io_loop_run(dict->ioloop);
+
+	io_loop_set_current(dict->prev_ioloop);
+	dict->prev_ioloop = NULL;
+
+	dict_switch_ioloop(_dict);
+	return 0;
+}
+
+static bool client_dict_switch_ioloop(struct dict *_dict)
+{
+	struct client_dict *dict = (struct client_dict *)_dict;
 
 	if (dict->to_idle != NULL)
 		dict->to_idle = io_loop_move_timeout(&dict->to_idle);
 	if (dict->to_requests != NULL)
 		dict->to_requests = io_loop_move_timeout(&dict->to_requests);
 	connection_switch_ioloop(&dict->conn.conn);
-
-	while (array_count(&dict->cmds) > 0)
-		io_loop_run(dict->ioloop);
-
-	io_loop_set_current(dict->prev_ioloop);
-	dict->prev_ioloop = NULL;
-
-	if (dict->to_idle != NULL)
-		dict->to_idle = io_loop_move_timeout(&dict->to_idle);
-	if (dict->to_requests != NULL)
-		dict->to_requests = io_loop_move_timeout(&dict->to_requests);
-	connection_switch_ioloop(&dict->conn.conn);
-	return 0;
+	return array_count(&dict->cmds) > 0;
 }
 
 static void
@@ -1019,6 +1021,7 @@
 		client_dict_unset,
 		NULL,
 		client_dict_atomic_inc,
-		client_dict_lookup_async
+		client_dict_lookup_async,
+		client_dict_switch_ioloop
 	}
 };
--- a/src/lib-dict/dict-file.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict-file.c	Mon Jun 13 17:10:22 2016 +0300
@@ -663,6 +663,7 @@
 		dict_transaction_memory_unset,
 		dict_transaction_memory_append,
 		dict_transaction_memory_atomic_inc,
+		NULL,
 		NULL
 	}
 };
--- a/src/lib-dict/dict-memcached-ascii.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict-memcached-ascii.c	Mon Jun 13 17:10:22 2016 +0300
@@ -664,6 +664,7 @@
 		dict_transaction_memory_unset,
 		dict_transaction_memory_append,
 		dict_transaction_memory_atomic_inc,
+		NULL,
 		NULL
 	}
 };
--- a/src/lib-dict/dict-private.h	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict-private.h	Mon Jun 13 17:10:22 2016 +0300
@@ -38,6 +38,7 @@
 
 	void (*lookup_async)(struct dict *dict, const char *key,
 			     dict_lookup_callback_t *callback, void *context);
+	bool (*switch_ioloop)(struct dict *dict);
 };
 
 struct dict {
--- a/src/lib-dict/dict-redis.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict-redis.c	Mon Jun 13 17:10:22 2016 +0300
@@ -804,6 +804,7 @@
 		redis_unset,
 		redis_append,
 		redis_atomic_inc,
+		NULL,
 		NULL
 	}
 };
--- a/src/lib-dict/dict-sql.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict-sql.c	Mon Jun 13 17:10:22 2016 +0300
@@ -1260,7 +1260,8 @@
 		sql_dict_unset,
 		sql_dict_append,
 		sql_dict_atomic_inc,
-		sql_dict_lookup_async
+		sql_dict_lookup_async,
+		NULL
 	}
 };
 
--- a/src/lib-dict/dict.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict.c	Mon Jun 13 17:10:22 2016 +0300
@@ -106,6 +106,14 @@
 	return dict->v.wait == NULL ? 1 : dict->v.wait(dict);
 }
 
+bool dict_switch_ioloop(struct dict *dict)
+{
+	if (dict->v.switch_ioloop != NULL)
+		return dict->v.switch_ioloop(dict);
+	else
+		return FALSE;
+}
+
 static bool dict_key_prefix_is_valid(const char *key)
 {
 	return strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0 ||
--- a/src/lib-dict/dict.h	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/lib-dict/dict.h	Mon Jun 13 17:10:22 2016 +0300
@@ -70,6 +70,10 @@
 /* Wait for all pending asynchronous operations to finish.
    Returns 0 if ok, -1 if error. */
 int dict_wait(struct dict *dict);
+/* Switch the dict to the current ioloop. This can be used to do dict_wait()
+   among other IO work. Returns TRUE if there is actually some work that can
+   be waited on. */
+bool dict_switch_ioloop(struct dict *dict) ATTR_NOWARN_UNUSED_RESULT;
 
 /* Lookup value for key. Set it to NULL if it's not found.
    Returns 1 if found, 0 if not found and -1 if lookup failed. */
--- a/src/plugins/dict-ldap/dict-ldap.c	Thu Jun 02 00:57:17 2016 +0300
+++ b/src/plugins/dict-ldap/dict-ldap.c	Mon Jun 13 17:10:22 2016 +0300
@@ -240,14 +240,14 @@
 
 	ctx->prev_ioloop = current_ioloop;
 	ctx->ioloop = io_loop_create();
-	ldap_client_switch_ioloop(ctx->client);
+	dict_switch_ioloop(dict);
 
 	do {
 		io_loop_run(current_ioloop);
 	} while (ctx->pending > 0);
 
 	io_loop_set_current(ctx->prev_ioloop);
-	ldap_client_switch_ioloop(ctx->client);
+	dict_switch_ioloop(dict);
 	io_loop_set_current(ctx->ioloop);
 	io_loop_destroy(&ctx->ioloop);
 	ctx->prev_ioloop = NULL;
@@ -255,6 +255,14 @@
 	return 0;
 }
 
+static bool ldap_dict_switch_ioloop(struct dict *dict)
+{
+	struct ldap_dict *ctx = (struct ldap_dict *)dict;
+
+	ldap_client_switch_ioloop(ctx->client);
+	return ctx->pending > 0;
+}
+
 static
 void ldap_dict_lookup_done(const struct dict_lookup_result *result, void *ctx)
 {
@@ -429,7 +437,8 @@
 		NULL, /*ldap_unset,*/
 		NULL, /*ldap_append,*/
 		NULL, /*ldap_atomic_inc,*/
-		ldap_dict_lookup_async
+		ldap_dict_lookup_async,
+		ldap_dict_switch_ioloop
 	}
 };