Mercurial > dovecot > core-2.2
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 } };