]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Added dict_switch_ioloop()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 13 Jun 2016 14:10:22 +0000 (17:10 +0300)
committerGitLab <gitlab@git.dovecot.net>
Sun, 19 Jun 2016 23:37:38 +0000 (02:37 +0300)
src/lib-dict/dict-client.c
src/lib-dict/dict-file.c
src/lib-dict/dict-memcached-ascii.c
src/lib-dict/dict-memcached.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

index 9b31a909e9d754549706d894620c040f37482093..b33fa339dadcbd1b0818e14832a44a0e752648b3 100644 (file)
@@ -552,24 +552,26 @@ static void client_dict_wait(struct dict *_dict)
 
        dict->prev_ioloop = current_ioloop;
        io_loop_set_current(dict->ioloop);
-
-       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);
-
+       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);
+}
+
+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);
+       return array_count(&dict->cmds) > 0;
 }
 
 static void
@@ -1008,6 +1010,7 @@ struct dict dict_driver_client = {
                client_dict_set,
                client_dict_unset,
                client_dict_atomic_inc,
-               client_dict_lookup_async
+               client_dict_lookup_async,
+               client_dict_switch_ioloop
        }
 };
index f0c168d3c88a9b5ba518068b43001dc0fdf25cdd..b35c2367f6d513a782720523a7323bfb0fd67f34 100644 (file)
@@ -660,6 +660,7 @@ struct dict dict_driver_file = {
                dict_transaction_memory_set,
                dict_transaction_memory_unset,
                dict_transaction_memory_atomic_inc,
+               NULL,
                NULL
        }
 };
index 886d44a36975cb16acb7fe95b8001c3cbac88cfe..2e33a32882ef50217bf4dabf189af5ce503e0b09 100644 (file)
@@ -673,6 +673,7 @@ struct dict dict_driver_memcached_ascii = {
                dict_transaction_memory_set,
                dict_transaction_memory_unset,
                dict_transaction_memory_atomic_inc,
+               NULL,
                NULL
        }
 };
index dd962d87db2eab0f771c06b04097408ccdaee589..1fbe301eedd6078007346d80260e31103a396940 100644 (file)
@@ -378,6 +378,7 @@ struct dict dict_driver_memcached = {
                NULL,
                NULL,
                NULL,
+               NULL,
                NULL
        }
 };
index 3c487eeb5025abcd5c52f93c3ece3a1703542fdd..841edbc47d38bcfbcd0f428ecbd1e88698aee8ab 100644 (file)
@@ -39,6 +39,7 @@ struct dict_vfuncs {
 
        void (*lookup_async)(struct dict *dict, const char *key,
                             dict_lookup_callback_t *callback, void *context);
+       bool (*switch_ioloop)(struct dict *dict);
 };
 
 struct dict {
index b0841dae905ef78e225f2e6bc88e20565b0db644..55ff2489434c798530992731ae3fbc110f3d5747 100644 (file)
@@ -790,6 +790,7 @@ struct dict dict_driver_redis = {
                redis_set,
                redis_unset,
                redis_atomic_inc,
+               NULL,
                NULL
        }
 };
index 84d1a2345216b80fec410606194f5a030bb7b1d3..343baad93dca3674ebb9f5801325ad3c997d168f 100644 (file)
@@ -1237,7 +1237,8 @@ static struct dict sql_dict = {
                sql_dict_set,
                sql_dict_unset,
                sql_dict_atomic_inc,
-               sql_dict_lookup_async
+               sql_dict_lookup_async,
+               NULL
        }
 };
 
index dc8b4424d67f5fe8b785e251afa1205ff65fb342..71e48049649fac6939782eb9dc2e230da7c48e65 100644 (file)
@@ -101,6 +101,14 @@ void dict_wait(struct dict *dict)
                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 ||
index 4553102e1bdb06ef949f4a876ff421efd9c78c72..64501182ba0f025c8bbbe7b5f0ce051719638a5c 100644 (file)
@@ -73,6 +73,10 @@ int dict_init(const char *uri, const struct dict_settings *set,
 void dict_deinit(struct dict **dict);
 /* Wait for all pending asynchronous operations to finish. */
 void 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. */
index a80f9d20fdb0f8f60d8cb269f39a06bc074764ee..1ccd47316226096f9c962fad502ed945f15f1f46 100644 (file)
@@ -240,19 +240,27 @@ static void ldap_dict_wait(struct dict *dict)
 
        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;
 }
 
+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)
 {
@@ -419,7 +427,8 @@ struct dict dict_driver_ldap = {
                NULL, /*ldap_set,*/
                NULL, /*ldap_unset,*/
                NULL, /*ldap_atomic_inc,*/
-               ldap_dict_lookup_async
+               ldap_dict_lookup_async,
+               ldap_dict_switch_ioloop
        }
 };