//CSE 660
//Jason Kim
//Lab 3

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <signal.h>
#include <wait.h>
#include "sshm.h"
#include "ssem.h"

using namespace std;

//code of proc1

int main()
{
	int i, internal_reg;
	int semid1,semid2,semid3;

	/* here create and initialize all semaphores */
	semid1 = sem_create(1,0);
	semid2 = sem_create(2,0);
	semid3 = sem_create(3,0);


	/* here created: shared memory array Account of size 3 */
	int *Account;
	shm_get(123,(void**)&Account,3*sizeof(int));
   	Account[0]=1000;
   	Account[1]=1000;
   	Account[2]=1000;
	

	/* synchronize with Proc2 and Proc3 (3 process 3 way synchronization)*/
	sem_signal(semid1);
	sem_signal(semid1);
	sem_wait(semid2);
	sem_wait(semid3);

      for (i = 0; i < 1000; i++)
      {
          internal_reg = Account[0];
          internal_reg = internal_reg - 100;
          Account[0] = internal_reg;

   	/* same thing, except we're adding $100 to Account1 now... */
          internal_reg = Account [1];
          internal_reg = internal_reg + 100;
          Account[1] = internal_reg;
   	/*     Here add a code that prints contents of each account
          after 100th, 200th, 300th, ...., and 1000th iterations*/ 
	    if (i%100==0)
	    {
		cout << Account[0] << endl;
		cout << Account[1] << endl;
		cout << Account[2] << endl;
	    }	
  
      }

	return 0;
}

