diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 2f67061c48b036d92d520ddbe7885115a6398461..f18fece398251bda4c66cd869a73b286974fdd1b 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 9352aeb0ec03784414a0643acfe5c354f3416ab8..88af5d196931229caf74458b3fb51189de9e96c8 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 afccd56e376afa7063314cea56bbda17a2003bff..72d693f5f21f6e82cac652a3693df62c6c3ed59b 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 eb549f6b4a47d9f4efebd3a8b1e196e7be23fe14..42ce48d3c286b8f10216faa14655c48ce183b128 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 f95b1b3441057d6d70526f73291061d89b5ec02b..ac738d8f77ab41557029fa81ed717e3184f795fe 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 5fa4be73c433b3d1d7fec2f33fc8295fc6befd3b..5f340dd2a13838572843836254f142b9e1caabe0 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 8561cff549abe3b978be060d3af618812b895d58..ac0ee1a5e518930a4a45833c4ed6289c2e76da97 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 40ccc8a6d22e48a1e7722847799c0a0418e5c31a..d96ef4a6d16dd389e34ea707d8549d9c46ee0737 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 3c2765cc48c8e465f111366ce312883e831b8af4..899198447f245766f1714a1b8c6de601475c02ab 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 c0c7383299189ccf23d6b8e906c514af42906ca5..51ddd875c5f40b9336e5a03de3b4444a54b8c8de 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 /* 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 264806e4abbd15aaa3a981db32571d49468df629..3a0097d28e6775d2c2ed615721f650d0e7c5fa25 100644 --- a/src/utils/dllinit.c +++ b/src/utils/dllinit.c @@ -1,4 +1,4 @@ -#ifdef CYGWIN +#ifdef __CYGWIN__ #include #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) {