Worker *worker_new(uint8_t id, Config *config, uint16_t num_clients, uint64_t num_requests) { Worker *worker; uint16_t i; worker = W_MALLOC(Worker, 1); worker->id = id; worker->loop = ev_loop_new(config->libev_flags); ev_ref(worker->loop); worker->config = config; worker->num_clients = num_clients; worker->stats.req_todo = num_requests; worker->progress_interval = num_requests / 10; if (worker->progress_interval == 0) worker->progress_interval = 1; worker->clients = W_MALLOC(Client*, num_clients); for (i = 0; i < num_clients; i++) { if (NULL == (worker->clients[i] = client_new(worker))) return NULL; } return worker; }
Client *client_new(Worker *worker) { Client *client; client = W_MALLOC(Client, 1); client->state = CLIENT_START; client->worker = worker; client->sock_watcher.fd = -1; client->sock_watcher.data = client; client->content_length = -1; client->buffer_offset = 0; client->request_offset = 0; client->keepalive = client->worker->config->keep_alive; client->chunked = 0; client->chunk_size = -1; client->chunk_received = 0; return client; }