I have applied the following patch. It was submitted a while ago.:
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
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/backend/bootstrap/bootstrap.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/bootstrap/bootstrap.c,v
retrieving revision 1.175
diff -c -r1.175 bootstrap.c
*** src/backend/bootstrap/bootstrap.c 7 Jan 2004 18:56:25 -0000 1.175
--- src/backend/bootstrap/bootstrap.c 5 Feb 2004 12:36:15 -0000
***************
*** 428,434 ****
#ifdef EXEC_BACKEND
if (IsUnderPostmaster)
! AttachSharedMemoryAndSemaphores();
#endif
XLOGPathInit();
--- 428,434 ----
#ifdef EXEC_BACKEND
if (IsUnderPostmaster)
! CreateSharedMemoryAndSemaphores(false, MaxBackends, 0);
#endif
XLOGPathInit();
Index: src/backend/commands/user.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/user.c,v
retrieving revision 1.136
diff -c -r1.136 user.c
*** src/backend/commands/user.c 2 Feb 2004 17:21:07 -0000 1.136
--- src/backend/commands/user.c 5 Feb 2004 12:36:16 -0000
***************
*** 139,149 ****
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);
--- 139,149 ----
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);
***************
*** 290,296 ****
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
--- 290,296 ----
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
***************
*** 465,471 ****
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;
--- 465,471 ----
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;
***************
*** 484,490 ****
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;
--- 484,490 ----
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;
Index: src/backend/port/sysv_shmem.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/port/sysv_shmem.c,v
retrieving revision 1.30
diff -c -r1.30 sysv_shmem.c
*** src/backend/port/sysv_shmem.c 2 Feb 2004 00:11:31 -0000 1.30
--- src/backend/port/sysv_shmem.c 5 Feb 2004 12:36:17 -0000
***************
*** 255,261 ****
{
void* origUsedShmemSegAddr = UsedShmemSegAddr;
! #ifdef CYGWIN
/* cygipc (currently) appears to not detach on exec. */
PGSharedMemoryDetach();
UsedShmemSegAddr = origUsedShmemSegAddr;
--- 255,261 ----
{
void* origUsedShmemSegAddr = UsedShmemSegAddr;
! #ifdef __CYGWIN__
/* cygipc (currently) appears to not detach on exec. */
PGSharedMemoryDetach();
UsedShmemSegAddr = origUsedShmemSegAddr;
***************
*** 374,380 ****
if (UsedShmemSegAddr != NULL)
{
if ((shmdt(UsedShmemSegAddr) < 0)
! #if (defined(EXEC_BACKEND) && defined(CYGWIN))
/* Work-around for cygipc exec bug */
&& shmdt(NULL) < 0
#endif
--- 374,380 ----
if (UsedShmemSegAddr != NULL)
{
if ((shmdt(UsedShmemSegAddr) < 0)
! #if (defined(EXEC_BACKEND) && defined(__CYGWIN__))
/* Work-around for cygipc exec bug */
&& shmdt(NULL) < 0
#endif
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.364
diff -c -r1.364 postmaster.c
*** src/backend/postmaster/postmaster.c 28 Jan 2004 21:02:40 -0000 1.364
--- src/backend/postmaster/postmaster.c 5 Feb 2004 12:36:19 -0000
***************
*** 2721,2727 ****
load_group();
/* Attach process to shared segments */
! AttachSharedMemoryAndSemaphores();
/* Run backend */
proc_exit(BackendRun(&port));
--- 2721,2727 ----
load_group();
/* Attach process to shared segments */
! CreateSharedMemoryAndSemaphores(false, MaxBackends, 0);
/* Run backend */
proc_exit(BackendRun(&port));
Index: src/backend/storage/ipc/ipci.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/storage/ipc/ipci.c,v
retrieving revision 1.63
diff -c -r1.63 ipci.c
*** src/backend/storage/ipc/ipci.c 26 Jan 2004 22:59:53 -0000 1.63
--- src/backend/storage/ipc/ipci.c 5 Feb 2004 12:36:19 -0000
***************
*** 36,43 ****
* 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.
*
* If "makePrivate" is true then we only need private memory, not shared
* memory. This is true for a standalone backend, false for a postmaster.
--- 36,45 ----
* Creates and initializes shared memory and semaphores.
*
* This is called by the postmaster or by a standalone backend.
! * 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,102 ****
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();
#ifdef EXEC_BACKEND
! size += ShmemBackendArraySize();
#endif
#ifdef STABLE_MEMORY_STORAGE
! size += MMShmemSize();
#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);
!
! /*
! * 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);
/*
* Now initialize LWLocks, which do shared memory allocation and are
* needed for InitShmemIndex.
*/
! CreateLWLocks();
/*
* Set up shmem.c index hashtable
--- 49,119 ----
int maxBackends,
int port)
{
! 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();
#endif
#ifdef STABLE_MEMORY_STORAGE
! size += MMShmemSize();
#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);
!
! /*
! * 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);
! }
/*
* Set up shared memory allocation mechanism
*/
! InitShmemAllocation(seghdr, !IsUnderPostmaster);
/*
* Now initialize LWLocks, which do shared memory allocation and are
* needed for InitShmemIndex.
*/
! if (!IsUnderPostmaster)
! CreateLWLocks();
/*
* Set up shmem.c index hashtable
***************
*** 140,180 ****
/*
* Alloc the win32 shared backend array
*/
! 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
--- 157,163 ----
/*
* Alloc the win32 shared backend array
*/
! if (!IsUnderPostmaster)
! ShmemBackendArrayAllocation();
#endif
}
Index: src/backend/utils/adt/datetime.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/adt/datetime.c,v
retrieving revision 1.124
diff -c -r1.124 datetime.c
*** src/backend/utils/adt/datetime.c 19 Jan 2004 19:04:40 -0000 1.124
--- src/backend/utils/adt/datetime.c 5 Feb 2004 12:36:22 -0000
***************
*** 1611,1616 ****
--- 1611,1620 ----
* 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,1637 ****
--- 1636,1645 ----
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,1658 ****
--- 1661,1670 ----
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;
Index: src/backend/utils/cache/relcache.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/cache/relcache.c,v
retrieving revision 1.196
diff -c -r1.196 relcache.c
*** src/backend/utils/cache/relcache.c 2 Feb 2004 00:17:21 -0000 1.196
--- src/backend/utils/cache/relcache.c 5 Feb 2004 12:36:26 -0000
***************
*** 3359,3371 ****
* OK, rename the temp file to its final name, deleting any
* previously-existing init file.
*/
! #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);
--- 3359,3371 ----
* OK, rename the temp file to its final name, deleting any
* previously-existing init file.
*/
! #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);
Index: src/include/port.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/port.h,v
retrieving revision 1.18
diff -c -r1.18 port.h
*** src/include/port.h 2 Feb 2004 22:20:33 -0000 1.18
--- src/include/port.h 5 Feb 2004 12:36:27 -0000
***************
*** 30,36 ****
extern off_t ftello(FILE *stream);
#endif
! #if defined(WIN32) || defined(CYGWIN)
/*
* Win32 doesn't have reliable rename/unlink during concurrent access
*/
--- 30,36 ----
extern off_t ftello(FILE *stream);
#endif
! #if defined(WIN32) || defined(__CYGWIN__)
/*
* Win32 doesn't have reliable rename/unlink during concurrent access
*/
Index: src/include/storage/ipc.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/storage/ipc.h,v
retrieving revision 1.64
diff -c -r1.64 ipc.h
*** src/include/storage/ipc.h 20 Dec 2003 17:31:21 -0000 1.64
--- src/include/storage/ipc.h 5 Feb 2004 12:36:27 -0000
***************
*** 30,39 ****
/* ipci.c */
extern void CreateSharedMemoryAndSemaphores(bool makePrivate,
! int maxBackends,
! int port);
! #ifdef EXEC_BACKEND
! extern void AttachSharedMemoryAndSemaphores(void);
! #endif
!
#endif /* IPC_H */
--- 30,35 ----
/* ipci.c */
extern void CreateSharedMemoryAndSemaphores(bool makePrivate,
! int maxBackends,
! int port);
#endif /* IPC_H */
Index: src/port/dirmod.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/port/dirmod.c,v
retrieving revision 1.10
diff -c -r1.10 dirmod.c
*** src/port/dirmod.c 2 Feb 2004 22:20:33 -0000 1.10
--- src/port/dirmod.c 5 Feb 2004 12:36:28 -0000
***************
*** 17,29 ****
#ifndef TEST_VERSION
! #if defined(WIN32) || defined(CYGWIN)
#ifndef FRONTEND
#include "postgres.h"
#else
#include "postgres_fe.h"
#endif
#undef rename
#undef unlink
--- 17,34 ----
#ifndef TEST_VERSION
! #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,54 ****
#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 */
if (loops == 30)
#ifndef FRONTEND
elog(LOG, "could not rename \"%s\" to \"%s\", continuing to try",
--- 41,59 ----
#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;
! PG_USLEEP(100000); /* us */
if (loops == 30)
#ifndef FRONTEND
elog(LOG, "could not rename \"%s\" to \"%s\", continuing to try",
***************
*** 80,86 ****
if (errno != EACCES)
/* set errno? */
return -1;
! Sleep(100); /* ms */
if (loops == 30)
#ifndef FRONTEND
elog(LOG, "could not unlink \"%s\", continuing to try",
--- 85,91 ----
if (errno != EACCES)
/* set errno? */
return -1;
! PG_USLEEP(100000); /* us */
if (loops == 30)
#ifndef FRONTEND
elog(LOG, "could not unlink \"%s\", continuing to try",
Index: src/utils/dllinit.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/utils/dllinit.c,v
retrieving revision 1.15
diff -c -r1.15 dllinit.c
*** src/utils/dllinit.c 2 Feb 2004 17:21:08 -0000 1.15
--- src/utils/dllinit.c 5 Feb 2004 12:36:29 -0000
***************
*** 1,4 ****
! #ifdef CYGWIN
#include <cygwin/version.h>
#endif
#if CYGWIN_VERSION_DLL_MAJOR < 1001
--- 1,4 ----
! #ifdef __CYGWIN__
#include <cygwin/version.h>
#endif
#if CYGWIN_VERSION_DLL_MAJOR < 1001
***************
*** 88,94 ****
--- 88,96 ----
__hDllInstance_base = hInst;
#endif /* __CYGWIN__ */
+ #ifdef __CYGWIN__
_impure_ptr = __imp_reent_data;
+ #endif
switch (reason)
{