int http_client_pool_init(struct http_client_pool *http_client_pool, size_t initial, size_t grow) { LOGGER_INFO("http client pool: initial=%zu, grow=%zu", initial, grow); if (0 > ctx_pool_init(&http_client_pool->ctx_pool, initial, grow, CLIENT_STACK_SIZE, sizeof(struct http_client_context))) return -1; /* Global to all clients */ if (!client_chains) { struct rlimit rlim; if (0 > getrlimit(RLIMIT_NOFILE, &rlim)) return LOGGER_PERROR("getrlimit(RLIMIT_NOFILE)"), -1; client_chains = calloc(rlim.rlim_cur, sizeof(struct list)); if (!client_chains) return LOGGER_PERROR("calloc client_chains"), -1; /* storage for multiple client chains */ client_heads = calloc(rlim.rlim_cur, sizeof(struct list)); struct list *tmp = client_heads, *tmp_end = tmp + rlim.rlim_cur; if (!client_heads) return LOGGER_PERROR("calloc client_heads"), -1; for (;tmp != tmp_end; ++tmp) list_insert_tail(&free_list, tmp); idle_ctx = ribs_context_create(SMALL_STACK_SIZE, 0, http_client_idle_handler); hashtable_init(&ht_persistent_clients, rlim.rlim_cur); } if (0 > timeout_handler_init(&http_client_pool->timeout_handler) || 0 > timeout_handler_init(&http_client_pool->timeout_handler_persistent)) return -1; return 0; }
int http_server_init_acceptor(struct http_server *server) { if (0 > ribs_epoll_add(server->fd, EPOLLIN, server->accept_ctx)) return -1; return timeout_handler_init(&server->timeout_handler); }
int sendemail_init(struct sendemail_mta *mta) { mta->saddr.sin_family = AF_INET; return timeout_handler_init(&mta->timeout_handler); }