/** * new connection */ SWINLINE int swServer_new_connection(swServer *serv, swEvent *ev) { int conn_fd = ev->fd; swConnection* connection = NULL; if(conn_fd > swServer_get_maxfd(serv)) { swServer_set_maxfd(serv, conn_fd); /** * Correction of the number of connections */ if (serv->connect_count > conn_fd) { serv->connect_count = conn_fd; } #ifdef SW_CONNECTION_LIST_EXPAND //新的fd超过了最大fd //需要扩容 if (conn_fd == serv->connection_list_capacity - 1) { void *new_ptr = sw_shm_realloc(serv->connection_list, sizeof(swConnection)*(serv->connection_list_capacity + SW_CONNECTION_LIST_EXPAND)); if(new_ptr == NULL) { swWarn("connection_list realloc fail"); return SW_ERR; } else { serv->connection_list_capacity += SW_CONNECTION_LIST_EXPAND; serv->connection_list = (swConnection *)new_ptr; } } #endif } connection = &(serv->connection_list[conn_fd]); bzero(connection, sizeof(swConnection)); connection->fd = conn_fd; connection->from_id = ev->from_id; connection->from_fd = ev->from_fd; connection->connect_time = SwooleGS->now; connection->last_time = SwooleGS->now; connection->active = 1; //使此连接激活,必须在最后,保证线程安全 return SW_OK; }
static int swServer_master_onClose(swReactor *reactor, swEvent *event) { swServer *serv = reactor->ptr; swConnection *conn; int queue[SW_CLOSE_QLEN]; int i, n, fd; n = serv->main_pipe.read(&serv->main_pipe, queue, sizeof(queue)); if (n <= 0) { swWarn("[Master]main_pipe read failed. Error: %s[%d]", strerror(errno), errno); return SW_ERR; } for (i = 0; i < n / sizeof(int); i++) { fd = queue[i]; conn = swServer_get_connection(serv, fd); if (serv->onMasterClose != NULL) { serv->onMasterClose(serv, fd, conn->from_id); } /** * Reset maxfd, use for connection_list */ if (fd == swServer_get_maxfd(serv)) { int find_max_fd = fd - 1; /** * Find the new max_fd */ for (; serv->connection_list[find_max_fd].active == 0 && find_max_fd > swServer_get_minfd(serv); find_max_fd--); swServer_set_maxfd(serv, find_max_fd); swTrace("set_maxfd=%d|close_fd=%d", find_max_fd, fd); } } return SW_OK; }