// UFRGS - INF151 - Marcelo Johann - 06/05/2003 - Race Conditions

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>


#define SIZE 128
int Story[SIZE];
int next = 0;
pthread_attr_t at;
sem_t *mutex;

void *impressor(void*nome);
void espera (void);

int main(int argc, char**argv)
  {
  unsigned int i,a,b;
  pthread_t    t1;
  pthread_t    t2;
  for (i=0; i<SIZE; ++i)
    Story[i]=-1;
  fprintf(stderr,"Eu sou o primeiro processo.\n");
  pthread_attr_init(&at);
  pthread_attr_setscope(&at,PTHREAD_SCOPE_SYSTEM);
  
  //sem_init(&mutex,0,1);
  mutex =  sem_open("novo",O_CREAT,777,1);
  if (mutex==SEM_FAILED)
    {
    printf("error\n");
    exit(0);
    }
    
  a = pthread_create(&t1,&at,impressor,"Isaac"); //isaac
  b = pthread_create(&t2,&at,impressor,"Jacob"); //jacob
  fprintf(stderr,"Criei dois impressores: %d e %d.\n",a,b);
  pthread_join(t1, NULL);
  pthread_join(t2, NULL);
  fprintf(stderr,"Olha o que eles imprimiram:\n");
  for (i=0; i<SIZE; ++i)
    fprintf(stderr,"%d ",Story[i]);
  sem_close(mutex);
  }

void *impressor(void*nome)
  {
  int i=0;

  for (i=0; i<SIZE/2; ++i)
    {
    fprintf(stderr,"%s: vou imprimir %d\n",nome, i);
    
    sem_wait(mutex);
    
    Story[next] = i;
    espera();
    ++next;
    
    sem_post(mutex);
    
    espera();
		}
  return (void*) 0;
  }

void espera (void)
  {
  int j,k;
    for (j=0;j<20;++j)
      {
      for (k=0;k<10000;++k)
	{
	j = j + 100;
	j = j - 100;
	}
      }
  }

