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
client_dict_unset,
NULL,
client_dict_atomic_inc,
- client_dict_lookup_async
+ client_dict_lookup_async,
+ client_dict_switch_ioloop
}
};
dict_transaction_memory_unset,
dict_transaction_memory_append,
dict_transaction_memory_atomic_inc,
+ NULL,
NULL
}
};
dict_transaction_memory_unset,
dict_transaction_memory_append,
dict_transaction_memory_atomic_inc,
+ NULL,
NULL
}
};
void (*lookup_async)(struct dict *dict, const char *key,
dict_lookup_callback_t *callback, void *context);
+ bool (*switch_ioloop)(struct dict *dict);
};
struct dict {
redis_unset,
redis_append,
redis_atomic_inc,
+ NULL,
NULL
}
};
sql_dict_unset,
sql_dict_append,
sql_dict_atomic_inc,
- sql_dict_lookup_async
+ sql_dict_lookup_async,
+ NULL
}
};
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 ||
/* 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. */
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;
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)
{
NULL, /*ldap_unset,*/
NULL, /*ldap_append,*/
NULL, /*ldap_atomic_inc,*/
- ldap_dict_lookup_async
+ ldap_dict_lookup_async,
+ ldap_dict_switch_ioloop
}
};