Patch for OSX 10.1 and Postgresql 7.3.1

Started by Serge Sozonoffover 24 years ago2 messageshackers
Jump to latest
#1Serge Sozonoff
serge@globalbeach.com

Hi,

It apears that getting Postgres and OSX 10.1 to work is not just a
case of some compiler flags.

I have attached a patch, not sure who wrote this patch, but it seems
to work for me!

I am asuming that the author has submitted it to the pgsql team, but
if not here it is.

Have fun,

Serge

P.S. I give NO guarantees, like I said... I did not write this!

----cut ----

Show quoted text
diff -ru postgresql-7.1.3/src/Makefile.shlib
postgresql-7.1.3-posix/src/Makefile.shlib
--- postgresql-7.1.3/src/Makefile.shlib	Sun Apr 15 05:25:07 2001
+++ postgresql-7.1.3-posix/src/Makefile.shlib	Wed Sep 19 23:00:08 2001
@@ -113,7 +113,7 @@
ifeq ($(PORTNAME), darwin)
shlib			:=
lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
-  LINK.shared		= $(COMPILER) $(CFLAGS_SL)
+  LINK.shared		= $(COMPILER)
endif
ifeq ($(PORTNAME), openbsd)
diff -ru postgresql-7.1.3/src/backend/storage/ipc/ipc.c
postgresql-7.1.3-posix/src/backend/storage/ipc/ipc.c
--- postgresql-7.1.3/src/backend/storage/ipc/ipc.c	Fri Mar 23
05:49:54 2001
+++ postgresql-7.1.3-posix/src/backend/storage/ipc/ipc.c	Wed Sep
19 23:09:06 2001
@@ -29,10 +29,20 @@
#include <sys/types.h>
#include <sys/file.h>
+#define POSIX_SHARED_MEMORY
+#ifdef POSIX_SHARED_MEMORY
+#include <sys/stat.h>
+#include <sys/mman.h>
+#endif
#include <errno.h>
#include <signal.h>
#include <unistd.h>
+#ifdef POSIX_SHARED_MEMORY
+#define IpcMemoryId unsigned int
+#define IpcMemoryKey unsigned int
+#endif
+
#include "storage/ipc.h"
#include "storage/s_lock.h"
/* In Ultrix, sem.h and shm.h must be included AFTER ipc.h */
@@ -77,6 +87,13 @@
static void *PrivateMemoryCreate(uint32 size);
static void PrivateMemoryDelete(int status, Datum memaddr);
+#ifdef POSIX_SHARED_MEMORY
+uint32 posix_shmget(uint32 key, uint32 size, int permissions);
+void *posix_shmat(uint32 id);
+uint32 posix_shm_count(uint32 id);
+void decrement_posix_shm_count(void *address);
+int posix_shmrm(uint32 id);
+#endif
/* ----------------------------------------------------------------
*						exit() handling stuff
@@ -265,6 +282,9 @@
* print out an error and abort.  Other types of errors are not
recoverable.
* ----------------------------------------------------------------
*/
+#ifdef POSIX_SHARED_MEMORY
+#define shmget(a, b, c) posix_shmget(a,b,c)
+#endif
static IpcSemaphoreId
InternalIpcSemaphoreCreate(IpcSemaphoreKey semKey,
int numSems, int
permission,
@@ -620,7 +640,11 @@
on_shmem_exit(IpcMemoryDelete, Int32GetDatum(shmid));
/* OK, should be able to attach to the segment */
+#ifdef POSIX_SHARED_MEMORY
+	memAddress = posix_shmat(shmid);
+#else
memAddress = shmat(shmid, 0, 0);
+#endif
if (memAddress == (void *) -1)
{
@@ -646,10 +670,13 @@
static void
IpcMemoryDetach(int status, Datum shmaddr)
{
+#ifndef POSIX_SHARED_MEMORY
if (shmdt(DatumGetPointer(shmaddr)) < 0)
fprintf(stderr, "IpcMemoryDetach: shmdt(%p) failed:
%s\n",
DatumGetPointer(shmaddr),
strerror(errno));
-
+#else
+	decrement_posix_shm_count(DatumGetPointer(shmaddr));
+#endif
/*
* We used to report a failure via elog(NOTICE), but that's
pretty
* pointless considering any client has long since disconnected
...
@@ -663,10 +690,13 @@
static void
IpcMemoryDelete(int status, Datum shmId)
{
+#ifdef POSIX_SHARED_MEMORY
+	if (posix_shmrm(DatumGetInt32(shmId)) == -1)
+#else
if (shmctl(DatumGetInt32(shmId), IPC_RMID, (struct shmid_ds *)
NULL) < 0)
+#endif
fprintf(stderr, "IpcMemoryDelete: shmctl(%d, %d, 0)
failed: %s\n",
DatumGetInt32(shmId), IPC_RMID,
strerror(errno));
-
/*
* We used to report a failure via elog(NOTICE), but that's
pretty
* pointless considering any client has long since disconnected
...
@@ -679,8 +709,9 @@
bool
SharedMemoryIsInUse(IpcMemoryKey shmKey, IpcMemoryId shmId)
{
+#ifndef POSIX_SHARED_MEMORY
struct shmid_ds shmStat;
-
+#endif
/*
* We detect whether a shared memory segment is in use by seeing
* whether it (a) exists and (b) has any processes are attached
to it.
@@ -689,6 +720,9 @@
* nonexistence of the segment (most likely, because it doesn't
belong
* to our userid), assume it is in use.
*/
+#ifdef POSIX_SHARED_MEMORY
+	return (posix_shm_count(DatumGetInt32(shmId)) != 0);
+#else
if (shmctl(shmId, IPC_STAT, &shmStat) < 0)
{

@@ -706,6 +740,7 @@
if (shmStat.shm_nattch != 0)
return true;
return false;
+#endif
}

@@ -801,9 +836,17 @@
shmid = shmget(NextShmemSegID, sizeof(PGShmemHeader),
0);
if (shmid < 0)
continue; /* failed: must
be some other app's */
+#ifdef POSIX_SHARED_MEMORY
+ memAddress = posix_shmat(shmid);
+#else
memAddress = shmat(shmid, 0, 0);
+#endif
if (memAddress == (void *) -1)
continue; /* failed: must
be some other app's */
+#ifdef POSIX_SHARED_MEMORY
+ if (memAddress == NULL) continue;
+ else break;
+#else
hdr = (PGShmemHeader *) memAddress;
if (hdr->magic != PGShmemMagic)
{
@@ -848,6 +891,7 @@
* same shmem key before we did. Let him have that one,
loop
* around to try next key.
*/
+#endif
}

/*
@@ -966,3 +1010,124 @@

return semId;
}
+
+#ifdef POSIX_SHARED_MEMORY
+
+#define PSM_MAX_SEGS 10
+int psm_initted = 0;
+struct psm_map_ent {
+	int valid;
+	int32 id;
+	void *address;
+	int size;
+	int count;
+	int fd;
+};
+
+struct psm_map_ent map_array[PSM_MAX_SEGS];
+
+uint32 posix_shmget(uint32 key, uint32 size, int permissions)
+{
+int i;
+char name[32];
+
+    /* Initialize structure if not already initted */
+    if (!psm_initted) {
+	for (i=0; i<PSM_MAX_SEGS; i++) {
+	    map_array[i].valid = 0;
+	    map_array[i].id = -1;
+	    map_array[i].address = NULL;
+	    map_array[i].count = 0;
+	    map_array[i].size = 0;
+	    map_array[i].fd = -1;
+	}
+    }
+    for (i=0; i<PSM_MAX_SEGS; i++) {
+	if (!map_array[i].valid) break;
+    }
+    if (map_array[i].valid) return -1;
+
+    /* Here's where we do the real work */
+    sprintf(name, "psm_%d", key);
+    map_array[i].fd = shm_open(name, (O_CREAT | O_RDWR | O_TRUNC),
+	(S_IRUSR | S_IWUSR | S_IWGRP | S_IRGRP));
+    map_array[i].size = size;
+    map_array[i].id = key;
+
+    return i;
+}
+
+void *posix_shmat(uint32 id)
+{
+    int i;
+
+#if 0
+    for (i=0; i<PSM_MAX_SEGS; i++)
+	if (map_array[i].id == id) break;
+
+    if (map_array[i].id == id)
+	return NULL;
+#else
+i = id;
+if (i == -1) return NULL;
+#endif
+
+    map_array[i].address = mmap(NULL, map_array[i].size,
+	(PROT_READ | PROT_WRITE), 
+	(MAP_ANON | MAP_INHERIT | MAP_SHARED), map_array[i].fd, 0);
+    if (map_array[i].address == -1) {
+	perror("posix_shmat");
+	return NULL;
+    }
+    if (map_array[i].address != 0) {
+	map_array[i].valid = 1;
+	map_array[i].count = 1;
+        return (map_array[i].address);
+    } else {
+	return NULL;
+    }
+}
+
+uint32 posix_shm_count(uint32 id) {
+    int i;
+
+#if 0
+    for (i=0; i<PSM_MAX_SEGS; i++) {
+	if (map_array[i].id == id)
+		return map_array[i].count;
+    }
+    return -1;
+#else
+    i = id;
+    if (i == -1) return -1;
+    return map_array[i].count;
+#endif
+}
+
+void decrement_posix_shm_count(void *address)
+{
+    int i;
+
+    for (i=0; i<PSM_MAX_SEGS; i++) {
+	if (map_array[i].address == address) break;
+    }
+
+    if (map_array[i].address == address) {
+	map_array[i].count --;
+    }
+    if (map_array[i].count < 0) {
+	/* This should never happen.... */
+	fprintf(stderr, "AIEEEEEE!  Map count < 0 in
decrement_posix_shm_count!\n");
+    }
+}
+
+int posix_shmrm(uint32 id)
+{
+char name[32];
+
+    sprintf(name, "psm_%d", id);
+
+    return shm_unlink(name);
+}
+
+#endif
diff -ru postgresql-7.1.3/src/makefiles/Makefile.darwin
postgresql-7.1.3-posix/src/makefiles/Makefile.darwin
--- postgresql-7.1.3/src/makefiles/Makefile.darwin	Mon Dec 11
01:49:52 2000
+++ postgresql-7.1.3-posix/src/makefiles/Makefile.darwin	Wed Sep
19 22:59:24 2001
@@ -2,7 +2,7 @@
AWK= awk
DLSUFFIX = .so
-CFLAGS_SL = -bundle -undefined suppress
+CFLAGS_SL = -bundle -flat_namespace -undefined suppress

%.so: %.o
$(CC) $(CFLAGS) $(CFLAGS_SL) -o $@ $<

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Serge Sozonoff (#1)
Re: Patch for OSX 10.1 and Postgresql 7.3.1

"Serge Sozonoff" <serge@globalbeach.com> writes:

I have attached a patch, not sure who wrote this patch, but it seems
to work for me!
I am asuming that the author has submitted it to the pgsql team, but
if not here it is.

It has not been submitted, and it certainly won't get accepted as-is
(it appears to unconditionally insert Darwin-specific code into ipc.c,
and even without that I'm leery of applying patches from unknown
sources). Please find the author and ask him to contact us.

regards, tom lane