以下介绍服务启动调用流程及注释
//文件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; } ... } ... }
文章评论