
I don't know how to build your lockFile function. It seems that it would have a side effect of closing the handle. It could return a new handle like this, but then withFile's automatic close of the file would be defeated.
lockFile h = do lockfd<- handleToFd h -- closes h waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0) newh<- fdToHandle lockfd return newh
Here's what I'm using instead.
withFileLocked file mode action = do -- TODO: find a way to use bracket here handle<- openFile file mode lockfd<- handleToFd handle -- closes handle waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0) handle'<- fdToHandle lockfd ret<- action handle' hClose handle' return ret where lockType ReadMode = ReadLock lockType _ = WriteLock
I was looking here: http://www.haskell.org/ghc/docs/6.12.2/html/libraries/unix-2.4.0.1/System-Po... Instead of creating the handle, then converting to an fd, only to return a new handle, why don't you start with the file descriptor and convert at the end of the process. I don't have time for a full piece of code, but maybe something like this: lockFile file = do fd <- openFd ReadOnly Nothing defaultFileFlags waitToSetLock fd (lockType mode, AbsoluteSeek, 0, 0) handle <- fdToHandle fd return handle You could also use the same sort of code in your withFileLocked function.
According to strace, this does not involve any system-level locking with flock/fcntl/lockf. It is done internally to the ghc process.
Thanks for testing that out. I appreciate the information. Ciao, Jimmy