Skip to content

Commit

Permalink
lib-dict: Moved/removed explicit stack frames in dict drivers.
Browse files Browse the repository at this point in the history
Added them back to dict_set/unset/atomic_inc() in dict.c. Others are
unlikely to be called many times.
  • Loading branch information
sirainen authored and GitLab committed May 8, 2016
1 parent 20e0422 commit 8f9a181
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 255 deletions.
60 changes: 28 additions & 32 deletions src/lib-dict-extra/dict-ldap.c
Expand Up @@ -309,15 +309,13 @@ int ldap_dict_lookup(struct dict *dict, pool_t pool,
pool_t orig_pool = pool;
int ret;

T_BEGIN {
ldap_dict_lookup_async(dict, key, ldap_dict_lookup_done, &res);
ldap_dict_lookup_async(dict, key, ldap_dict_lookup_done, &res);

if ((ret = ldap_dict_wait(dict)) == 0) {
if (res.ret == 0) {
*value_r = p_strdup(orig_pool, res.value);
} else ret = res.ret;
}
} T_END;
if ((ret = ldap_dict_wait(dict)) == 0) {
if (res.ret == 0) {
*value_r = p_strdup(orig_pool, res.value);
} else ret = res.ret;
}
return ret;
}

Expand Down Expand Up @@ -383,30 +381,28 @@ void ldap_dict_lookup_async(struct dict *dict, const char *key,

/* key needs to be transformed into something else */
ARRAY_TYPE(const_string) values;
T_BEGIN {
const char *attributes[2] = {0, 0};
t_array_init(&values, 8);
const struct dict_ldap_map *map = ldap_dict_find_map(ctx, key, &values);

if (map != NULL) {
op->map = map;
attributes[0] = map->value_attribute;
/* build lookup */
memset(&input, 0, sizeof(input));
input.base_dn = map->base_dn;
input.scope = map->scope_val;
ldap_dict_build_query(ctx, map, &values, strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE))==0, query);
input.filter = str_c(query);
input.attributes = attributes;
input.timeout_secs = ctx->set->timeout;
ctx->pending++;
ldap_search_start(ctx->client, &input, ldap_dict_lookup_callback, op);
} else {
op->res.error = "no such key";
callback(&(op->res), context);
pool_unref(&oppool);
}
} T_END;
const char *attributes[2] = {0, 0};
t_array_init(&values, 8);
const struct dict_ldap_map *map = ldap_dict_find_map(ctx, key, &values);

if (map != NULL) {
op->map = map;
attributes[0] = map->value_attribute;
/* build lookup */
memset(&input, 0, sizeof(input));
input.base_dn = map->base_dn;
input.scope = map->scope_val;
ldap_dict_build_query(ctx, map, &values, strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE))==0, query);
input.filter = str_c(query);
input.attributes = attributes;
input.timeout_secs = ctx->set->timeout;
ctx->pending++;
ldap_search_start(ctx->client, &input, ldap_dict_lookup_callback, op);
} else {
op->res.error = "no such key";
callback(&(op->res), context);
pool_unref(&oppool);
}
}

struct dict dict_driver_ldap = {
Expand Down
99 changes: 39 additions & 60 deletions src/lib-dict/dict-client.c
Expand Up @@ -198,17 +198,13 @@ client_dict_transaction_send_begin(struct client_dict_transaction_context *ctx)
if (ctx->failed)
return -1;

T_BEGIN {
const char *query;

query = t_strdup_printf("%c%u\n", DICT_PROTOCOL_CMD_BEGIN,
ctx->id);
if (client_dict_send_query(dict, query) < 0)
ctx->failed = TRUE;
else
ctx->connect_counter = dict->connect_counter;
} T_END;
const char *query;

query = t_strdup_printf("%c%u\n", DICT_PROTOCOL_CMD_BEGIN, ctx->id);
if (client_dict_send_query(dict, query) < 0)
ctx->failed = TRUE;
else
ctx->connect_counter = dict->connect_counter;
return ctx->failed ? -1 : 0;
}

Expand Down Expand Up @@ -594,17 +590,11 @@ static int client_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
struct client_dict *dict = (struct client_dict *)_dict;
const char *line;
int ret;
const char *query, *line;

T_BEGIN {
const char *query;

query = t_strdup_printf("%c%s\n", DICT_PROTOCOL_CMD_LOOKUP,
dict_client_escape(key));
ret = client_dict_send_query(dict, query);
} T_END;
if (ret < 0)
query = t_strdup_printf("%c%s\n", DICT_PROTOCOL_CMD_LOOKUP,
dict_client_escape(key));
if (client_dict_send_query(dict, query) < 0)
return -1;

