/* 
 *  Generic example of master/worker program.  "Tasks" just consist of
 *  sleeping for a specified time; times to wait are generatedly randomly 
 *  from 1 to a specified maximum.
 *
 *  Command-line arguments:  total tasks, maximum task time,
 *    (optional) "--verbose" for verbose output
 *
 *  Sequential version.
 */
/* ugly nonportable hack to make millisleep() function compile with c99 */
#define _POSIX_C_SOURCE 199309L

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "timer.h"
#include "cmdline.h"
#include "master-worker-functions.h"

int main(int argc, char *argv[]) {

  int num_tasks;
  int max_task_time;
  int seed;
  double start_time, end_time;
  int task_time;
  int total_task_time = 0;
  bool verbose = false;

  char* usage_msg = "usage is %s num_tasks max_task_time seed [--verbose]\n";

  num_tasks = get_integer_arg(argc, argv, 1, 1, "num_tasks", usage_msg);
  max_task_time = get_integer_arg(argc, argv, 2, 1, "max_task_time", usage_msg);
  seed = get_integer_arg(argc, argv, 3, 1, "seed", usage_msg);
  int required_parms = 4;
  if (argc > required_parms) {
      if (strcmp(argv[required_parms], "--verbose") == 0) 
          verbose = true;
      else {
          fprintf(stderr, usage_msg, argv[0]);
          return EXIT_FAILURE;
      }
  }

  start_time = get_time();
  random_in_range_setup(seed);

  for (int i = 0; i < num_tasks; ++i) {

      task_time = random_in_range(1, max_task_time);
      total_task_time += task_time;
      if (verbose)
          printf("task time = %d\n", task_time);
      millisleep(task_time);
  }

  end_time = get_time();

  printf("\nsequential version\n");
  printf("number of tasks = %d\n", num_tasks);
  printf("max task time = %d, seed %d\n", max_task_time, seed);
  printf("total task time = %d\n", total_task_time);
  printf("running time = %g\n", end_time - start_time);

  return EXIT_SUCCESS;
}