static struct sock_conn *sock_conn_map_insert(struct sock_ep *ep, struct sockaddr_in *addr, int conn_fd, int addr_published) { int index; struct sock_conn_map *map = &ep->cmap; if (map->size == map->used) { if (sock_conn_map_increase(map, map->size * 2)) return 0; } index = map->used; map->used++; map->table[index].addr = *addr; map->table[index].sock_fd = conn_fd; map->table[index].ep = ep; sock_set_sockopts(conn_fd); fastlock_acquire(&ep->lock); dlist_insert_tail(&map->table[index].ep_entry, &ep->conn_list); fastlock_release(&ep->lock); if (idm_set(&ep->conn_idm, conn_fd, &map->table[index]) < 0) SOCK_LOG_ERROR("idm_set failed\n"); if (sock_epoll_add(&map->epoll_set, conn_fd)) SOCK_LOG_ERROR("failed to add to epoll set: %d\n", conn_fd); map->table[index].address_published = addr_published; sock_pe_poll_add(ep->domain->pe, conn_fd); return &map->table[index]; }
static struct sock_conn *sock_conn_map_insert(struct sock_ep_attr *ep_attr, struct sockaddr_in *addr, int conn_fd, int addr_published) { int index; struct sock_conn_map *map = &ep_attr->cmap; if (map->size == map->used) { index = sock_conn_get_next_index(map); if (index < 0) { if (sock_conn_map_increase(map, map->size * 2)) return NULL; index = map->used; } } else { index = map->used; } map->used++; map->table[index].connected = 1; map->table[index].addr = *addr; map->table[index].sock_fd = conn_fd; map->table[index].ep_attr = ep_attr; sock_set_sockopts(conn_fd); if (idm_set(&ep_attr->conn_idm, conn_fd, &map->table[index]) < 0) SOCK_LOG_ERROR("idm_set failed\n"); if (sock_epoll_add(&map->epoll_set, conn_fd)) SOCK_LOG_ERROR("failed to add to epoll set: %d\n", conn_fd); map->table[index].address_published = addr_published; sock_pe_poll_add(ep_attr->domain->pe, conn_fd); return &map->table[index]; }