// BAKER
#include <stdio.h>
#include "glob.h"
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>

volatile int loafready;
volatile int loafneeded;
volatile int loafsold;

pid_t qpid;
int spid;
int wtime;
int n=0;
char s[50];
FILE* f;

void sig1h(int s)
{
	loafneeded=1;
}

void sig2h(int s)
{
	loafsold=1;
}

void sigah(int s)
{
	loafready=1;
}

int main(int argc, char** argv) // path, qpid, wtime
{
	int i;
	spid=getpid();
	
	// params
	sscanf(argv[1],"%d",&i);
	qpid=i;
	sscanf(argv[2],"%d",&wtime);

	// signals
	sigset_t ss;
	sigemptyset(&ss);
	sigaddset(&ss, SIG1);
	sigaddset(&ss, SIG2);
	sigaddset(&ss, SIGALRM);
	sigprocmask(SIG_BLOCK, &ss, 0);
	sigset_t sig1s=ss, sig2s=ss, sigas=ss;
	sigdelset(&sig1s, SIG1);
	sigdelset(&sig2s, SIG2);
	sigdelset(&sigas, SIGALRM);
	
	// set handlers
	signal(SIG1, sig1h);
	signal(SIG2, sig2h);
	signal(SIGALRM, sigah);
	
	// cycle
	printf("B Baker %d Ready: qpid=%d, wtime=%d.\n",(int)getpid(),(int)qpid,(int)wtime);
	fflush(stdout);
	while(1)
	{
		loafready=0;
		struct itimerval tt;
		tt.it_value.tv_usec=wtime*TIMER;
		tt.it_value.tv_sec=0;
		tt.it_interval.tv_usec=0;
		tt.it_interval.tv_sec=0;
		setitimer(ITIMER_REAL, &tt, 0);
		while(!loafready)
			sigsuspend(&sigas);
		
		//printf("B Baker %d TimeToSell.\n",(int)getpid());fflush(stdout);
		loafneeded=0;
		sprintf(s,"./tmp/r%d", spid);
		f=fopen(s, "w");
		fclose(f);
		kill(qpid, SIG4);
		while(!loafneeded)
			sigsuspend(&sig1s);
		
		//printf("B Baker %d LoafReady.\n",(int)getpid());fflush(stdout);
		loafsold=0;
		n++;
		sprintf(s,"./in/%d", spid);
		f=fopen(s, "w");
		fprintf(f,"%d %d", spid, n);
		fclose(f);
		kill(qpid, SIG3);
		while(!loafsold)
			sigsuspend(&sig2s);
		//printf("B Baker %d LoafSold.\n",(int)getpid());fflush(stdout);
	}
	
	return 0;
}
