Patch for OSX 10.1 and Postgresql 7.3.1
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) endififeq ($(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); +#endifif (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= awkDLSUFFIX = .so -CFLAGS_SL = -bundle -undefined suppress +CFLAGS_SL = -bundle -flat_namespace -undefined suppress%.so: %.o
$(CC) $(CFLAGS) $(CFLAGS_SL) -o $@ $<
"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