our @lockstat; sub readlock { my($fh)=@_; my $fileno = fileno($fh); defined($fileno) or die "Bad filehandle"; if ($lockstat[$fileno] && $lockstat[$fileno]{count}) { $lockstat[$fileno]{count}++; } else { fcntl_lock($fh,F_RDLCK); $lockstat[$fileno]{count}=1; } } sub readunlock { my($fh)=@_; my $fileno = fileno($fh); defined($fileno) or die "Bad filehandle"; return unless $lockstat[$fileno] and $lockstat[$fileno]{count}; if (--$lockstat[$fileno]{count} == 0) { fcntl_lock($fh,F_UNLCK); } }