示例#1
0
文件: fut0lst.c 项目: OPSF/uClinux
void
flst_add_first(
    /*===========*/
    flst_base_node_t*	base,	/* in: pointer to base node of list */
    flst_node_t*		node,	/* in: node to add */
    mtr_t*			mtr)	/* in: mini-transaction handle */
{
    ulint		space;
    fil_addr_t	node_addr;
    ulint		len;
    fil_addr_t	first_addr;
    flst_node_t*	first_node;

    ut_ad(mtr && base && node);
    ut_ad(base != node);
    ut_ad(mtr_memo_contains(mtr, buf_block_align(base),
                            MTR_MEMO_PAGE_X_FIX));
    ut_ad(mtr_memo_contains(mtr, buf_block_align(node),
                            MTR_MEMO_PAGE_X_FIX));
    len = flst_get_len(base, mtr);
    first_addr = flst_get_first(base, mtr);

    buf_ptr_get_fsp_addr(node, &space, &node_addr);

    /* If the list is not empty, call flst_insert_before */
    if (len != 0) {
        if (first_addr.page == node_addr.page) {
            first_node = buf_frame_align(node)
                         + first_addr.boffset;
        } else {
            first_node = fut_get_ptr(space, first_addr,
                                     RW_X_LATCH, mtr);
        }

        flst_insert_before(base, node, first_node, mtr);
    } else {
        /* else call flst_add_to_empty */
        flst_add_to_empty(base, node, mtr);
    }
}
示例#2
0
文件: fut0lst.c 项目: A-eolus/mysql
/********************************************************************//**
Adds a node as the last node in a list. */
UNIV_INTERN
void
flst_add_last(
/*==========*/
	flst_base_node_t*	base,	/*!< in: pointer to base node of list */
	flst_node_t*		node,	/*!< in: node to add */
	mtr_t*			mtr)	/*!< in: mini-transaction handle */
{
	ulint		space;
	fil_addr_t	node_addr;
	ulint		len;
	fil_addr_t	last_addr;
	flst_node_t*	last_node;

	ut_ad(mtr && base && node);
	ut_ad(base != node);
	ut_ad(mtr_memo_contains_page(mtr, base, MTR_MEMO_PAGE_X_FIX));
	ut_ad(mtr_memo_contains_page(mtr, node, MTR_MEMO_PAGE_X_FIX));
	len = flst_get_len(base, mtr);
	last_addr = flst_get_last(base, mtr);

	buf_ptr_get_fsp_addr(node, &space, &node_addr);

	/* If the list is not empty, call flst_insert_after */
	if (len != 0) {
		if (last_addr.page == node_addr.page) {
			last_node = page_align(node) + last_addr.boffset;
		} else {
			ulint	zip_size = fil_space_get_zip_size(space);

			last_node = fut_get_ptr(space, zip_size, last_addr,
						RW_X_LATCH, mtr);
		}

		flst_insert_after(base, last_node, node, mtr);
	} else {
		/* else call flst_add_to_empty */
		flst_add_to_empty(base, node, mtr);
	}
}