#include <stdio.h>
#include "shm.h"		/* for our shared mem/sem primatives */

#define SHMKEY 8101
#define SEMKEY 911

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

  key_t key = SHMKEY;		/* shared key */
  int *counter;			/* shared memory */
  int num;			/* local copy */
  int i;			/* loop index */
  int incr;			/* increment or decrement */
  int sem;			/* semaphore descriptor */

  /* parse command line */
  if (argc != 2) {
    printf("usage: %s <num>\n", argv[0]);
    exit(1);
  }
  incr = atoi(argv[1]);
  printf("incr: %d\n", incr);

  /* create or link to the shared memory counter */
  if ((counter = (int *) shmattach(key)) == NULL) {
    if ((counter = (int *) shmcreate(key, sizeof(int))) == NULL) {
      perror("shmcreate");
      exit(1);
    }
    *counter = 0;
  }

  /* create the semaphore */
  if ((sem = semcreate(SEMKEY, 1)) < 0) {
    perror("semcreate");
    exit(1);
  }

  for (i=0; i<40000; i++) {

    semwait(sem);

    /** begin critical region **/
  
    /* add incr to counter and print it out */
    *counter = *counter + incr;
    printf("%d\n", *counter);

    /** end critical region **/

    semsignal(sem);
  }

  /* remove the shared memory */
  shmdelete(counter);

  exit(0);

}

