aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/Makefile43
-rw-r--r--src/backend/main/main.c8
-rw-r--r--src/backend/port/sysv_shmem.c41
-rw-r--r--src/backend/port/win32/shmem.c2
-rw-r--r--src/backend/utils/init/findbe.c6
5 files changed, 84 insertions, 16 deletions
diff --git a/src/backend/Makefile b/src/backend/Makefile
index ce537537c3e..5d342fa2735 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -4,7 +4,7 @@
#
# Copyright (c) 1994, Regents of the University of California
#
-# $PostgreSQL: pgsql/src/backend/Makefile,v 1.97 2003/11/29 19:51:39 pgsql Exp $
+# $PostgreSQL: pgsql/src/backend/Makefile,v 1.98 2004/02/02 00:11:30 momjian Exp $
#
#-------------------------------------------------------------------------
@@ -32,12 +32,15 @@ endif
all: submake-libpgport postgres $(POSTGRES_IMP)
ifneq ($(PORTNAME), cygwin)
+ifneq ($(PORTNAME), win32)
postgres: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(export_dynamic) $^ $(LIBS) -o $@
-else # cygwin
+endif
+endif
+ifeq ($(PORTNAME), cygwin)
postgres: $(OBJS) $(DLLINIT) postgres.def libpostgres.a
$(DLLTOOL) --dllname $@$(X) --output-exp $@.exp --def postgres.def
$(CC) $(CFLAGS) $(LDFLAGS) -o $@$(X) -Wl,--base-file,$@.base $@.exp $(OBJS) $(LIBS)
@@ -53,6 +56,24 @@ libpostgres.a: postgres.def
endif # cygwin
+ifeq ($(PORTNAME), win32)
+
+postgres: $(OBJS) $(DLLINIT) postgres.def libpostgres.a
+ $(DLLTOOL) --dllname $@$(X) --output-exp $@.exp --def postgres.def
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@$(X) -Wl,--base-file,$@.base $@.exp $(OBJS) $(LIBS)
+ $(DLLTOOL) --dllname $@$(X) --base-file $@.base --output-exp $@.exp --def postgres.def
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@$(X) $@.exp $(OBJS) $(LIBS)
+ rm -f $@.exp $@.base
+
+postgres.def: $(OBJS)
+ $(DLLTOOL) --export-all --output-def $@ $^
+
+libpostgres.a: postgres.def
+ $(DLLTOOL) --dllname postgres.exe --def postgres.def --output-lib $@
+
+endif # win32
+
+
ifeq ($(PORTNAME), aix)
postgres: $(POSTGRES_IMP)
@@ -131,6 +152,11 @@ ifeq ($(MAKE_DLL), true)
$(INSTALL_DATA) libpostgres.a $(DESTDIR)$(libdir)/libpostgres.a
endif
endif
+ifeq ($(PORTNAME), win32)
+ifeq ($(MAKE_DLL), true)
+ $(INSTALL_DATA) libpostgres.a $(DESTDIR)$(libdir)/libpostgres.a
+endif
+endif
$(MAKE) -C catalog install-data
$(INSTALL_DATA) $(srcdir)/libpq/pg_hba.conf.sample $(DESTDIR)$(datadir)/pg_hba.conf.sample
$(INSTALL_DATA) $(srcdir)/libpq/pg_ident.conf.sample $(DESTDIR)$(datadir)/pg_ident.conf.sample
@@ -157,6 +183,11 @@ ifeq ($(MAKE_DLL), true)
$(mkinstalldirs) $(DESTDIR)$(libdir)
endif
endif
+ifeq ($(PORTNAME), win32)
+ifeq ($(MAKE_DLL), true)
+ $(mkinstalldirs) $(DESTDIR)$(libdir)
+endif
+endif
ifeq ($(MAKE_EXPORTS), true)
$(mkinstalldirs) $(DESTDIR)$(pkglibdir)
endif
@@ -174,6 +205,11 @@ ifeq ($(MAKE_DLL), true)
rm -f $(DESTDIR)$(libdir)/libpostgres.a
endif
endif
+ifeq ($(PORTNAME), win32)
+ifeq ($(MAKE_DLL), true)
+ rm -f $(DESTDIR)$(libdir)/libpostgres.a
+endif
+endif
$(MAKE) -C catalog uninstall-data
rm -f $(DESTDIR)$(datadir)/pg_hba.conf.sample \
$(DESTDIR)$(datadir)/pg_service.conf.sample \
@@ -190,6 +226,9 @@ clean:
ifeq ($(PORTNAME), cygwin)
rm -f postgres.dll postgres.def libpostgres.a
endif
+ifeq ($(PORTNAME), win32)
+ rm -f postgres.dll postgres.def libpostgres.a
+endif
for i in $(DIRS); do $(MAKE) -C $$i clean || exit; done
distclean: clean
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 90a1a35a3a5..a4a9c84ce04 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -13,7 +13,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.72 2004/01/27 00:45:26 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.73 2004/02/02 00:11:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -227,7 +227,11 @@ main(int argc, char *argv[])
*/
len = strlen(new_argv[0]);
- if (len >= 10 && strcmp(new_argv[0] + len - 10, "postmaster") == 0)
+ if ((len >= 10 && strcmp(new_argv[0] + len - 10, "postmaster") == 0)
+#ifdef WIN32
+ || (len >= 14 && strcmp(new_argv[0] + len - 14, "postmaster.exe") == 0)
+#endif
+ )
{
/* Called as "postmaster" */
exit(PostmasterMain(argc, new_argv));
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c
index 18b4a193f3f..02847698e60 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.29 2004/01/27 00:45:26 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/port/sysv_shmem.c,v 1.30 2004/02/02 00:11:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -140,8 +140,13 @@ InternalIpcMemoryCreate(IpcMemoryKey memKey, uint32 size)
/* use intimate shared memory on Solaris */
memAddress = shmat(shmid, 0, SHM_SHARE_MMU);
#else
+
+#ifdef EXEC_BACKEND
+ memAddress = shmat(shmid, UsedShmemSegAddr, 0);
+#else
memAddress = shmat(shmid, 0, 0);
#endif
+#endif
if (memAddress == (void *) -1)
elog(FATAL, "shmat(id=%d) failed: %m", shmid);
@@ -244,18 +249,32 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
PGShmemHeader *hdr;
IpcMemoryId shmid;
- /* Room for a header? */
- Assert(size > MAXALIGN(sizeof(PGShmemHeader)));
-
+#ifdef EXEC_BACKEND
/* If Exec case, just attach and return the pointer */
- if (ExecBackend && UsedShmemSegAddr != NULL && !makePrivate)
+ if (UsedShmemSegAddr != NULL && !makePrivate)
{
+ void* origUsedShmemSegAddr = UsedShmemSegAddr;
+
+#ifdef CYGWIN
+ /* cygipc (currently) appears to not detach on exec. */
+ PGSharedMemoryDetach();
+ UsedShmemSegAddr = origUsedShmemSegAddr;
+#endif
+ elog(DEBUG3,"Attaching to %x",UsedShmemSegAddr);
hdr = PGSharedMemoryAttach((IpcMemoryKey) UsedShmemSegID, &shmid);
if (hdr == NULL)
- elog(FATAL, "could not attach to proper memory at fixed address: shmget(key=%lu, addr=%p) failed: %m",
- UsedShmemSegID, UsedShmemSegAddr);
+ elog(FATAL, "could not attach to proper memory at fixed address: shmget(key=%d, addr=%p) failed: %m",
+ (int) UsedShmemSegID, UsedShmemSegAddr);
+ if (hdr != origUsedShmemSegAddr)
+ elog(FATAL,"attaching to shared mem returned unexpected address (got %p, expected %p)",
+ hdr,UsedShmemSegAddr);
+ UsedShmemSegAddr = hdr;
return hdr;
}
+#endif
+
+ /* Room for a header? */
+ Assert(size > MAXALIGN(sizeof(PGShmemHeader)));
/* Make sure PGSharedMemoryAttach doesn't fail without need */
UsedShmemSegAddr = NULL;
@@ -354,12 +373,18 @@ PGSharedMemoryDetach(void)
{
if (UsedShmemSegAddr != NULL)
{
- if (shmdt(UsedShmemSegAddr) < 0)
+ if ((shmdt(UsedShmemSegAddr) < 0)
+#if (defined(EXEC_BACKEND) && defined(CYGWIN))
+ /* Work-around for cygipc exec bug */
+ && shmdt(NULL) < 0
+#endif
+ )
elog(LOG, "shmdt(%p) failed: %m", UsedShmemSegAddr);
UsedShmemSegAddr = NULL;
}
}
+
/*
* Attach to shared memory and make sure it has a Postgres header
*
diff --git a/src/backend/port/win32/shmem.c b/src/backend/port/win32/shmem.c
index e3ab1f724de..0048d7554ad 100644
--- a/src/backend/port/win32/shmem.c
+++ b/src/backend/port/win32/shmem.c
@@ -32,7 +32,7 @@ shmat(int memId, void *shmaddr, int flag)
/* TODO -- shmat needs to count # attached to shared mem */
void *lpmem = MapViewOfFileEx((HANDLE) memId,
FILE_MAP_WRITE | FILE_MAP_READ,
- 0, 0, /* (DWORD)pshmdsc->segsize */ s_segsize, shmaddr);
+ 0, 0, /* (DWORD)pshmdsc->segsize */ 0 /* s_segsize */, shmaddr);
if (lpmem == NULL)
{
diff --git a/src/backend/utils/init/findbe.c b/src/backend/utils/init/findbe.c
index 2c8a45703af..2ef63872fa1 100644
--- a/src/backend/utils/init/findbe.c
+++ b/src/backend/utils/init/findbe.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/findbe.c,v 1.40 2003/11/29 19:52:01 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/findbe.c,v 1.41 2004/02/02 00:11:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -205,9 +205,9 @@ FindExec(char *full_path, const char *argv0, const char *binary_name)
{
elog(DEBUG2, "searching PATH for executable");
path = strdup(p); /* make a modifiable copy */
- for (startp = path, endp = strchr(path, ':');
+ for (startp = path, endp = strchr(path, PATHSEP);
startp && *startp;
- startp = endp + 1, endp = strchr(startp, ':'))
+ startp = endp + 1, endp = strchr(startp, PATHSEP))
{
if (startp == endp) /* it's a "::" */
continue;