Mercurial > dovecot > core-2.2
changeset 12424:172942ae0b58
lib-settings: Improved performance of previous duplicate key parsing change.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 15 Nov 2010 16:49:26 +0000 |
parents | 656da7e0d6b9 |
children | 10c163bb5e22 |
files | src/lib-settings/settings-parser.c |
diffstat | 1 files changed, 11 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-settings/settings-parser.c Mon Nov 15 16:42:19 2010 +0000 +++ b/src/lib-settings/settings-parser.c Mon Nov 15 16:49:26 2010 +0000 @@ -652,7 +652,7 @@ static bool settings_find_key_nth(struct setting_parser_context *ctx, const char *key, - unsigned int n, const struct setting_define **def_r, + unsigned int *n, const struct setting_define **def_r, struct setting_link **link_r) { const struct setting_define *def; @@ -661,16 +661,18 @@ unsigned int i; /* try to find from roots */ - for (i = 0; i < ctx->root_count; i++) { + for (i = *n; i < ctx->root_count; i++) { def = setting_define_find(ctx->roots[i].info, key); - if (def != NULL && n-- == 0) { + if (def != NULL) { + *n = i + 1; *def_r = def; *link_r = &ctx->roots[i]; return TRUE; } } - if (n > 0) + if (*n > ctx->root_count) return FALSE; + *n += 1; /* try to find from links */ end = strrchr(key, SETTINGS_SEPARATOR); @@ -696,7 +698,9 @@ const struct setting_define **def_r, struct setting_link **link_r) { - return settings_find_key_nth(ctx, key, 0, def_r, link_r); + unsigned int n = 0; + + return settings_find_key_nth(ctx, key, &n, def_r, link_r); } static void @@ -732,7 +736,7 @@ struct setting_link *link; unsigned int n = 0; - if (!settings_find_key(ctx, key, &def, &link)) { + if (!settings_find_key_nth(ctx, key, &n, &def, &link)) { ctx->error = p_strconcat(ctx->parser_pool, "Unknown setting: ", key, NULL); return 0; @@ -747,7 +751,7 @@ if (settings_parse(ctx, link, def, key, value) < 0) return -1; /* there may be more instances of the setting */ - } while (settings_find_key_nth(ctx, key, ++n, &def, &link)); + } while (settings_find_key_nth(ctx, key, &n, &def, &link)); return 1; }