summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2004-02-25 19:41:23 +0000
committerBruce Momjian2004-02-25 19:41:23 +0000
commitc672aa823bdc02831ae60f403b2069107de675f7 (patch)
tree0d5566d0df4056250b3a7d74d21a7d69b58f28b2
parent5ada9ef088ae0151a2f6efe48203100ef5b51113 (diff)
For application to HEAD, following community review.
* Changes incorrect CYGWIN defines to __CYGWIN__ * Some localtime returns NULL checks (when unchecked cause SEGVs under Win32 regression tests) * Rationalized CreateSharedMemoryAndSemaphores and AttachSharedMemoryAndSemaphores (Bruce, I finally remembered to do it); requires attention. Claudio Natoli
-rw-r--r--src/backend/bootstrap/bootstrap.c4
-rw-r--r--src/backend/commands/user.c12
-rw-r--r--src/backend/port/sysv_shmem.c6
-rw-r--r--src/backend/postmaster/postmaster.c4
-rw-r--r--src/backend/storage/ipc/ipci.c131
-rw-r--r--src/backend/utils/adt/datetime.c14
-rw-r--r--src/backend/utils/cache/relcache.c6
-rw-r--r--src/include/port.h4
-rw-r--r--src/include/storage/ipc.h10
-rw-r--r--src/port/dirmod.c17
-rw-r--r--src/utils/dllinit.c4
11 files changed, 105 insertions, 107 deletions
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 2f67061c48b..f18fece3982 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.176 2004/02/10 01:55:24 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.177 2004/02/25 19:41:22 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -428,7 +428,7 @@ BootstrapMain(int argc, char *argv[])
#ifdef EXEC_BACKEND
if (IsUnderPostmaster)
- AttachSharedMemoryAndSemaphores();
+ CreateSharedMemoryAndSemaphores(false, MaxBackends, 0);
#endif
XLOGPathInit();
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index 9352aeb0ec0..88af5d19693 100644
--- a/src/backend/commands/user.c
+++ b/src/backend/commands/user.c
@@ -6,7 +6,7 @@
* 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.137 2004/02/10 01:55:25 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.138 2004/02/25 19:41:22 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -140,11 +140,11 @@ write_group_file(Relation grel)
bufsize = strlen(filename) + 12;
tempname = (char *) palloc(bufsize);
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
-#if defined(WIN32) || defined(CYGWIN)
+#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);
@@ -291,7 +291,7 @@ write_user_file(Relation urel)
bufsize = strlen(filename) + 12;
tempname = (char *) palloc(bufsize);
snprintf(tempname, bufsize, "%s.%d", filename, MyProcPid);
-#if defined(WIN32) || defined(CYGWIN)
+#if defined(WIN32) || defined(__CYGWIN__)
filename = repalloc(filename, strlen(filename) + 1 + strlen(".new"));
strcat(filename, ".new");
#endif
@@ -466,7 +466,7 @@ AtEOXact_UpdatePasswordFile(bool isCommit)
user_file_update_needed = false;
write_user_file(urel);
heap_close(urel, NoLock);
-#if defined(WIN32) || defined(CYGWIN)
+#if defined(WIN32) || defined(__CYGWIN__)
{
/* Rename active file while not holding an exclusive lock */
char *filename = user_getfilename(), *filename_new;
@@ -485,7 +485,7 @@ AtEOXact_UpdatePasswordFile(bool isCommit)
group_file_update_needed = false;
write_group_file(grel);
heap_close(grel, NoLock);
-#if defined(WIN32) || defined(CYGWIN)
+#if defined(WIN32) || defined(__CYGWIN__)
{
/* Rename active file while not holding an exclusive lock */
char *filename = group_getfilename(), *filename_new;
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c
index afccd56e376..72d693f5f21 100644
--- a/src/backend/port/sysv_shmem.c
+++ b/src/backend/port/sysv_shmem.c
@@ -10,7 +10,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/sysv_shmem.c,v 1.31 2004/02/08 22:28:56 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/port/sysv_shmem.c,v 1.32 2004/02/25 19:41:22 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -254,7 +254,7 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
{
void* origUsedShmemSegAddr = UsedShmemSegAddr;
-#ifdef CYGWIN
+#ifdef __CYGWIN__
/* cygipc (currently) appears to not detach on exec. */
PGSharedMemoryDetach();
UsedShmemSegAddr = origUsedShmemSegAddr;
@@ -373,7 +373,7 @@ PGSharedMemoryDetach(void)
if (UsedShmemSegAddr != NULL)
{
if ((shmdt(UsedShmemSegAddr) < 0)
-#if (defined(EXEC_BACKEND) && defined(CYGWIN))
+#if (defined(EXEC_BACKEND) && defined(__CYGWIN__))
/* Work-around for cygipc exec bug */
&& shmdt(NULL) < 0
#endif
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index eb549f6b4a4..42ce48d3c28 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.368 2004/02/23 20:45:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.369 2004/02/25 19:41:22 momjian Exp $
*
* NOTES
*
@@ -2727,7 +2727,7 @@ SubPostmasterMain(int argc, char* argv[])
load_group();
/* Attach process to shared segments */
- AttachSharedMemoryAndSemaphores();
+ CreateSharedMemoryAndSemaphores(false, MaxBackends, 0);
/* Run backend */
proc_exit(BackendRun(&port));
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c
index f95b1b34410..ac738d8f77a 100644
--- a/src/backend/storage/ipc/ipci.c
+++ b/src/backend/storage/ipc/ipci.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.64 2004/02/10 01:55:25 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.65 2004/02/25 19:41:22 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -36,8 +36,10 @@
* Creates and initializes shared memory and semaphores.
*
* This is called by the postmaster or by a standalone backend.
- * It is NEVER called by a backend forked from the postmaster;
- * for such a backend, the shared memory is already ready-to-go.
+ * It is also called by a backend forked from the postmaster under
+ * the EXEC_BACKEND case
+ *
+ * In the non EXEC_BACKEND case, backends already have shared memory ready-to-go.
*
* If "makePrivate" is true then we only need private memory, not shared
* memory. This is true for a standalone backend, false for a postmaster.
@@ -47,53 +49,68 @@ CreateSharedMemoryAndSemaphores(bool makePrivate,
int maxBackends,
int port)
{
- int size;
- int numSemas;
- PGShmemHeader *seghdr;
-
- /*
- * Size of the Postgres shared-memory block is estimated via
- * moderately-accurate estimates for the big hogs, plus 100K for the
- * stuff that's too small to bother with estimating.
- */
- size = BufferShmemSize();
- size += LockShmemSize(maxBackends);
- size += XLOGShmemSize();
- size += CLOGShmemSize();
- size += LWLockShmemSize();
- size += SInvalShmemSize(maxBackends);
- size += FreeSpaceShmemSize();
+ PGShmemHeader *seghdr = NULL;
+ if (!IsUnderPostmaster)
+ {
+ int size;
+ int numSemas;
+
+ /*
+ * Size of the Postgres shared-memory block is estimated via
+ * moderately-accurate estimates for the big hogs, plus 100K for the
+ * stuff that's too small to bother with estimating.
+ */
+ size = BufferShmemSize();
+ size += LockShmemSize(maxBackends);
+ size += XLOGShmemSize();
+ size += CLOGShmemSize();
+ size += LWLockShmemSize();
+ size += SInvalShmemSize(maxBackends);
+ size += FreeSpaceShmemSize();
#ifdef EXEC_BACKEND
- size += ShmemBackendArraySize();
+ size += ShmemBackendArraySize();
#endif
- size += 100000;
- /* might as well round it off to a multiple of a typical page size */
- size += 8192 - (size % 8192);
-
- elog(DEBUG3, "invoking IpcMemoryCreate(size=%d)", size);
+ size += 100000;
+ /* might as well round it off to a multiple of a typical page size */
+ size += 8192 - (size % 8192);
+
+ elog(DEBUG3, "invoking IpcMemoryCreate(size=%d)", size);
+
+ /*
+ * Create the shmem segment
+ */
+ seghdr = PGSharedMemoryCreate(size, makePrivate, port);
+
+ /*
+ * Create semaphores
+ */
+ numSemas = ProcGlobalSemas(maxBackends);
+ numSemas += SpinlockSemas();
+ PGReserveSemaphores(numSemas, port);
+ }
+ else
+ {
+ /*
+ * Attach to the shmem segment.
+ * (this should only ever be reached by EXEC_BACKEND code,
+ * and only then with makePrivate == false)
+ */
+ Assert(ExecBackend && !makePrivate);
+ seghdr = PGSharedMemoryCreate(-1, makePrivate, 0);
+ }
- /*
- * Create the shmem segment
- */
- seghdr = PGSharedMemoryCreate(size, makePrivate, port);
-
- /*
- * Create semaphores
- */
- numSemas = ProcGlobalSemas(maxBackends);
- numSemas += SpinlockSemas();
- PGReserveSemaphores(numSemas, port);
/*
* Set up shared memory allocation mechanism
*/
- InitShmemAllocation(seghdr, true);
+ InitShmemAllocation(seghdr, !IsUnderPostmaster);
/*
* Now initialize LWLocks, which do shared memory allocation and are
* needed for InitShmemIndex.
*/
- CreateLWLocks();
+ if (!IsUnderPostmaster)
+ CreateLWLocks();
/*
* Set up shmem.c index hashtable
@@ -137,41 +154,7 @@ CreateSharedMemoryAndSemaphores(bool makePrivate,
/*
* Alloc the win32 shared backend array
*/
- ShmemBackendArrayAllocation();
+ if (!IsUnderPostmaster)
+ ShmemBackendArrayAllocation();
#endif
}
-
-
-#ifdef EXEC_BACKEND
-/*
- * AttachSharedMemoryAndSemaphores
- * Attaches to the existing shared resources.
- */
-
-/* FIXME: [fork/exec] This function is starting to look pretty much like
- CreateSharedMemoryAndSemaphores. Refactor? */
-void
-AttachSharedMemoryAndSemaphores(void)
-{
- PGShmemHeader *seghdr = PGSharedMemoryCreate(-1,false,-1);
-
- InitShmemAllocation(seghdr, false);
-
- InitShmemIndex();
-
- XLOGShmemInit();
- CLOGShmemInit();
- InitBufferPool();
-
- InitLocks();
- InitLockTable(MaxBackends);
-
- InitProcGlobal(MaxBackends);
-
- CreateSharedInvalidationState(MaxBackends);
-
- InitFreeSpaceMap();
-
- PMSignalInit();
-}
-#endif
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 5fa4be73c43..5f340dd2a13 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.124 2004/01/19 19:04:40 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.125 2004/02/25 19:41:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1611,6 +1611,10 @@ DetermineLocalTimeZone(struct tm * tm)
* and reassemble to get a representation of local time.
*/
tx = localtime(&mytime);
+ if (!tx)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
day = date2j(tx->tm_year + 1900, tx->tm_mon + 1, tx->tm_mday) -
UNIX_EPOCH_JDATE;
locsec = tx->tm_sec + (tx->tm_min + (day * 24 + tx->tm_hour) * 60) * 60;
@@ -1632,6 +1636,10 @@ DetermineLocalTimeZone(struct tm * tm)
mysec += delta1;
mytime = (time_t) mysec;
tx = localtime(&mytime);
+ if (!tx)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
day = date2j(tx->tm_year + 1900, tx->tm_mon + 1, tx->tm_mday) -
UNIX_EPOCH_JDATE;
locsec = tx->tm_sec + (tx->tm_min + (day * 24 + tx->tm_hour) * 60) * 60;
@@ -1653,6 +1661,10 @@ DetermineLocalTimeZone(struct tm * tm)
mysec += (delta2 - delta1);
mytime = (time_t) mysec;
tx = localtime(&mytime);
+ if (!tx)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
+ errmsg("timestamp out of range")));
day = date2j(tx->tm_year + 1900, tx->tm_mon + 1, tx->tm_mday) -
UNIX_EPOCH_JDATE;
locsec = tx->tm_sec + (tx->tm_min + (day * 24 + tx->tm_hour) * 60) * 60;
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8561cff549a..ac0ee1a5e51 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.197 2004/02/10 01:55:26 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.198 2004/02/25 19:41:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3266,13 +3266,13 @@ write_relcache_init_file(void)
* OK, rename the temp file to its final name, deleting any
* previously-existing init file.
*/
-#if defined(WIN32) || defined(CYGWIN)
+#if defined(WIN32) || defined(__CYGWIN__)
rename(tempfilename, finalfilename);
LWLockRelease(RelCacheInitLock);
#else
{
char finalfilename_new[MAXPGPATH];
-
+
snprintf(finalfilename_new, sizeof(finalfilename_new), "%s.new", finalfilename);
rename(tempfilename, finalfilename_new);
LWLockRelease(RelCacheInitLock);
diff --git a/src/include/port.h b/src/include/port.h
index 40ccc8a6d22..d96ef4a6d16 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -6,7 +6,7 @@
* 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.19 2004/02/10 03:42:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.20 2004/02/25 19:41:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -34,7 +34,7 @@ extern int fseeko(FILE *stream, off_t offset, int whence);
extern off_t ftello(FILE *stream);
#endif
-#if defined(WIN32) || defined(CYGWIN)
+#if defined(WIN32) || defined(__CYGWIN__)
/*
* Win32 doesn't have reliable rename/unlink during concurrent access
*/
diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h
index 3c2765cc48c..899198447f2 100644
--- a/src/include/storage/ipc.h
+++ b/src/include/storage/ipc.h
@@ -11,7 +11,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/storage/ipc.h,v 1.64 2003/12/20 17:31:21 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/storage/ipc.h,v 1.65 2004/02/25 19:41:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -30,10 +30,6 @@ extern void on_exit_reset(void);
/* ipci.c */
extern void CreateSharedMemoryAndSemaphores(bool makePrivate,
- int maxBackends,
- int port);
-#ifdef EXEC_BACKEND
-extern void AttachSharedMemoryAndSemaphores(void);
-#endif
-
+ int maxBackends,
+ int port);
#endif /* IPC_H */
diff --git a/src/port/dirmod.c b/src/port/dirmod.c
index c0c73832991..51ddd875c5f 100644
--- a/src/port/dirmod.c
+++ b/src/port/dirmod.c
@@ -10,20 +10,25 @@
* Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.10 2004/02/02 22:20:33 momjian Exp $
+ * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.11 2004/02/25 19:41:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef TEST_VERSION
-#if defined(WIN32) || defined(CYGWIN)
+#if defined(WIN32) || defined(__CYGWIN__)
+
+#ifdef __CYGWIN__
+#include <sys/time.h> /* timeval definition for PG_USLEEP */
+#endif
#ifndef FRONTEND
#include "postgres.h"
#else
#include "postgres_fe.h"
#endif
+#include "miscadmin.h"
#undef rename
#undef unlink
@@ -36,19 +41,19 @@ pgrename(const char *from, const char *to)
#ifdef WIN32
while (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING))
#endif
-#ifdef CYGWIN
+#ifdef __CYGWIN__
while (rename(from, to) < 0)
#endif
{
#ifdef WIN32
if (GetLastError() != ERROR_ACCESS_DENIED)
#endif
-#ifdef CYGWIN
+#ifdef __CYGWIN__
if (errno != EACCES)
#endif
/* set errno? */
return -1;
- Sleep(100); /* ms */
+ PG_USLEEP(100000); /* us */
if (loops == 30)
#ifndef FRONTEND
elog(LOG, "could not rename \"%s\" to \"%s\", continuing to try",
@@ -80,7 +85,7 @@ pgunlink(const char *path)
if (errno != EACCES)
/* set errno? */
return -1;
- Sleep(100); /* ms */
+ PG_USLEEP(100000); /* us */
if (loops == 30)
#ifndef FRONTEND
elog(LOG, "could not unlink \"%s\", continuing to try",
diff --git a/src/utils/dllinit.c b/src/utils/dllinit.c
index 264806e4abb..3a0097d28e6 100644
--- a/src/utils/dllinit.c
+++ b/src/utils/dllinit.c
@@ -1,4 +1,4 @@
-#ifdef CYGWIN
+#ifdef __CYGWIN__
#include <cygwin/version.h>
#endif
#if CYGWIN_VERSION_DLL_MAJOR < 1001
@@ -88,7 +88,9 @@ DllMain(
__hDllInstance_base = hInst;
#endif /* __CYGWIN__ */
+#ifdef __CYGWIN__
_impure_ptr = __imp_reent_data;
+#endif
switch (reason)
{