mysql源码启动_Mysql源码阅读mysqld启动(一)

为了研究SELECT * FROM xx 语句查询慢的本质原因,打算从Mysql源码看起,探查SELECT语句的执行流程。本次就成mysqld启动开始查看。

本文以Mysql-5.7.19版本来进行研究。

我们都知道C/C++都是从main函数开始调用, 可以从sql/main.cc开始看起。

int main(int argc, char **argv)

{

return mysqld_main(argc, argv);

}

继续查看mysqld_main定义,发现sql/mysqld.cc有两个mysqld_main函数定义。

第一处定义4361行开始。

#ifdef _WIN32

int win_main(int argc, char **argv)

#else

int mysqld_main(int argc, char **argv)

#endif

{

/*

Perform basic thread library and malloc initialization,

to be able to read defaults files and parse options.

*/

my_progname= argv[0];

// more ...

}

第二处定义5214行开始。

int mysqld_main(int argc, char **argv)

{

/*

When several instances are running on the same machine, we

need to have an unique named hEventShudown through the

application PID e.g.: MySQLShutdown1890; MySQLShutdown2342

*/

int10_to_str((int) GetCurrentProcessId(),my_stpcpy(shutdown_event_name,

"MySQLShutdown"), 10);

// more...

mysql_service(NULL);

return 0;

}

看到这里就比较好奇怎么出现了两个mysqld_main函数定义。经过查阅资料及细看代码,发现第二处的函数定义其实最外层有一层逻辑判断。从5106行代码开始看。

/****************************************************************************

Main and thread entry function for Win32

(all this is needed only to run mysqld as a service on WinNT)

****************************************************************************/

#if defined(_WIN32)

int mysql_service(void *p)

{

if (my_thread_init())

{

flush_error_log_messages();

return 1;

}

if (use_opt_args)

win_main(opt_argc, opt_argv);

else

win_main(Service.my_argc, Service.my_argv);

my_thread_end();

return 0;

}

这里有判断#if defined(_WIN32)判断win32平台才会有下面的mysqld_main函数定义。而第一处的mysqld_main判断是win32平台函数名为win_main。不存在定义重复问题。

查阅资料发现,Mysql为了实现可以在win32平台与类Uninx平台代码共用,将一些公用的函数抽象出来,但是win32和类unix平台启动方式不一样。细看win32的mysqld_main调用了mysql_service,mysql_service又调用了win_main函数,经过特殊操作处理后又回到了最初公共定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值