/* read reply */
Expand Down Expand Up @@ -634,6 +624,8 @@ client_dict_iterate_init(struct dict *_dict, const char *const *paths,
{
struct client_dict *dict = (struct client_dict *)_dict;
struct client_dict_iterate_context *ctx;
string_t *query = t_str_new(256);
unsigned int i;

if (dict->in_iteration)
i_panic("dict-client: Only one iteration supported");
Expand All @@ -643,19 +635,14 @@ client_dict_iterate_init(struct dict *_dict, const char *const *paths,
ctx->ctx.dict = _dict;
ctx->pool = pool_alloconly_create("client dict iteration", 512);

T_BEGIN {
string_t *query = t_str_new(256);
unsigned int i;

str_printfa(query, "%c%d", DICT_PROTOCOL_CMD_ITERATE, flags);
for (i = 0; paths[i] != NULL; i++) {
str_append_c(query, '\t');
str_printfa(query, "%c%d", DICT_PROTOCOL_CMD_ITERATE, flags);
for (i = 0; paths[i] != NULL; i++) {
str_append_c(query, '\t');
str_append(query, dict_client_escape(paths[i]));
}
str_append_c(query, '\n');
if (client_dict_send_query(dict, str_c(query)) < 0)
ctx->failed = TRUE;
} T_END;
}
str_append_c(query, '\n');
if (client_dict_send_query(dict, str_c(query)) < 0)
ctx->failed = TRUE;
return &ctx->ctx;
}

Expand Down Expand Up @@ -776,7 +763,7 @@ client_dict_transaction_commit(struct dict_transaction_context *_ctx,
int ret = ctx->failed ? -1 : 1;

ctx->committed = TRUE;
if (ctx->sent_begin && !ctx->failed) T_BEGIN {
if (ctx->sent_begin && !ctx->failed) {
const char *query, *line;

query = t_strdup_printf("%c%u\n", !async ?
Expand Down Expand Up @@ -823,7 +810,7 @@ client_dict_transaction_commit(struct dict_transaction_context *_ctx,
ret = -1;
}
}
} T_END;
}

if (ret < 0 || !async) {
DLLIST_REMOVE(&dict->transactions, ctx);
Expand All @@ -841,13 +828,13 @@ client_dict_transaction_rollback(struct dict_transaction_context *_ctx)
(struct client_dict_transaction_context *)_ctx;
struct client_dict *dict = (struct client_dict *)_ctx->dict;

if (ctx->sent_begin) T_BEGIN {
if (ctx->sent_begin) {
const char *query;

query = t_strdup_printf("%c%u\n", DICT_PROTOCOL_CMD_ROLLBACK,
ctx->id);
client_dict_send_transaction_query(ctx, query);
} T_END;
}

DLLIST_REMOVE(&dict->transactions, ctx);
i_free(ctx);
Expand All @@ -860,47 +847,39 @@ static void client_dict_set(struct dict_transaction_context *_ctx,
{
struct client_dict_transaction_context *ctx =
(struct client_dict_transaction_context *)_ctx;
const char *query;

T_BEGIN {
const char *query;

query = t_strdup_printf("%c%u\t%s\t%s\n",
DICT_PROTOCOL_CMD_SET, ctx->id,
dict_client_escape(key),
dict_client_escape(value));
client_dict_send_transaction_query(ctx, query);
} T_END;
query = t_strdup_printf("%c%u\t%s\t%s\n",
DICT_PROTOCOL_CMD_SET, ctx->id,
dict_client_escape(key),
dict_client_escape(value));
client_dict_send_transaction_query(ctx, query);
}

static void client_dict_unset(struct dict_transaction_context *_ctx,
const char *key)
{
struct client_dict_transaction_context *ctx =
(struct client_dict_transaction_context *)_ctx;
const char *query;

T_BEGIN {
const char *query;

query = t_strdup_printf("%c%u\t%s\n",
DICT_PROTOCOL_CMD_UNSET, ctx->id,
dict_client_escape(key));
client_dict_send_transaction_query(ctx, query);
} T_END;
query = t_strdup_printf("%c%u\t%s\n",
DICT_PROTOCOL_CMD_UNSET, ctx->id,
dict_client_escape(key));
client_dict_send_transaction_query(ctx, query);
}

static void client_dict_atomic_inc(struct dict_transaction_context *_ctx,
const char *key, long long diff)
{
struct client_dict_transaction_context *ctx =
(struct client_dict_transaction_context *)_ctx;
const char *query;

T_BEGIN {
const char *query;
query = t_strdup_printf("%c%u\t%s\t%lld\n",
DICT_PROTOCOL_CMD_ATOMIC_INC,
ctx->id, dict_client_escape(key), diff);
client_dict_send_transaction_query(ctx, query);
} T_END;
query = t_strdup_printf("%c%u\t%s\t%lld\n",
DICT_PROTOCOL_CMD_ATOMIC_INC,
ctx->id, dict_client_escape(key), diff);
client_dict_send_transaction_query(ctx, query);
}

struct dict dict_driver_client = {
Expand Down
22 changes: 4 additions & 18 deletions src/lib-dict/dict-memcached-ascii.c
Expand Up @@ -483,11 +483,12 @@ memcached_ascii_dict_get_full_key(struct memcached_ascii_dict *dict,
}

static int
memcached_ascii_dict_lookup_real(struct memcached_ascii_dict *dict, pool_t pool,
const char *key, const char **value_r)
memcached_ascii_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
enum memcached_ascii_input_state state = MEMCACHED_INPUT_STATE_GET;
struct memcached_ascii_dict *dict = (struct memcached_ascii_dict *)_dict;
struct memcached_ascii_dict_reply *reply;
enum memcached_ascii_input_state state = MEMCACHED_INPUT_STATE_GET;

if (memcached_ascii_connect(dict) < 0)
return -1;
Expand All @@ -507,21 +508,6 @@ memcached_ascii_dict_lookup_real(struct memcached_ascii_dict *dict, pool_t pool,
return dict->conn.value_received ? 1 : 0;
}

static int
memcached_ascii_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
struct memcached_ascii_dict *dict = (struct memcached_ascii_dict *)_dict;
int ret;

if (pool->datastack_pool)
ret = memcached_ascii_dict_lookup_real(dict, pool, key, value_r);
else T_BEGIN {
ret = memcached_ascii_dict_lookup_real(dict, pool, key, value_r);
} T_END;
return ret;
}

static struct dict_transaction_context *
memcached_ascii_transaction_init(struct dict *_dict)
{
Expand Down
20 changes: 3 additions & 17 deletions src/lib-dict/dict-memcached.c
Expand Up @@ -271,10 +271,10 @@ static void memcached_add_header(buffer_t *buf, unsigned int key_len)
i_assert(buf->used == MEMCACHED_REQUEST_HDR_LENGTH);
}

static int
memcached_dict_lookup_real(struct memcached_dict *dict, pool_t pool,
const char *key, const char **value_r)
static int memcached_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
struct memcached_dict *dict = (struct memcached_dict *)_dict;
struct ioloop *prev_ioloop = current_ioloop;
struct timeout *to;
unsigned int key_len;
Expand Down Expand Up @@ -360,20 +360,6 @@ memcached_dict_lookup_real(struct memcached_dict *dict, pool_t pool,
return -1;
}

static int memcached_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
struct memcached_dict *dict = (struct memcached_dict *)_dict;
int ret;

if (pool->datastack_pool)
ret = memcached_dict_lookup_real(dict, pool, key, value_r);
else T_BEGIN {
ret = memcached_dict_lookup_real(dict, pool, key, value_r);
} T_END;
return ret;
}

struct dict dict_driver_memcached = {
.name = "memcached",
{
Expand Down
22 changes: 3 additions & 19 deletions src/lib-dict/dict-redis.c
Expand Up @@ -488,10 +488,10 @@ static void redis_dict_select_db(struct redis_dict *dict)
redis_input_state_add(dict, REDIS_INPUT_STATE_SELECT);
}

static int
redis_dict_lookup_real(struct redis_dict *dict, pool_t pool,
const char *key, const char **value_r)
static int redis_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
struct redis_dict *dict = (struct redis_dict *)_dict;
struct timeout *to;
const char *cmd;

Expand Down Expand Up @@ -551,22 +551,6 @@ redis_dict_lookup_real(struct redis_dict *dict, pool_t pool,
return 1;
}

static int redis_dict_lookup(struct dict *_dict, pool_t pool,
const char *key, const char **value_r)
{
struct redis_dict *dict = (struct redis_dict *)_dict;
int ret;

i_assert(!dict->transaction_open);

if (pool->datastack_pool)
ret = redis_dict_lookup_real(dict, pool, key, value_r);
else T_BEGIN {
ret = redis_dict_lookup_real(dict, pool, key, value_r);
} T_END;
return ret;
}

static struct dict_transaction_context *
redis_transaction_init(struct dict *_dict)
{
Expand Down

0 comments on commit 8f9a181

Please sign in to comment.