# --------------------------------------------------------------
# Prontus CMS
# http://www.prontus.cl
# by Altavoz.net
#
# licensed under LGPL license.
# http://www.prontus.cl/license.html
# --------------------------------------------------------------

#---------------------------------------------------------------
# PROPOSITO.
#-----------
# Implementa rutinas para efectuar bloqueo tipo espera.
# Si hay un bloqueo, espera hasta q se libere.
# Si el proceso q estaba bloqueando se muere, el bloqueo se libera automaticamente.
# uso:

#  use lib_waitlock;
#  # Bloquear
#  $path_file_sem = '/sites/....../filesem.txt';
#  my $fh = &lib_waitlock::lock_file($path_file_sem);
#
#  # Area critica (ejemplo)
#  my $i = 0;
#  while ($i < 8) {
#    print "$i\n";
#    sleep 1;
#    $i++;
#  };
#  # Fin area critica
#
#  # Desbloquear
#  &lib_waitlock::unlock_file($path_file_sem, $fh);
#---------------------------------------------------------------


#-------------------------------BEGIN LIBRERIA-------------
#---------------------------------------------------------------
# DIRECTIVAS DE COMPILACION.
#---------------------------
package lib_waitlock;

use strict;
use utf8;
use Fcntl qw(:flock SEEK_END);

sub lock_file {
    my $path_semaforo = $_[0];
    if (open(my $semwait, '>>', $path_semaforo) ) {
        my $ret = flock $semwait, LOCK_EX;
        if (!$ret) {
            print STDERR "Error al bloquear[$path_semaforo][$!]\n";
        }
        seek($semwait, 0, SEEK_END);
        return $semwait;
    } else {
        print STDERR "No se pudo crear archivo a bloquear[$path_semaforo][$!]\n";
    }
}

sub unlock_file {
    my $path_semaforo = $_[0];
    my $semwait = $_[1];
    # Libera bloqueo.
    my $ret = flock $semwait, LOCK_UN;
    unlink $path_semaforo;
    if (!$ret) {
        print STDERR "Error al desbloquear[$path_semaforo][$!]\n";
    }
}

1;
