Just wanted to let you know that I found the problem.  I had an error in
my code where I was accidentally trying to put a read lock on a file
where I had not properly closed the write lock.  This condition occurred
in error handling code and it was hard to find.

Anyway I was happy to learn that if you assign a file handle to a
lexical variable:

i.e.

my $FileHandle = Symbol::gensym();
open $FileHandle, $strOpenChar . $strFileName or eval{$blnError = 1};

then when the scope of that variable ends, be it in mod_perl or
elsewhere, the file is unlocked and closed even if you forget to do so.

Thanks for your help,

Justin


-----Original Message-----
From: Robert Landrum [mailto:[EMAIL PROTECTED] 
Sent: Friday, April 13, 2007 3:16 PM
To: Justin Luster
Cc: 'Dondi M. Stroma'; modperl@perl.apache.org
Subject: Re: Lock Files - File is permanently locked

Justin Luster wrote:
> Here is an example of a call to OpenFile().  You will notice that I'm
> additionally locking the file itself as well as the lock file (I
figured
> it would not hurt to have both methods):
> 
> my $LockFileHandle = authlib::FileLock("udata_" . $strRespNum .
> "_lck.cgi", 1);
> 
> #Read restart question name
> my ($DataFileHandle, $blnError) = authlib::OpenFile($strDataFileName,
> "update", 1, 1);
> 
> authlib::LockMe($DataFileHandle, 1);
>                               
> authlib::RestartQNameWrite($DataFileHandle, $strRestartQName);
>                                                       
> close $DataFileHandle;
> 
> close authlib::FileUnLock($LockFileHandle);


Seems like an awful lot of code...

open(DATAFILE,">$strDataFileName") or die;
flock(DATAFILE,LOCK_EX);
seek(DATAFILE,0,0);
eval {
   authlib::RestartQNameWrite(\*DATAFILE,$strRestartQName);
};
flock(DATAFILE,LOCK_UN);
close(DATAFILE);
if($@) {
   die $@;
}

Code like that has never failed me on Solaris or Linux.  I don't write 
W32 code, so maybe it's more complicated than that.

Also,

 > close authlib::FileUnLock($LockFileHandle);

That seems like an error waiting to happen, since FileUnLock doesn't 
return a file handle.

Rob


Reply via email to