Universidad de Costa Rica

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

CI-0122 Sistemas Operativos

Temas

CI0122 / Temas revisados / Semana-06 / PThreads / H2O-Sem


/**
 *  C++ class to encapsulate Unix semaphore intrinsic structures and system calls
 *  Author: Programacion Concurrente (Francisco Arroyo)
 *  Version: 2020/Ago/04
 *
 *  En esta nueva versión vamos a construir un arreglo de semáforos,
 *  el tamaño es indicado por el constructor (cantidad)
 *  Las operaciones Wait y Signal reciben el parámetro sobre el cual se pretende
 *  realizar esa operación
 *  Además, vamos a agregar dos métodos nuevos para poder operar sobre dos
 *  semáforos simultáneamente y resolver el problema de los filósofos
 *
 **/

#include <errno.h>
#include <stdio.h>
#include <cstdlib>

#include "Sem.h"

/**
 *  sem_init
 **/
Sem::Sem( int initial ) {
   int rs;

   this->semId = (sem_t *) calloc( 1, sizeof( sem_t ) );
   rs = sem_init( this->semId, 0, initial );
   if ( -1 == rs ) {
      perror( "Sem::Sem" );
      exit( 1 );
   }

}


/**
 *  sem_destroy
 **/
Sem::~Sem() {
   int rs;

   rs = sem_destroy( this->semId );
   if ( -1 == rs ) {
      perror( "Sem::Sem" );
      exit( 1 );
   }

   free( this->semId );

}


/**
 *  sem_post
 **/
int Sem::Signal() {
   int rs;

   rs = sem_post( this->semId );

   if ( -1 == rs ) {
      perror( "Sem::Signal" );
      exit( 1 );
   }
   return rs;

}


/**
 *  sem_wait
 **/
int Sem::Wait() {
   int rs;

   rs = sem_wait( this->semId );
   if ( -1 == rs ) {
      perror( "Sem::Wait" );
      exit( 1 );
   }

   return rs;

}


/*
 *  sem_trywait
 */
int Sem::tryWait() {
   int rs;

   rs = sem_trywait( this->semId );
   if ( -1 == rs ) {
      perror( "Sem::tryWait" );
      exit( 1 );
   }

   return rs;

}


/*
 *  sem_timedwait
 */
int Sem::timedWait( long sec, long nsec ) {
   int rs;
   struct timespec lapse;

   lapse.tv_nsec = nsec;
   lapse.tv_sec = sec;
   rs = sem_timedwait( this->semId, & lapse );
   if ( -1 == rs ) {
      perror( "Sem::timedWait" );
      exit( 1 );
   }

   return rs;

}