函数flst_remove

时间:2023-03-09 16:58:40
函数flst_remove

移除 node, node->prev直接指向node->next

/********************************************************************//**
Removes a node. */
UNIV_INTERN
void
flst_remove(
/*========*/
    flst_base_node_t*    base,    /*!< in: pointer to base node of list */
    flst_node_t*        node2,    /*!< in: node to remove */
    mtr_t*            mtr)    /*!< in: mini-transaction handle */
{
    ulint        space;
    ulint        zip_size;
    flst_node_t*    node1;
    fil_addr_t    node1_addr;
    fil_addr_t    node2_addr;
    flst_node_t*    node3;
    fil_addr_t    node3_addr;
    ulint        len;

    ut_ad(mtr && node2 && base);
    ut_ad(mtr_memo_contains_page(mtr, base, MTR_MEMO_PAGE_X_FIX));
    ut_ad(mtr_memo_contains_page(mtr, node2, MTR_MEMO_PAGE_X_FIX));

    buf_ptr_get_fsp_addr(node2, &space, &node2_addr);
    zip_size = fil_space_get_zip_size(space);

    node1_addr = flst_get_prev_addr(node2, mtr);
    node3_addr = flst_get_next_addr(node2, mtr);

    if (!fil_addr_is_null(node1_addr)) {

        /* Update next field of node1 */

        if (node1_addr.page == node2_addr.page) {

            node1 = page_align(node2) + node1_addr.boffset;
        } else {
            node1 = fut_get_ptr(space, zip_size,
                        node1_addr, RW_X_LATCH, mtr);
        }

        ut_ad(node1 != node2);

        flst_write_addr(node1 + FLST_NEXT, node3_addr, mtr);
    } else {
        /* node2 was first in list: update first field in base */
        flst_write_addr(base + FLST_FIRST, node3_addr, mtr);
    }

    if (!fil_addr_is_null(node3_addr)) {
        /* Update prev field of node3 */

        if (node3_addr.page == node2_addr.page) {

            node3 = page_align(node2) + node3_addr.boffset;
        } else {
            node3 = fut_get_ptr(space, zip_size,
                        node3_addr, RW_X_LATCH, mtr);
        }

        ut_ad(node2 != node3);

        flst_write_addr(node3 + FLST_PREV, node1_addr, mtr);
    } else {
        /* node2 was last in list: update last field in base */
        flst_write_addr(base + FLST_LAST, node1_addr, mtr);
    }

    /* Update len of base node */
    len = flst_get_len(base, mtr);
    ut_ad(len > );

    mlog_write_ulint(, MLOG_4BYTES, mtr);
}