then release locks and loop over renaming to active file name.
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.133 2004/01/26 22:35:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.134 2004/02/02 00:17:21 momjian Exp $
*
*-------------------------------------------------------------------------
*/
bufsize = strlen(filename) + 12;
tempname = (char *) palloc(bufsize);
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
-
+#if defined(WIN32) || defined(CYGWIN)
+ filename = repalloc(filename, strlen(filename) + 1 + strlen(".new");
+ strcat(filename, ".new");
+#endif
+
oumask = umask((mode_t) 077);
fp = AllocateFile(tempname, "w");
umask(oumask);
bufsize = strlen(filename) + 12;
tempname = (char *) palloc(bufsize);
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
+#if defined(WIN32) || defined(CYGWIN)
+ filename = repalloc(filename, strlen(filename) + 1 + strlen(".new");
+ strcat(filename, ".new");
+#endif
oumask = umask((mode_t) 077);
fp = AllocateFile(tempname, "w");
user_file_update_needed = false;
write_user_file(urel);
heap_close(urel, NoLock);
+#if defined(WIN32) || defined(CYGWIN)
+ {
+ /* Rename active file while not holding an exclusive lock */
+ char *filename = user_getfilename(), *filename_new;
+
+ filename_new = palloc(strlen(filename) + 1 + strlen(".new")));
+ sprintf(filename_new, "%s.new", filename);
+ rename(filename_new, filename);
+ pfree(filename);
+ pfree(filename_new);
+ }
+#endif
}
if (group_file_update_needed)
group_file_update_needed = false;
write_group_file(grel);
heap_close(grel, NoLock);
+#if defined(WIN32) || defined(CYGWIN)
+ {
+ /* Rename active file while not holding an exclusive lock */
+ char *filename = group_getfilename(), *filename_new;
+
+ filename_new = palloc(strlen(filename) + 1 + strlen(".new")));
+ sprintf(filename_new, "%s.new", filename);
+ rename(filename_new, filename);
+ pfree(filename);
+ pfree(filename_new);
+ }
+#endif
}
/*
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.195 2004/01/26 22:35:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.196 2004/02/02 00:17:21 momjian Exp $
*
*-------------------------------------------------------------------------
*/
/*
* OK, rename the temp file to its final name, deleting any
* previously-existing init file.
- *
- * Note: a failure here is possible under Cygwin, if some other
- * backend is holding open an unlinked-but-not-yet-gone init file.
- * So treat this as a noncritical failure.
*/
- if (rename(tempfilename, finalfilename) < 0)
+#if defined(WIN32) || defined(CYGWIN)
+ rename(tempfilename, finalfilename);
+ LWLockRelease(RelCacheInitLock);
+#else
{
- ereport(WARNING,
- (errcode_for_file_access(),
- errmsg("could not rename relation-cache initialization file \"%s\" to \"%s\": %m",
- tempfilename, finalfilename),
- errdetail("Continuing anyway, but there's something wrong.")));
-
- /*
- * If we fail, try to clean up the useless temp file; don't
- * bother to complain if this fails too.
- */
- unlink(tempfilename);
+ char finalfilename_new[MAXPGPATH];
+
+ snprintf(finalfilename_new, sizeof(finalfilename_new), "%s.new", finalfilename);
+ rename(tempfilename, finalfilename_new);
+ LWLockRelease(RelCacheInitLock);
+ /* Rename to active file after lock is released */
+ rename(finalfilename_new, finalfilename);
}
+#endif
}
else
{
/* Delete the already-obsolete temp file */
unlink(tempfilename);
+ LWLockRelease(RelCacheInitLock);
}
-
- LWLockRelease(RelCacheInitLock);
}
/*
* Written by Peter Eisentraut
.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.182 2004/01/31 05:09:41 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.183 2004/02/02 00:17:21 momjian Exp $
*
*--------------------------------------------------------------------
*/
return;
}
- /* Put new file in place, this could delay on Win32 */
+ /*
+ * Put new file in place. This could delay on Win32, but we don't hold
+ * any exclusive locks.
+ */
rename(new_filename, filename);
free(new_filename);
free(filename);
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/port.h,v 1.16 2004/02/02 00:11:31 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.17 2004/02/02 00:17:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
extern off_t ftello(FILE *stream);
#endif
-#ifdef WIN32
+#if !defined(FRONTEND) && (defined(WIN32) || defined(CYGWIN))
/*
* Win32 doesn't have reliable rename/unlink during concurrent access
*/
-#ifndef FRONTEND
extern int pgrename(const char *from, const char *to);
extern int pgunlink(const char *path);
#define unlink(path) pgunlink(path)
#endif
+#ifdef WIN32
extern int copydir(char *fromdir, char *todir);
/* Missing rand functions */
* Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.8 2003/11/29 19:52:13 pgsql Exp $
+ * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.9 2004/02/02 00:17:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
{
int loops = 0;
+#ifdef WIN32
while (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING))
+#endif
+#ifdef CYGWIN
+ while (rename(from, to) < 0)
+#endif
{
+#ifdef WIN32
if (GetLastError() != ERROR_ACCESS_DENIED)
+#endif
+#ifdef CYGWIN
+ if (errno != EACCES)
+#endif
/* set errno? */
return -1;
Sleep(100); /* ms */