1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| static Connection_acceptor<Mysqld_socket_listener> *mysqld_socket_acceptor = NULL;
static bool network_init(void) { ... Mysqld_socket_listener *mysqld_socket_listener = new (std::nothrow) Mysqld_socket_listener(bind_addresses_info, mysqld_port, admin_address_info, mysqld_admin_port, listen_admin_interface_in_separate_thread, back_log, mysqld_port_timeout, unix_sock_name);
mysqld_socket_acceptor = new (std::nothrow) Connection_acceptor<Mysqld_socket_listener>(mysqld_socket_listener); ... if (mysqld_socket_acceptor->init_connection_acceptor()) return true; ... }
bool init_connection_acceptor() { return m_listener->setup_listener(); }
bool Mysqld_socket_listener::setup_listener() { ... if (m_tcp_port) { for (const auto &bind_address_info : m_bind_addresses) { TCP_socket tcp_socket(bind_address_info.address, bind_address_info.network_namespace, m_tcp_port, m_backlog, m_port_timeout);
MYSQL_SOCKET mysql_socket = tcp_socket.get_listener_socket(); if (mysql_socket.fd == INVALID_SOCKET) return true;
Socket_attr s(Socket_type::TCP_SOCKET, bind_address_info.network_namespace); m_socket_map.insert( std::pair<MYSQL_SOCKET, Socket_attr>(mysql_socket, s)); } }
setup_connection_events(m_socket_map); return false; }
MYSQL_SOCKET TCP_socket::get_listener_socket() { ... MYSQL_SOCKET listener_socket = create_socket(ai_ptr.get(), AF_INET, &a); mysql_socket_bind(listener_socket, a->ai_addr, a->ai_addrlen); mysql_socket_listen(listener_socket, static_cast<int>(m_backlog); ... }
void Mysqld_socket_listener::setup_connection_events( const socket_map_t &socket_map) { #ifdef HAVE_POLL const socket_map_t::size_type total_number_of_addresses_to_bind = socket_map.size(); m_poll_info.m_fds.reserve(total_number_of_addresses_to_bind); m_poll_info.m_pfs_fds.reserve(total_number_of_addresses_to_bind); #endif
for (const auto &element : socket_map) add_socket_to_listener(element.first); }
void Mysqld_socket_listener::add_socket_to_listener( MYSQL_SOCKET listen_socket) { mysql_socket_set_thread_owner(listen_socket);
#ifdef HAVE_POLL m_poll_info.m_fds.emplace_back( pollfd{mysql_socket_getfd(listen_socket), POLLIN, 0}); m_poll_info.m_pfs_fds.push_back(listen_socket); #else FD_SET(mysql_socket_getfd(listen_socket), &m_select_info.m_client_fds); if ((uint)mysql_socket_getfd(listen_socket) > m_select_info.m_max_used_connection) m_select_info.m_max_used_connection = mysql_socket_getfd(listen_socket); #endif }
|