Print this page
11972 resync smatch
@@ -39,12 +39,13 @@
int i;
if (!sm)
return "<none>";
- pos = snprintf(buf, sizeof(buf), "[%s] '%s' = '%s'",
- check_name(sm->owner), sm->name, show_state(sm->state));
+ pos = snprintf(buf, sizeof(buf), "[%s] %s = '%s'%s",
+ check_name(sm->owner), sm->name, show_state(sm->state),
+ sm->merged ? " [merged]" : "");
if (pos > sizeof(buf))
goto truncate;
if (ptr_list_size((struct ptr_list *)sm->possible) == 1)
return buf;
@@ -689,19 +690,23 @@
struct state_list *add_to_one = NULL;
struct state_list *add_to_two = NULL;
AvlIter one_iter;
AvlIter two_iter;
+ __set_cur_stree_readonly();
+
avl_iter_begin(&one_iter, *one, FORWARD);
avl_iter_begin(&two_iter, *two, FORWARD);
for (;;) {
if (!one_iter.sm && !two_iter.sm)
break;
if (cmp_tracker(one_iter.sm, two_iter.sm) < 0) {
__set_fake_cur_stree_fast(*two);
+ __in_unmatched_hook++;
tmp_state = __client_unmatched_state_function(one_iter.sm);
+ __in_unmatched_hook--;
__pop_fake_cur_stree_fast();
sm = alloc_state_no_name(one_iter.sm->owner, one_iter.sm->name,
one_iter.sm->sym, tmp_state);
add_ptr_list(&add_to_two, sm);
avl_iter_next(&one_iter);
@@ -708,19 +713,23 @@
} else if (cmp_tracker(one_iter.sm, two_iter.sm) == 0) {
avl_iter_next(&one_iter);
avl_iter_next(&two_iter);
} else {
__set_fake_cur_stree_fast(*one);
+ __in_unmatched_hook++;
tmp_state = __client_unmatched_state_function(two_iter.sm);
+ __in_unmatched_hook--;
__pop_fake_cur_stree_fast();
sm = alloc_state_no_name(two_iter.sm->owner, two_iter.sm->name,
two_iter.sm->sym, tmp_state);
add_ptr_list(&add_to_one, sm);
avl_iter_next(&two_iter);
}
}
+ __set_cur_stree_writable();
+
FOR_EACH_PTR(add_to_one, sm) {
avl_insert(one, sm);
} END_FOR_EACH_PTR(sm);
FOR_EACH_PTR(add_to_two, sm) {
@@ -731,33 +740,42 @@
free_slist(&add_to_two);
}
static void call_pre_merge_hooks(struct stree **one, struct stree **two)
{
- struct sm_state *sm, *other;
+ struct sm_state *sm, *cur;
+ struct stree *new;
- save_all_states();
+ __in_unmatched_hook++;
- __swap_cur_stree(*one);
+ __set_fake_cur_stree_fast(*one);
+ __push_fake_cur_stree();
FOR_EACH_SM(*two, sm) {
- other = get_sm_state(sm->owner, sm->name, sm->sym);
- if (other == sm)
+ cur = get_sm_state(sm->owner, sm->name, sm->sym);
+ if (cur == sm)
continue;
- call_pre_merge_hook(sm);
+ call_pre_merge_hook(cur, sm);
} END_FOR_EACH_SM(sm);
- *one = clone_stree(__get_cur_stree());
+ new = __pop_fake_cur_stree();
+ overwrite_stree(new, one);
+ free_stree(&new);
+ __pop_fake_cur_stree_fast();
- __swap_cur_stree(*two);
+ __set_fake_cur_stree_fast(*two);
+ __push_fake_cur_stree();
FOR_EACH_SM(*one, sm) {
- other = get_sm_state(sm->owner, sm->name, sm->sym);
- if (other == sm)
+ cur = get_sm_state(sm->owner, sm->name, sm->sym);
+ if (cur == sm)
continue;
- call_pre_merge_hook(sm);
+ call_pre_merge_hook(cur, sm);
} END_FOR_EACH_SM(sm);
- *two = clone_stree(__get_cur_stree());
+ new = __pop_fake_cur_stree();
+ overwrite_stree(new, two);
+ free_stree(&new);
+ __pop_fake_cur_stree_fast();
- restore_all_states();
+ __in_unmatched_hook--;
}
static void clone_pool_havers_stree(struct stree **stree)
{
struct sm_state *sm, *tmp;