// CreateConnection status_t ConnectionFactory::CreateConnection(const char* type, const char* parameters, Connection** _connection) { if (!type) return B_BAD_VALUE; // create the connection Connection* connection = NULL; if (strcmp(type, "insecure") == 0) connection = new(nothrow) InsecureConnection; else if (strcmp(type, "port") == 0) connection = new(nothrow) PortConnection; else return B_BAD_VALUE; if (!connection) return B_NO_MEMORY; // init it status_t error = connection->Init(parameters); if (error != B_OK) { delete connection; return error; } *_connection = connection; return B_OK; }
void EventModule::DoTcpAccept(int listen_fd, void* arg) { Epoller* epoller_ = (Epoller*)arg; struct sockaddr_in sin; socklen_t len = sizeof(sin); ConfigModule* conf_module = FindModule<ConfigModule>(App::GetInstance()); int32_t max_connection = conf_module->config().conn_pool_size(); ConnMgrModule* conn_mgr_module = FindModule<ConnMgrModule>(App::GetInstance()); int32_t cur_conn_map_size = conn_mgr_module->GetCurConnMapSize(); if (cur_conn_map_size >= max_connection) return; int32_t conn_fd = accept(listen_fd, (struct sockaddr*)&sin, &len); if (conn_fd < 0) { if (errno != EAGAIN && errno != ECONNABORTED && errno != EPROTO && errno != EINTR) { PLOG(ERROR) << "accept"; } return; } Epoller::SetNonBlock(conn_fd); Epoller::SetSocketOpt(conn_fd); Connection* conn = conn_mgr_module->CreateConn(conn_fd); conn->Init(); if (conn == NULL) { LOG(ERROR) << "CreateConn error!"; return; } LOG(INFO) << "accept ip[" << sin.sin_addr.s_addr << "] port[" << sin.sin_port << "] conn_fd[" << conn_fd << "]"; int ret = epoller_->AddEvent(conn_fd, EVENT_READ, EventModule::DoTcpRead, (void*)epoller_); if (ret < 0) LOG(ERROR) << "epoller_->AddEvent error!"; conn->set_conn_fd(conn_fd); }