/**
 * A pthread program illustrating how to
 * create a simple thread and some of the pthread API
 * This program implements the summation function where
 * the summation operation is run as a separate thread.
 *
 * Most Unix/Linux/OS X users
 * gcc thrd.c -lpthread
 *
 * Solaris users must enter
 * gcc thrd.c -lpthreads
 *
 * Figure 4.9
 *
 * @author Gagne, Galvin, Silberschatz
 * Operating System Concepts  - Ninth Edition
 * Copyright John Wiley & Sons - 2013
 */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

int sum; /* this data is shared by the thread(s) */

/**
 * The thread will begin control in this function
 */
void *runner(void *param)  {

  int i, upper = atoi(param);
  sum = 0;

  if (upper > 0) {
    for (i = 1; i <= upper; i++) {
      sum += i;
    }
  }
  pthread_exit(0);
}

int main(int argc, char *argv[]) {

  pthread_t tid; /* the thread identifier */
  pthread_attr_t attr; /* set of attributes for the thread */

  if (argc != 2) {
    fprintf(stderr,"usage: thrd-posix <integer value>\n");
    /*exit(1);*/
    return -1;
  }

  if (atoi(argv[1]) < 0) {
    fprintf(stderr,"Argument %d must be non-negative\n",atoi(argv[1]));
    /*exit(1);*/
    return -1;
  }

  /* get the default attributes */
  pthread_attr_init(&attr);

  /* create the thread */
  pthread_create(&tid, &attr, runner, argv[1]);

  /* now wait for the thread to exit */
  pthread_join(tid, NULL);

  printf("sum = %d\n", sum);

  return 0;
}
