Universidad de Costa Rica

Escuela de Ciencias de la Computación e Informática

CI-0122 Sistemas Operativos

Temas

CI0122 / Temas revisados / Semana-06 / ForkAndSems / H2O


/**
 *
 *  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;
}