调用 方法

  1. HASH_INSERT(lock_t, hash, lock_sys->rec_hash,lock_rec_fold(space, page_no), lock);
  1. /*******************************************************************//**
  2. Inserts a struct to a hash table. */
  3.  
  4. #define HASH_INSERT(TYPE, NAME, TABLE, FOLD, DATA)\
  5. do {\
  6. hash_cell_t* cell3333;\ //hash_cell_t* 定义
  7. TYPE* struct3333;\
  8. \
  9. HASH_ASSERT_OWNED(TABLE, FOLD)\
  10. \
  11. (DATA)->NAME = NULL;\
  12. \
  13. cell3333 = hash_get_nth_cell(TABLE, hash_calc_hash(FOLD, TABLE));\ //函数定义
  14. \
  15. if (cell3333->node == NULL) {\
  16. cell3333->node = DATA;\
  17. } else {\
  18. struct3333 = (TYPE*) cell3333->node;\ //此时struct3333的类型是lock_t
  19. \
  20. while (struct3333->NAME != NULL) {\ //NAME 为 hash_node_t hash; typedef void* hash_node_t;
  1. \       struct3333 = (TYPE*) struct3333->NAME;\
        }\ \
        struct3333->NAME = DATA;\
    }\
    } while ()

这里好绕

对于下一个元素, 都习惯于使用struct  结构体名称 *next

  1. /**************************************************************//**
  2. Calculates the hash value from a folded value.
  3. @return hashed value */
  4. UNIV_INLINE
  5. ulint
  6. hash_calc_hash(
  7. /*===========*/
  8. ulint fold, /*!< in: folded value */
  9. hash_table_t* table) /*!< in: hash table */
  10. {
  11. ut_ad(table);
  12. ut_ad(table->magic_n == HASH_TABLE_MAGIC_N);
  13. return(ut_hash_ulint(fold, table->n_cells));
  14. }
  15.  
  16. ulint
  17. ut_hash_ulint(
  18. /*==========*/
  19. ulint key, /*!< in: value to be hashed */
  20. ulint table_size) /*!< in: hash table size */
  21. {
  22. ut_ad(table_size);
  23. key = key ^ UT_HASH_RANDOM_MASK2;
  24.  
  25. return(key % table_size);
  26. }
  1. HASH_INSERT(lock_t, hash, lock_sys->rec_hash,
  2. lock_rec_fold(space, page_no), lock);
  3.  
  4. /*********************************************************************//**
  5. Calculates the fold value of a page file address: used in inserting or
  6. searching for a lock in the hash table.
  7. @return folded value */
  8. UNIV_INLINE
  9. ulint
  10. lock_rec_fold(
  11. /*==========*/
  12. ulint space, /*!< in: space */
  13. ulint page_no)/*!< in: page number */
  14. {
  15. return(ut_fold_ulint_pair(space, page_no));
  16. }
  17.  
  18. /*************************************************************//**
  19. Folds a pair of ulints.
  20. @return folded value */
  21. UNIV_INLINE
  22. ulint
  23. ut_fold_ulint_pair(
  24. /*===============*/
  25. ulint n1, /*!< in: ulint */
  26. ulint n2) /*!< in: ulint */
  27. {
  28. return(((((n1 ^ n2 ^ UT_HASH_RANDOM_MASK2) << ) + n1)
  29. ^ UT_HASH_RANDOM_MASK) + n2);
  30. }

宏HASH_INSERT的更多相关文章

  1. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...

  2. VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用

    CSDN原博文:http://blog.csdn.net/houkai363/article/details/8134787 遇到了:不能将参数 1 从“const char [5]”转换为“LPCT ...

  3. 【转】linux内核中writesb(), writesw(), writesl() 宏函数

    writesb(), writesw(), writesl() 宏函数 功能 : writesb()    I/O 上写入 8 位数据流数据 (1字节) writesw()   I/O  上写入 16 ...

  4. c++宏定义命令

    在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...

  5. dll导入导出宏定义,出现“不允许 dllimport 函数 的定义”的问题分析

    建立dll项目后,在头文件中,定义API宏 #ifndef API_S_H #define API_S_H ...... #ifndef DLL_S_20160424 #define API _dec ...

  6. VC++/MFC 最常用宏和指令

    1.#include指令  包含指定的文件,最基本的最熟悉的指令,编程中不得不用,包含库文件用双尖括号,包含自定义头文件用双引号. 2.#define指令   预定义,通常用它来定义常量(包括无参量与 ...

  7. [Sass]混合宏的参数

    [Sass]混合宏的参数--传一个不带值的参数 Sass 的混合宏有一个强大的功能,可以传参,那么在 Sass 中传参主要有以下几种情形: A) 传一个不带值的参数 在混合宏中,可以传一个不带任何值的 ...

  8. [Sass]混合宏

    [Sass]混合宏-声明混合宏 如果整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使 ...

  9. BOOST_AUTO宏

    在boost中,有个非常不错的宏BOOST_AUTO(),它的作用是自动给var定义类型,适合function()函数返回的值的类型. int function() { ; } main() { BO ...

随机推荐

  1. 中科红旗倒下,谁来挑战windows

    中科红旗解散 国产操作系统从此梦断 2月10日,关门上锁的中科红旗北京总部大门上粘贴了一张最新公告,这张公告彻底击破了那些仍然坚守公司工作的员工“拯救中国红旗”的希望.该公告称:因北京中科红旗软件技术 ...

  2. iOS7.1Https企业证书发布方法

    openssl使用的是macos系统自带的版本,关键点是不同直接使用ios设备打开https的链接,需要将证书发到系统的mail里,安装到设备, 如果命令执行不成功,用sudo执行. 1.生成服务器的 ...

  3. mysql优化之sakila测试数据库

    下载地址,选择相应的版本来进行安装测试 http://dev.mysql.com/doc/index-other.html 相关说明 http://dev.mysql.com/doc/sakila/e ...

  4. Linux配置Tomcat(转载)

    转载自:http://www.cnblogs.com/zhoulf/archive/2013/02/04/2891633.html 安装说明 安装环境:CentOS-6.3安装方式:源码安装 软件:a ...

  5. 浏览器对象模型BOM(Browser Object Model)

    1.结构 BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是w ...

  6. java第五课:方法

    方法交换位置的三个步骤:1.把第一个盒子里的东西拿出来,放到一边2.把第二个盒子里的东西放到第一个盒子里3.捡起刚刚放到一边的东西,放到第二个盒子里 值传递:实际参数将内部保存的值,复制给方法的参数. ...

  7. MVC 自定义AuthorizeAttribute 实现权限验证

    MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...

  8. State Management

    Samza的task可以把数据进行本地存储,并且对这些数据进行丰富的查询.   比较SQL中的select ... where...并不需要保存状态.但是aggregation和join就需要存储ro ...

  9. HDU1569+最大点权集

    /* 最大点权独立集=总权值-最小点权覆盖集 最大点权独立集=最大流 最小点权覆盖集=最小割 题意: 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...

  10. swift苹果的下一代语言

    http://numbbbbb.github.io/the-swift-programming-language-in-chinese/chapter1/01_swift.html 有时间再看,bas ...