]> 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)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 19 Jun 2016 23:56:20 +0000 (02:56 +0300)
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

index e1716b8f9cf71ca54b7e93ba513592c15c89ab14..032ae0c3491aae271d4aacf40d272422f6dd02fb 100644 (file)
@@ -552,25 +552,27 @@ static int 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);
+       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);
-       return 0;
+       return array_count(&dict->cmds) > 0;
 }
 
 static void
@@ -1019,6 +1021,7 @@ struct dict dict_driver_client = {
                client_dict_unset,
                NULL,
                client_dict_atomic_inc,
-               client_dict_lookup_async
+               client_dict_lookup_async,
+               client_dict_switch_ioloop
        }
 };
index b6d9f1750646bfd279b221e13b1bccc90fc79776..e22465ee20dc6d9781e0524fa90d760a68b64011 100644 (file)
@@ -663,6 +663,7 @@ struct dict dict_driver_file = {
                dict_transaction_memory_unset,
                dict_transaction_memory_append,
                dict_transaction_memory_atomic_inc,
+               NULL,
                NULL
        }
 };
index 7245a0229fb3888cd43ec786dd1fce14c99a1ad9..ebb27871ba3b5098faf4c25ba9d8432c8686969b 100644 (file)
@@ -664,6 +664,7 @@ struct dict dict_driver_memcached_ascii = {
                dict_transaction_memory_unset,
                dict_transaction_memory_append,
                dict_transaction_memory_atomic_inc,
+               NULL,
                NULL
        }
 };
index 7fc0f00d2cfccc81cab80070427b5e89e5fff146..f94e0552e7579838d6f688a9fdaa09f120f5d6be 100644 (file)
@@ -38,6 +38,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 8ff7160c3bb703c01b2516410a42b7aad38fc538..b7e92ce92854b1412884156379315188055071ae 100644 (file)
@@ -804,6 +804,7 @@ struct dict dict_driver_redis = {
                redis_unset,
                redis_append,
                redis_atomic_inc,
+               NULL,
                NULL
        }
 };
index f66d0a6047b169884457c370c9904ea3163d73a2..b142e360e18ac12eaa89e351bda627155316e078 100644 (file)
@@ -1260,7 +1260,8 @@ static struct dict sql_dict = {
                sql_dict_unset,
                sql_dict_append,
                sql_dict_atomic_inc,
-               sql_dict_lookup_async
+               sql_dict_lookup_async,
+               NULL
        }
 };
 
index e3d1deb2f5d4e9f001587450d1732468c9d36ee1..f6d3f68eead05071d3ef2d16fa4d2cd72657460f 100644 (file)
@@ -106,6 +106,14 @@ int dict_wait(struct dict *dict)
        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 ||
index ed661a9ac1920f014dea440e84012a7e2eb2e532..6188a1a1b712231d7917ae619bc00b0aed8740e2 100644 (file)
@@ -70,6 +70,10 @@ void dict_deinit(struct dict **dict);
 /* 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. */
index 770e562e5f8129c8daca8400854c2bb6d81a4908..c241f63367ce454d6e16f93e0c9b79d188d8c776 100644 (file)
@@ -240,14 +240,14 @@ int 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;
@@ -255,6 +255,14 @@ int ldap_dict_wait(struct dict *dict) {
        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 @@ struct dict dict_driver_ldap = {
                NULL, /*ldap_unset,*/
                NULL, /*ldap_append,*/
                NULL, /*ldap_atomic_inc,*/
-               ldap_dict_lookup_async
+               ldap_dict_lookup_async,
+               ldap_dict_switch_ioloop
        }
 };