#!/usr/bin/perl

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

#-------------------------------COMENTARIO GLOBAL---------------
#---------------------------------------------------------------
# PROPOSITO.
#-----------
# Implementa rutinas bloquear archivos
# uso:

#  # Detecta semaforo.
#  my ($semaforo_file) = "$DIR_SERVER/control_files/semaforo_sender_$CLTE_ID";
#  my ($lock_obj) = &lib_lock::lock_file($semaforo_file);
#  if (!ref $lock_obj) { # si ya tiene un bloqueo anterior, aborta.
#    exit;
#  };
#  .....
#
#  # Libera lock
#  &lib_lock::unlock_file($lock_obj, $semaforo_file);
#---------------------------------------------------------------

#---------------------------------------------------------------
# DIRECTIVAS DE COMPILACION.
#---------------------------
package lib_lock;
require LockFile::Simple;

use strict;
use utf8;

#---------------------------------------------------------------#
# SUB-RUTINAS.
#---------------------------------------------------------------#
sub lock_file {
# Intenta bloquear el archivo pasado x param.
# Si lo logra, retorna la ref. al objeto lock.
# Si falla dado q ya esta tomado el archivo, retorna undef.
# No es necesario q el archivo exista, sin embargo su dir de ubicacion debe ser valido.
# Si despues del bloqueo el script se cae entre medio, el lock se libera automaticamente la prox. vez que se le bloquee.
    my ($file2lock) = $_[0];
    my ($lockmgr) = LockFile::Simple->make(-format => '%f.lck',
    -max => 20, -delay => 1, -nfs => 1, -autoclean => 1, -stale => 1, hold => 28800); # 1.1 - 8 horas como max dura el bloqueo (es en segs)
    my ($lock_obj) = $lockmgr->trylock($file2lock);
    return $lock_obj;
};
# ---------------------------------------------------------------
sub unlock_file {
# Libera el lock sobre el archivo apuntado por el obj pasado x param.
    my ($lock_obj) = $_[0];
    my ($lock_file) = $_[1];
    $lock_obj->release if ref $lock_obj;
}

1;
