/********************************************************************//**
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); //获得base的FLST_LAST最后一个节点的page,offset

    buf_ptr_get_fsp_addr(node, &space, &node_addr);//返回file page 中的space, page_no,page_offset 详见    /* If the list is not empty, call flst_insert_after */
    ) {
        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);
    }
}
/********************************************************************//**
Inserts a node after another in a list. */
UNIV_INTERN
void
flst_insert_after(
/*==============*/
    flst_base_node_t*    base,    /*!< in: pointer to base node of list */
    flst_node_t*        node1,    /*!< in: node to insert after */
    flst_node_t*        node2,    /*!< in: node to add */
    mtr_t*            mtr)    /*!< in: mini-transaction handle */
{
    ulint        space;
    fil_addr_t    node1_addr;
    fil_addr_t    node2_addr;
    flst_node_t*    node3;
    fil_addr_t    node3_addr;
    ulint        len;

    ut_ad(mtr && node1 && node2 && base);
    ut_ad(base != node1);
    ut_ad(base != node2);
    ut_ad(node2 != node1);
    ut_ad(mtr_memo_contains_page(mtr, base, MTR_MEMO_PAGE_X_FIX));
    ut_ad(mtr_memo_contains_page(mtr, node1, MTR_MEMO_PAGE_X_FIX));
    ut_ad(mtr_memo_contains_page(mtr, node2, MTR_MEMO_PAGE_X_FIX));

    buf_ptr_get_fsp_addr(node1, &space, &node1_addr);
    buf_ptr_get_fsp_addr(node2, &space, &node2_addr);

    node3_addr = flst_get_next_addr(node1, mtr);

    /* Set prev and next fields of node2 */
    flst_write_addr(node2 + FLST_PREV, node1_addr, mtr);
    flst_write_addr(node2 + FLST_NEXT, node3_addr, mtr);

    if (!fil_addr_is_null(node3_addr)) {
        /* Update prev field of node3 */
        ulint    zip_size = fil_space_get_zip_size(space);

        node3 = fut_get_ptr(space, zip_size,
                    node3_addr, RW_X_LATCH, mtr);
        flst_write_addr(node3 + FLST_PREV, node2_addr, mtr);
    } else {
        /* node1 was last in list: update last field in base */
        flst_write_addr(base + FLST_LAST, node2_addr, mtr);
    }

    /* Set next field of node1 */
    flst_write_addr(node1 + FLST_NEXT, node2_addr, mtr);

    /* Update len of base node */
    len = flst_get_len(base, mtr);
    mlog_write_ulint(, MLOG_4BYTES, mtr);
}

函数flst_add_last的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

随机推荐

  1. php计算时间差的方法

    一个简单的例子:计算借书的天数,根据每天的日期进行计算. (1) 有数据库的情况      MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可.    MYSQL那就用两个日期字 ...

  2. centos6.4下安装freetds使php支持mssql

    centos版本:6.4 php版本5.3.17 没有安装之前的情况:nginx+php+mysql+FPM-FCGI 接下来安装步骤如下: 1.打开http://www.freetds.org/,进 ...

  3. 增加p()函数,方便开发中对变量打印调试

    在开发的过程中,我们经常要输出一下变量看看得到的结果是什么,我们就要根据变量的类型选择使用echo,print_r或者var_dump,brophp框架中的p()函数会自动根据变量类型选择用什么方法为 ...

  4. phpcms v9 自定义伪静态的分页函数

    因为.这个页面还没做好..等做好了..再给大家演示...... 调用方法:$page_attr=pages_open($num[0]['cun'],$get_page,$max_page,'http: ...

  5. (转载)根据数据字典表定义的表结构,生成创建表的SQL语句

    <来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1.  类名:T ...

  6. 拥抱ARM妹子第二季 之 序:我和春天有个约会 - 生命的萌芽

      春姑年轻轻的吻了一下小穆妹纸的额头!从沉睡中苏醒的小穆妹纸,缓缓伸了个懒腰--- 啊-- 睡得真香! 等--等-等-!好像和童话故事里的情节不一样,应该由王子我来亲吻睡梦中的妹纸才能醒!!-- 强 ...

  7. MVC中Controller和Action讲解上篇

    一般我们用mvc开发程序时一般需要三个步骤, 创建模型.创建控制器.创建视图 之前开发程序都是按照这样的步骤来开发的,也没有想过mvc的原理,比如route是怎么找到controller的,contr ...

  8. Lua基础之table详解

    概要:1.table特性:2.table的构造:3.table常用函数:4.table遍历:5.table面向对象 原文地址:http://blog.csdn.net/dingkun520wy/art ...

  9. 【BZOJ 1066】[SCOI2007]蜥蜴

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...

  10. 1042: [HAOI2008]硬币购物 - BZOJ

    Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法.Input 第一行 ...