privbcb_set(): Fixed PRIVBCB_ITEM_LSN_VALID handling.
authorshort <>
Sun, 13 Jul 2003 16:51:38 +0000 (16:51 +0000)
committershort <>
Sun, 13 Jul 2003 16:51:38 +0000 (16:51 +0000)
 - Do not leave unreachable nodes in 'private_bcb_lsn_tree'.

src/libcaptive/cc/map.c

index 5de4083..a4c667b 100644 (file)
@@ -397,8 +397,17 @@ static void privbcb_set(struct private_bcb *privbcb,enum privbcb_item item,gint
                        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);
@@ -420,12 +429,6 @@ static void privbcb_set(struct private_bcb *privbcb,enum privbcb_item item,gint
                        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));
 }