From: Timo Sirainen Date: Mon, 13 Jun 2016 14:10:22 +0000 (+0300) Subject: lib-dict: Added dict_switch_ioloop() X-Git-Tag: 2.3.0.rc1~3479 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a5ec9755556e3d97d7e6d78cb1b53046370e6598;p=thirdparty%2Fdovecot%2Fcore.git lib-dict: Added dict_switch_ioloop() --- diff --git a/src/lib-dict/dict-client.c b/src/lib-dict/dict-client.c index 9b31a909e9..b33fa339da 100644 --- a/src/lib-dict/dict-client.c +++ b/src/lib-dict/dict-client.c @@ -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 } }; diff --git a/src/lib-dict/dict-file.c b/src/lib-dict/dict-file.c index f0c168d3c8..b35c2367f6 100644 --- a/src/lib-dict/dict-file.c +++ b/src/lib-dict/dict-file.c @@ -660,6 +660,7 @@ struct dict dict_driver_file = { dict_transaction_memory_set, dict_transaction_memory_unset, dict_transaction_memory_atomic_inc, + NULL, NULL } }; diff --git a/src/lib-dict/dict-memcached-ascii.c b/src/lib-dict/dict-memcached-ascii.c index 886d44a369..2e33a32882 100644 --- a/src/lib-dict/dict-memcached-ascii.c +++ b/src/lib-dict/dict-memcached-ascii.c @@ -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 } }; diff --git a/src/lib-dict/dict-memcached.c b/src/lib-dict/dict-memcached.c index dd962d87db..1fbe301eed 100644 --- a/src/lib-dict/dict-memcached.c +++ b/src/lib-dict/dict-memcached.c @@ -378,6 +378,7 @@ struct dict dict_driver_memcached = { NULL, NULL, NULL, + NULL, NULL } }; diff --git a/src/lib-dict/dict-private.h b/src/lib-dict/dict-private.h index 3c487eeb50..841edbc47d 100644 --- a/src/lib-dict/dict-private.h +++ b/src/lib-dict/dict-private.h @@ -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 { diff --git a/src/lib-dict/dict-redis.c b/src/lib-dict/dict-redis.c index b0841dae90..55ff248943 100644 --- a/src/lib-dict/dict-redis.c +++ b/src/lib-dict/dict-redis.c @@ -790,6 +790,7 @@ struct dict dict_driver_redis = { redis_set, redis_unset, redis_atomic_inc, + NULL, NULL } }; diff --git a/src/lib-dict/dict-sql.c b/src/lib-dict/dict-sql.c index 84d1a23452..343baad93d 100644 --- a/src/lib-dict/dict-sql.c +++ b/src/lib-dict/dict-sql.c @@ -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 } }; diff --git a/src/lib-dict/dict.c b/src/lib-dict/dict.c index dc8b4424d6..71e4804964 100644 --- a/src/lib-dict/dict.c +++ b/src/lib-dict/dict.c @@ -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 || diff --git a/src/lib-dict/dict.h b/src/lib-dict/dict.h index 4553102e1b..64501182ba 100644 --- a/src/lib-dict/dict.h +++ b/src/lib-dict/dict.h @@ -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. */ diff --git a/src/plugins/dict-ldap/dict-ldap.c b/src/plugins/dict-ldap/dict-ldap.c index a80f9d20fd..1ccd473162 100644 --- a/src/plugins/dict-ldap/dict-ldap.c +++ b/src/plugins/dict-ldap/dict-ldap.c @@ -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 } };