以下代码位于MySQL 5.5 storage/example/ha_example.cc中:

MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, TRUE);
rc= HA_ERR_END_OF_FILE;
MYSQL_READ_ROW_DONE(rc);

我在整个项目中搜索MYSQL_READ_ROW_START定义,并在include/probes_MYSQL_nodtrace.h中找到它:
#define MYSQL_READ_ROW_START(arg0, arg1, arg2)
#define MYSQL_READ_ROW_START_ENABLED() (0)
#define MYSQL_READ_ROW_DONE(arg0)
#define MYSQL_READ_ROW_DONE_ENABLED() (0)

这里只是一个空的宏定义。
我的问题是,为什么这个宏MYSQL_READ_ROW_START不与任何函数关联,而是在上面的代码中用作函数?
谢谢。

最佳答案

这些不是传统的宏:它们是DTrace的探测点,
一个用于Solaris、OS X、FreeBSD和各种
其他操作系统。
DTrace围绕着不同提供者提供
可以观察运行可执行文件或
甚至是操作系统本身。有些供应商是基于时间的;
例如,通过定期发射,探测器可以
用于分析CPU的使用情况。其他提供者是基于代码的,
例如,他们的探测器可能会在
退出函数。
您突出显示的代码是USDT(用户土地)的一个示例
静态定义的跟踪)提供程序。标准用法
USDT提供者将在事务中公开有意义的事件。
例如,事务的开始和结束
发生在不同功能的深处;在这种情况下
对于开发人员来说,最好确定他想要什么
透露时间。
USDT探测不仅仅是一个可切换的printf(),尽管它可以
当然可以用来显示信息,例如一些本地值
如交易的中间结果。美国国防部的调查
也可以用来触发行为。例如,人们可以
只想在
某些交易。
回到您的问题,USDT探测是通过编写
代码中与
其他地方的“.d”文件中的提供者。它由
dtrace(1)实用程序,它生成一个合适的头文件
用于编译。在一个缺少DTrace的系统上
定义USDT宏变为空的头文件的意义
ops,并根据给定的文件名判断(probes_mysql_nodtrace.h)
这就是你所观察到的。

10-06 13:57
查看更多