以下介绍服务启动调用流程及注释
//文件main.cc
int main(int argc, char **argv)
{
return mysqld_main(argc, argv);
}
//文件mysqld.cc
int mysqld_main(int argc, char **argv) {
...
//初始化
my_init()
//启动服务
mysql_service(NULL);
...
}
//文件mysqld.cc
int mysql_service(void *p) {
...
win_main(Service.my_argc, Service.my_argv);
...
}
//文件mysqld.cc
int win_main(int argc, char **argv) {
...
//加载参数,加载顺序:先加载配置文件,后加载命令行参数,命令行参数会覆盖配置文件相同参数
load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv)
...
//启动监听线程
setup_conn_event_handler_threads();
...
}
//文件mysqld.cc
void setup_conn_event_handler_threads() {
...
//创建监听线程,启动函数为socket_conn_event_handler
int error= mysql_thread_create(key_thread_handle_con_sockets,
&hThread, &connection_attrib,
socket_conn_event_handler,
mysqld_socket_acceptor);
...
//主线程等待监听线程退出
}
//文件mysqld.cc
extern "C" void *socket_conn_event_handler(void *arg) {
...
//进入等待连接循环
conn_acceptor->connection_event_loop();
...
}
//文件connection_acceptor.h
//监听线程循环等待连接请求
void connection_event_loop() {
...
while (!abort_loop) {
//等待连接请求,调用socket_connection.cc中函数listen_for_connection_event,使用poll或select等待连接
Channel_info *channel_info= m_listener->listen_for_connection_event();
//处理新请求
mgr->process_new_connection(channel_info);
}
}
//文件connection_handler_manager.cc
void Connection_handler_manager::process_new_connection(Channel_info* channel_info) {
...
//根据参数--thread-handling调用不同处理函数,默认是one-thread-per-connection,即每个连接一个线程,会调用connection_handler_per_thread.cc中函数add_connection
m_connection_handler->add_connection(channel_info)
...
}
//文件connection_handler_per_thread.cc
bool Per_thread_connection_handler::add_connection(Channel_info* channel_info) {
...
//创建线程处理连接
error= mysql_thread_create(key_thread_one_connection, &id,
&connection_attrib,
handle_connection,
(void*) channel_info);
...
}
//文件connection_handler_per_thread.cc
extern "C" void *handle_connection(void *arg) {
...
//循环处理命令
for (;;) {
...
//处理登录
thd_prepare_connection(thd)
//处理命令
while (thd_connection_alive(thd))
{
if (do_command(thd))
break;
}
...
}
...
}
文章评论