// 创建新的socket实例 // id,通过reserve_id分配的alloc_id // fd, 通过socket创建的套接字 // add, true则加入事件循环 static struct socket * new_fd(struct socket_server *ss, int id, int fd, int protocol, uintptr_t opaque, bool add) { struct socket * s = &ss->slot[HASH_ID(id)]; // 正常情况下,socket已在reserve_id中赋值为保留类型 assert(s->type == SOCKET_TYPE_RESERVE); if (add) { // 加入事件循环 if (sp_add(ss->event_fd, fd, s)) { // 如果加入失败,socket重置为初始类型 s->type = SOCKET_TYPE_INVALID; return NULL; } } // 初始化变量 s->id = id; s->fd = fd; s->protocol = protocol; s->p.size = MIN_READ_BUFFER; s->opaque = opaque; s->wb_size = 0; check_wb_list(&s->high); check_wb_list(&s->low); return s; }
static struct socket * new_fd(struct socket_server *ss, int id, int fd, uintptr_t opaque, bool add) { struct socket * s = &ss->slot[HASH_ID(id)]; assert(s->type == SOCKET_TYPE_RESERVE); if (add) { if (sp_add(ss->event_fd, fd, s)) { s->type = SOCKET_TYPE_INVALID; return NULL; } } s->id = id; s->fd = fd; s->size = MIN_READ_BUFFER; s->opaque = opaque; s->wb_size = 0; check_wb_list(&s->high); check_wb_list(&s->low); return s; }