#
# <URL:http://www.din.or.jp/~ohzaki/perl.htm#File_Lock> がオリジナルで
# す。詳しい解説および使い方は上記サイトを参照してください。このコード
# は大崎博基氏によるもので、「利用・改造は自由」とされています。利用等
# についての条件や限制時項については
# <URL:http://www.din.or.jp/~ohzaki/perl.htm#First> の記述をご覧くださ
# い。
#
# Copyright (C) 1999-2001 OHZAKI Hiroki. All rights reserved.
#

sub my_flock {
  my %lfh = (dir => './lockdir/', basename => 'lockfile',
	     timeout => 60, trytime => 10, @_);
  $lfh{path} = $lfh{dir} . $lfh{basename};

  for (my $i = 0; $i < $lfh{trytime}; $i++, sleep 1) {
    return \%lfh if (rename($lfh{path}, $lfh{current} = $lfh{path} . time));
  }
  opendir(LOCKDIR, $lfh{dir});
  my @filelist = readdir(LOCKDIR);
  closedir(LOCKDIR);
  foreach (@filelist) {
    if (/^$lfh{basename}(\d+)/) {
      return \%lfh if (time - $1 > $lfh{timeout} and
	  rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
      last;
    }
  }
  undef;
}

sub my_funlock {
  rename($_[0]->{current}, $_[0]->{path});
}

# ロックする(タイムアウトあり)
$lfh = my_flock() or die 'Busy!';

# アンロックする
my_funlock($lfh);
