privbcb->dirty=value;
break;
case PRIVBCB_ITEM_LSN_VALID:
+ /* Never change 'privbcb->lsn_valid' while it is linked in 'private_bcb_lsn_tree'
+ * as it could become unreachable due to private_bcb_lsn_tree_key_compare_func()
+ * behaviour wrt 'privbcb->lsn_valid'!
+ */
+ g_tree_remove(private_bcb_lsn_tree,privbcb);
g_assert(TRUE==value || FALSE==value);
privbcb->lsn_valid=value;
+ if (privbcb->lsn_valid)
+ g_tree_insert(private_bcb_lsn_tree,
+ privbcb, /* key */
+ privbcb); /* value */
break;
case PRIVBCB_ITEM_LEAVE_FUNC_PENDING:
g_assert(TRUE==value || FALSE==value);
break;
default: g_assert_not_reached();
}
- if (!privbcb->lsn_valid)
- g_tree_remove(private_bcb_lsn_tree,privbcb);
- else
- g_tree_insert(private_bcb_lsn_tree,
- privbcb, /* key */
- privbcb); /* value */
g_assert((privbcb->lsn_valid ? privbcb : NULL)==g_tree_lookup(private_bcb_lsn_tree,privbcb));
}