mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 17:23:36 +00:00
kconfig: cache expression values
Cache expression values to avoid recalculating them repeatedly. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
f93d6bfbd2
commit
95573cac25
@ -396,6 +396,8 @@ int conf_read_simple(const char *name, int def)
|
||||
}
|
||||
}
|
||||
|
||||
expr_invalidate_all();
|
||||
|
||||
while (getline_stripped(&line, &line_asize, in) != -1) {
|
||||
struct menu *choice;
|
||||
|
||||
|
@ -887,7 +887,7 @@ static enum string_value_kind expr_parse_string(const char *str,
|
||||
? kind : k_string;
|
||||
}
|
||||
|
||||
tristate expr_calc_value(struct expr *e)
|
||||
static tristate __expr_calc_value(struct expr *e)
|
||||
{
|
||||
tristate val1, val2;
|
||||
const char *str1, *str2;
|
||||
@ -895,9 +895,6 @@ tristate expr_calc_value(struct expr *e)
|
||||
union string_value lval = {}, rval = {};
|
||||
int res;
|
||||
|
||||
if (!e)
|
||||
return yes;
|
||||
|
||||
switch (e->type) {
|
||||
case E_SYMBOL:
|
||||
sym_calc_value(e->left.sym);
|
||||
@ -961,6 +958,35 @@ tristate expr_calc_value(struct expr *e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* expr_calc_value - return the tristate value of the given expression
|
||||
* @e: expression
|
||||
* return: tristate value of the expression
|
||||
*/
|
||||
tristate expr_calc_value(struct expr *e)
|
||||
{
|
||||
if (!e)
|
||||
return yes;
|
||||
|
||||
if (!e->val_is_valid) {
|
||||
e->val = __expr_calc_value(e);
|
||||
e->val_is_valid = true;
|
||||
}
|
||||
|
||||
return e->val;
|
||||
}
|
||||
|
||||
/**
|
||||
* expr_invalidate_all - invalidate all cached expression values
|
||||
*/
|
||||
void expr_invalidate_all(void)
|
||||
{
|
||||
struct expr *e;
|
||||
|
||||
hash_for_each(expr_hashtable, e, node)
|
||||
e->val_is_valid = false;
|
||||
}
|
||||
|
||||
static int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
||||
{
|
||||
if (t1 == t2)
|
||||
|
@ -39,12 +39,16 @@ union expr_data {
|
||||
*
|
||||
* @node: link node for the hash table
|
||||
* @type: expressoin type
|
||||
* @val: calculated tristate value
|
||||
* @val_is_valid: indicate whether the value is valid
|
||||
* @left: left node
|
||||
* @right: right node
|
||||
*/
|
||||
struct expr {
|
||||
struct hlist_node node;
|
||||
enum expr_type type;
|
||||
tristate val;
|
||||
bool val_is_valid;
|
||||
union expr_data left, right;
|
||||
};
|
||||
|
||||
|
@ -15,6 +15,8 @@ extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE);
|
||||
|
||||
extern HASHTABLE_DECLARE(expr_hashtable, EXPR_HASHSIZE);
|
||||
|
||||
void expr_invalidate_all(void);
|
||||
|
||||
struct menu;
|
||||
|
||||
extern struct menu *current_menu, *current_entry;
|
||||
|
@ -519,6 +519,7 @@ void sym_clear_all_valid(void)
|
||||
|
||||
for_all_symbols(sym)
|
||||
sym->flags &= ~SYMBOL_VALID;
|
||||
expr_invalidate_all();
|
||||
conf_set_changed(true);
|
||||
sym_calc_value(modules_sym);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user