# -*- perl -*-
#
# $Id: LockFile.pm,v 1.1 1995/07/25 14:59:54 ejb Exp $
# $Source: /home/ejb/source/perl/modules/RCS/LockFile.pm,v $
# $Author: ejb $
#
# LockFile module.  Creation creates a lockfile with our pid in it,
# waiting for it to become available if necessary.  Destruction causes
# lock to be released.
#

require 5.000;
use strict qw(refs subs);

package LockFile;
$package = "LockFile";

use POSIX 'errno_h';

# Field names
$f_lockfile = "lockfile";

# Static Variables

# Routines

sub new
{
    shift;
    my $rep = +{$package => {} };

    if (@_ != 1)
    {
	die "Usage: $package: new $package(lockfilename)\n";
    }
    local($lockfile) = shift;

    $rep->{$package}{$f_lockfile} = $lockfile;

    local(*LOCK, $pid);
    local($done) = 0;
    while (! $done)
    {
	if (-f $lockfile)
	{
	    while (! $done)
	    {
		open(LOCK, "<$lockfile") ||
		    die "$package: can't open/read current $lockfile: $!\n";
		$pid = <LOCK>;
		close(LOCK);
		last if (! defined($pid));
		$done = 1 if ($pid == $$);
		kill 0, $pid;
		last if ($! + 0 == &ESRCH());
		sleep 1;
	    }	    
	}
	if (! $done)
	{
	    open(LOCK, ">$lockfile") ||
		die "$package: can't create lockfile $lockfile: $!\n";
	    chmod 0666, $lockfile;
	    print LOCK $$, "\n";
	    close(LOCK);
	}
    }

    bless $rep;
}

sub DESTROY
{
    my $rep = shift;
    local($lockfile) = $rep->{$package}{$f_lockfile};
    local(*LOCK);
    open(LOCK, ">$lockfile") ||
	die "$package: can't create lockfile $lockfile: $!\n";
    close(LOCK);
}

sub test
{
    shift;
    $a = new LockFile("lock");
    print "Got Lock\n";
    sleep 10;
    print "Goodbye\n";
}

1;
