/**
*
* Representación en C++ de un modelo de monitores para la resolución
* del problema del agua
*
* Author: CI0122 Sistemas Operativos
* Date: 2023/Abr/23
*
**/
#include <stdio.h>
#include "Natural.h"
/**
* Default constructor
**/
Natural::Natural() {
this->contadorHidrogenos = 0;
this->contadorOxigenos = 0;
}
/**
* Destructor
**/
Natural::~Natural() {
}
/**
*
**/
int Natural::registraYEspera( int atomo, int worker ) {
this->lock.Acquire();
printf( "%d Registrando ... O = %d, H = %d\n", worker, this->contadorOxigenos, this->contadorHidrogenos );
switch ( atomo ) {
case AtomoHidrogeno:
if ( this->contadorOxigenos > 0 && this->contadorHidrogenos > 0 ) {
this->contadorHidrogenos--;
this->contadorOxigenos--;
this->hidrogenos.Signal();
this->oxigenos.Signal();
printf( "\tUn H hizo agua [O(%d), H(%d)]\n", this->contadorOxigenos, this->contadorHidrogenos );
} else {
this->contadorHidrogenos++;
this->hidrogenos.Wait( this->lock );
}
break;
case AtomoOxigeno:
if ( this->contadorHidrogenos > 1 ) {
this->contadorHidrogenos -= 2;
this->hidrogenos.Signal();
this->hidrogenos.Signal();
printf( "\tUn O hizo agua [O(%d), H(%d)]\n", this->contadorOxigenos, this->contadorHidrogenos );
} else {
this->contadorOxigenos++;
this->oxigenos.Wait( this->lock );
}
break;
}
this->lock.Release();
return 0;
}