Mike Mascari wrote:
> Bruce Momjian wrote:
> > I am working with several groups getting the Win32 port ready for 7.4
> > and I have a few questions:
> > 
> > What is the standard workaround for the fact that rename() isn't atomic
> > on Win32?  Do we need to create our own locking around the
> > reading/writing of files that are normally updated in place using
> > rename()?
> 
> Visual C++ comes with the source to Microsoft's C library:
> 
> rename() calls MoveFile() which will error if:
> 
> 1. The target file exists
> 2. The source file is in use
> 
> MoveFileEx() (not available on 95/98) can overwrite the target 
> file if it exists. The Apache APR portability library uses 
> MoveFileEx() to rename files if under NT/XP/2K vs. a sequence of :
> 
> 1. CreateFile() to test for target file existence
> 2. DeleteFile() to remove the target file
> 3. MoveFile() to rename the old file to new
> 
> under Windows 95/98. Of course, some other process could create 
> the target file between 2 and 3, so their rename() would just 
> error out in that situation. I haven't tested it, but I recall 
> reading somewhere that MoveFileEx() has the ability to rename an 
> opened file. I'm 99% sure MoveFile() will fail if the source 
> file is open.

OK, I downloaded APR and see in apr_file_rename():

        if (MoveFileEx(frompath, topath, MOVEFILE_REPLACE_EXISTING |
                                         MOVEFILE_COPY_ALLOWED))


Looking at the entire APR function, they have lots of tests so it works
on Win9X and wide characters.  I think we will just use the APR as a
guide in implementing the things we need.  I think MoveFileEx() is the
proper way to go;  any other solution requires loop tests for rename.

I see the MoveFileEx manual page at:

        
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/movefile.asp

> > Second, when you unlink() a file on Win32, do applications continue
> > accessing the old file contents if they had the file open before the
> > unlink?
> > 
> 
> unlink() just calls DeleteFile() which will error if:
> 
> 1. The target file is in use
> 
> CreateFile() has the option:
> 
> FILE_FLAG_DELETE_ON_CLOSE
> 
> which might be able to be used to simulate traditional unlink() 
> behavior.

No, that flag isn't going to help us.  I wonder what MoveFileEx does if
the target file exists _and_ is open by another user?  I don't see any
loop in that Win32 rename() routine, and I looked at the Unix version of
apr_file_rename and its just a straight rename() call.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly

Reply via email to