void cork_hash_table_ensure_size(struct cork_hash_table *table, size_t desired_count) { if (desired_count > table->bin_count) { struct cork_dllist *old_bins = table->bins; size_t old_bin_count = table->bin_count; cork_hash_table_allocate_bins(table, desired_count); if (old_bins != NULL) { size_t i; for (i = 0; i < old_bin_count; i++) { struct cork_dllist *bin = &old_bins[i]; struct cork_dllist_item *curr = bin->head.next; while (curr != &bin->head) { struct cork_hash_table_entry *entry = cork_container_of (curr, struct cork_hash_table_entry, siblings); struct cork_dllist_item *next = curr->next; size_t bin_index = entry->hash % table->bin_count; DEBUG(" Rehashing %p from bin %zu to bin %zu", entry, i, bin_index); cork_dllist_add(&table->bins[bin_index], curr); curr = next; } } free(old_bins); } }
static struct server * new_server(int fd, int method) { struct server *server; server = malloc(sizeof(struct server)); memset(server, 0, sizeof(struct server)); server->buf = malloc(BUF_SIZE); server->recv_ctx = malloc(sizeof(struct server_ctx)); server->send_ctx = malloc(sizeof(struct server_ctx)); server->recv_ctx->connected = 0; server->send_ctx->connected = 0; server->fd = fd; ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); server->recv_ctx->server = server; server->send_ctx->server = server; if (method) { server->e_ctx = malloc(sizeof(struct enc_ctx)); server->d_ctx = malloc(sizeof(struct enc_ctx)); enc_ctx_init(method, server->e_ctx, 1); enc_ctx_init(method, server->d_ctx, 0); } else { server->e_ctx = NULL; server->d_ctx = NULL; } cork_dllist_add(&connections, &server->entries); return server; }
static struct server * new_server(int fd, struct listen_ctx *listener) { if (verbose) { server_conn++; } struct server *server; server = malloc(sizeof(struct server)); memset(server, 0, sizeof(struct server)); server->buf = malloc(BUF_SIZE); server->recv_ctx = malloc(sizeof(struct server_ctx)); server->send_ctx = malloc(sizeof(struct server_ctx)); server->fd = fd; ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb, min(MAX_CONNECT_TIMEOUT, listener->timeout), listener->timeout); server->recv_ctx->server = server; server->recv_ctx->connected = 0; server->send_ctx->server = server; server->send_ctx->connected = 0; server->stage = 0; server->query = NULL; server->listen_ctx = listener; if (listener->method) { server->e_ctx = malloc(sizeof(struct enc_ctx)); server->d_ctx = malloc(sizeof(struct enc_ctx)); enc_ctx_init(listener->method, server->e_ctx, 1); enc_ctx_init(listener->method, server->d_ctx, 0); } else { server->e_ctx = NULL; server->d_ctx = NULL; } server->buf_len = 0; server->buf_idx = 0; server->remote = NULL; server->chunk = (struct chunk *)malloc(sizeof(struct chunk)); memset(server->chunk, 0, sizeof(struct chunk)); cork_dllist_add(&connections, &server->entries); return server; }