src/worker.c - weighttp

Functions defined

Source code

  1. /*
  2. * weighttp - a lightweight and simple webserver benchmarking tool
  3. *
  4. * Author:
  5. *     Copyright (c) 2009-2011 Thomas Porzelt
  6. *
  7. * License:
  8. *     MIT, see COPYING file
  9. */

  10. #include "weighttp.h"

  11. Worker *worker_new(uint8_t id, Config *config, uint16_t num_clients, uint64_t num_requests) {
  12.     Worker *worker;
  13.     uint16_t i;

  14.     worker = W_MALLOC(Worker, 1);
  15.     worker->id = id;
  16.     worker->loop = ev_loop_new(0);
  17.     ev_ref(worker->loop);
  18.     worker->config = config;
  19.     worker->num_clients = num_clients;
  20.     worker->stats.req_todo = num_requests;
  21.     worker->progress_interval = num_requests / 10;

  22.     if (worker->progress_interval == 0)
  23.         worker->progress_interval = 1;

  24.     worker->clients = W_MALLOC(Client*, num_clients);

  25.     for (i = 0; i < num_clients; i++) {
  26.         if (NULL == (worker->clients[i] = client_new(worker)))
  27.             return NULL;
  28.     }

  29.     return worker;
  30. }

  31. void worker_free(Worker *worker) {
  32.     uint16_t i;

  33.     for (i = 0; i < worker->num_clients; i++)
  34.         client_free(worker->clients[i]);

  35.     free(worker->clients);
  36.     free(worker);
  37. }

  38. void *worker_thread(void* arg) {
  39.     uint16_t i;
  40.     Worker *worker = (Worker*)arg;

  41.     /* start all clients */
  42.     for (i = 0; i < worker->num_clients; i++) {
  43.         if (worker->stats.req_started < worker->stats.req_todo)
  44.             client_state_machine(worker->clients[i]);
  45.     }

  46.     ev_loop(worker->loop, 0);

  47.     ev_loop_destroy(worker->loop);

  48.     return NULL;
  49. }