diff --git a/src/backend/port/Makefile.in b/src/backend/port/Makefile.in
index 2b3430a05a0c166f70446f3a57a145be19c22a1b..a7c2de98cb06ec05593ea1be97e7a14b586f0402 100644
--- a/src/backend/port/Makefile.in
+++ b/src/backend/port/Makefile.in
@@ -13,7 +13,7 @@
 # be converted to Method 2.  
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/port/Attic/Makefile.in,v 1.27 2000/10/20 21:03:45 petere Exp $
+#    $Header: /cvsroot/pgsql/src/backend/port/Attic/Makefile.in,v 1.28 2000/12/11 00:49:54 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -30,6 +30,10 @@ endif
 ifeq ($(PORTNAME), beos)
 OBJS += beos/SUBSYS.o
 endif
+ifeq ($(PORTNAME), darwin)
+OBJS += darwin/SUBSYS.o
+endif
+
 all: SUBSYS.o
 
 SUBSYS.o: $(OBJS)
@@ -45,11 +49,19 @@ beos/SUBSYS.o: beos.dir
 beos.dir:
 	$(MAKE) -C beos all
 
+darwin/SUBSYS.o: darwin.dir
+
+darwin.dir:
+	$(MAKE) -C darwin all
+
 tas.o: tas.s
 	$(CC) $(CFLAGS) -c $<
 
 distclean clean:
 	rm -f SUBSYS.o $(OBJS)
+	$(MAKE) -C beos clean
+	$(MAKE) -C darwin clean
+	$(MAKE) -C qnx4 clean
 
 depend dep:
 	$(CC) -MM $(CFLAGS) *.c >depend
diff --git a/src/backend/port/darwin/Makefile b/src/backend/port/darwin/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..6696529e5101cb7e3faa618e7448aab9b2193ff2
--- /dev/null
+++ b/src/backend/port/darwin/Makefile
@@ -0,0 +1,30 @@
+#-------------------------------------------------------------------------
+#
+# Makefile--
+#    Makefile for port/darwin
+#
+# IDENTIFICATION
+#    $Header: /cvsroot/pgsql/src/backend/port/darwin/Makefile,v 1.1 2000/12/11 00:49:54 tgl Exp $
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/port/darwin
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = sem.o
+
+all: SUBSYS.o
+
+SUBSYS.o: $(OBJS)
+	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+
+depend dep:
+	$(CC) -MM $(CFLAGS) *.c >depend
+
+clean:
+	rm -f SUBSYS.o $(OBJS)
+
+ifeq (depend,$(wildcard depend))
+include depend
+endif
diff --git a/src/backend/port/darwin/sem.c b/src/backend/port/darwin/sem.c
new file mode 100644
index 0000000000000000000000000000000000000000..c55090cedc2e342c04dbe3a2267736a704610ffc
--- /dev/null
+++ b/src/backend/port/darwin/sem.c
@@ -0,0 +1,374 @@
+/*-------------------------------------------------------------------------
+ *
+ * sem.c
+ *	  System V Semaphore Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ * 
+ * 2000-12-1 pmb@mac.com 
+ *   - changed from anonymous to named semaphores for darwin
+ *   - this required changing sem_info from containig an array of sem_t to an array of sem_t*
+ *
+ * IDENTIFICATION
+ *       $Header: /cvsroot/pgsql/src/backend/port/darwin/Attic/sem.c,v 1.1 2000/12/11 00:49:54 tgl Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include <errno.h>
+#include <semaphore.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include "postgres.h"
+#include "storage/ipc.h"
+#include "storage/proc.h"
+#include "port/darwin/sem.h"
+
+#define SEMMAX  IPC_NMAXSEM
+#define SETMAX ((MAXBACKENDS + SEMMAX - 1) / SEMMAX)
+#define OPMAX	8
+
+#define MODE	0700
+#define SHM_INFO_NAME	"SysV_Sem_Info"
+#define SEM_NAME       "/pgsql-darwin"
+
+struct pending_ops
+{
+	int			op[OPMAX];		/* array of pending operations */
+	int			idx;			/* index of first free array member */
+};
+
+struct sem_info
+{
+       sem_t*          sem;
+	struct
+	{
+		key_t		key;
+		int			nsems;
+               sem_t*          sem[SEMMAX];/* array of POSIX semaphores */
+		struct sem	semV[SEMMAX];		/* array of System V semaphore
+										 * structures */
+		struct pending_ops pendingOps[SEMMAX];	/* array of pending
+												 * operations */
+	}			set[SETMAX];
+};
+
+static struct sem_info *SemInfo = (struct sem_info *) - 1;
+
+
+int
+semctl(int semid, int semnum, int cmd, /* ... */ union semun arg)
+{
+	int			r = 0;
+
+       sem_wait(SemInfo->sem);
+
+	if (semid < 0 || semid >= SETMAX ||
+		semnum < 0 || semnum >= SemInfo->set[semid].nsems)
+	{
+               sem_post(SemInfo->sem);
+		errno = EINVAL;
+		return -1;
+	}
+
+	switch (cmd)
+	{
+		case GETNCNT:
+			r = SemInfo->set[semid].semV[semnum].semncnt;
+			break;
+
+		case GETPID:
+			r = SemInfo->set[semid].semV[semnum].sempid;
+			break;
+
+		case GETVAL:
+			r = SemInfo->set[semid].semV[semnum].semval;
+			break;
+
+		case GETALL:
+			for (semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++)
+				arg.array[semnum] = SemInfo->set[semid].semV[semnum].semval;
+			break;
+
+		case SETVAL:
+			SemInfo->set[semid].semV[semnum].semval = arg.val;
+			break;
+
+		case SETALL:
+			for (semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++)
+				SemInfo->set[semid].semV[semnum].semval = arg.array[semnum];
+			break;
+
+		case GETZCNT:
+			r = SemInfo->set[semid].semV[semnum].semzcnt;
+			break;
+
+		case IPC_RMID:
+			for (semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++)
+			{
+                               if (sem_close(SemInfo->set[semid].sem[semnum]) == -1)
+					r = -1;
+			}
+			SemInfo->set[semid].key = -1;
+			SemInfo->set[semid].nsems = 0;
+			break;
+
+		default:
+                       sem_post(SemInfo->sem);
+			errno = EINVAL;
+			return -1;
+	}
+
+       sem_post(SemInfo->sem);
+
+	return r;
+}
+
+int
+semget(key_t key, int nsems, int semflg)
+{
+	int			fd,
+				semid,
+				semnum /* , semnum1 */ ;
+	int			exist = 0;
+       char                    semname[64];
+
+	if (nsems < 0 || nsems > SEMMAX)
+	{
+#ifdef DEBUG_IPC
+               fprintf(stderr, "darwin semget aborting because nsems out of range. (%d)\n", nsems);
+#endif
+		errno = EINVAL;
+		return -1;
+	}
+
+	/* open and map shared memory */
+	if (SemInfo == (struct sem_info *) - 1)
+	{
+#ifdef DEBUG_IPC
+               fprintf(stderr, "darwin initializing shared mem for semaphore shim.\n");
+#endif
+		/* test if the shared memory already exists */
+		fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE);
+		if (fd == -1 && errno == EEXIST)
+		{
+			exist = 1;
+			fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT, MODE);
+		}
+		if (fd == -1)
+			return fd;
+		/* The size may only be set once. Ignore errors. */
+               ftruncate(fd, sizeof(struct sem_info));
+		SemInfo = mmap(NULL, sizeof(struct sem_info),
+					   PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+		if (SemInfo == MAP_FAILED)
+			return -1;
+		if (!exist)
+		{
+			/* create semaphore for locking */
+                       sprintf(semname, "%s-map", SEM_NAME);
+#ifdef DEBUG_IPC
+                       fprintf(stderr, "darwin creating sem %s to cover shared mem.\n", semname);
+#endif
+                       SemInfo->sem = sem_open(semname, O_CREAT, semflg & 0777, 1);
+                       sem_wait(SemInfo->sem);
+			/* initilize shared memory */
+			memset(SemInfo->set, 0, sizeof(SemInfo->set));
+			for (semid = 0; semid < SETMAX; semid++)
+				SemInfo->set[semid].key = -1;
+                       sem_post(SemInfo->sem);
+		}
+	}
+
+       sem_wait(SemInfo->sem);
+
+	if (key != IPC_PRIVATE)
+	{
+		/* search existing element */
+		semid = 0;
+		while (semid < SETMAX && SemInfo->set[semid].key != key)
+			semid++;
+		if (!(semflg & IPC_CREAT) && semid >= SETMAX)
+		{
+                       sem_post(SemInfo->sem);
+			errno = ENOENT;
+			return -1;
+		}
+		else if (semid < SETMAX)
+		{
+			if (semflg & IPC_CREAT && semflg & IPC_EXCL)
+			{
+                               sem_post(SemInfo->sem);
+				errno = EEXIST;
+				return -1;
+			}
+			else
+			{
+				if (nsems != 0 && SemInfo->set[semid].nsems < nsems)
+				{
+#ifdef DEBUG_IPC
+fprintf(stderr, "darwin semget failed because if (nsems != 0 && SemInfo->set[semid].nsems < nsems) %d %d\n",
+       nsems, SemInfo->set[semid].nsems);
+#endif
+                                       sem_post(SemInfo->sem);
+					errno = EINVAL;
+					return -1;
+				}
+                               sem_post(SemInfo->sem);
+				return semid;
+			}
+		}
+	}
+
+	/* search first free element */
+	semid = 0;
+	while (semid < SETMAX && SemInfo->set[semid].key != -1)
+		semid++;
+	if (semid >= SETMAX)
+	{
+#ifdef DEBUG_IPC
+               fprintf(stderr, "darwin semget failed because all keys were -1 up to SETMAX\n");
+#endif
+               sem_post(SemInfo->sem);
+		errno = ENOSPC;
+		return -1;
+	}
+
+	for (semnum = 0; semnum < nsems; semnum++)
+	{
+               sprintf(semname, "%s-%d-%d", SEM_NAME, semid, semnum);
+#ifdef DEBUG_IPC
+               fprintf(stderr, "darwin creating sem %s to cover set %d num %dm.\n", semname, semid, semnum);
+#endif
+               SemInfo->set[semid].sem[semnum] = sem_open(semname, O_CREAT, semflg & 0777, 0);
+
+/* Currently sem_init always returns -1.
+	if( sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 ) == -1 )	{
+	  for( semnum1 = 0; semnum1 < semnum; semnum1++ )  {
+               sem_close( SemInfo->set[semid].sem[semnum1] );
+	  }
+         sem_post( SemInfo->sem );
+	  return -1;
+	}
+*/
+	}
+
+	SemInfo->set[semid].key = key;
+	SemInfo->set[semid].nsems = nsems;
+
+       sem_post(SemInfo->sem);
+
+	return semid;
+}
+
+int
+semop(int semid, struct sembuf * sops, size_t nsops)
+{
+	int			i,
+				r = 0,
+				r1,
+				errno1 = 0,
+				op;
+
+       sem_wait(SemInfo->sem);
+
+	if (semid < 0 || semid >= SETMAX)
+	{
+               sem_post(SemInfo->sem);
+		errno = EINVAL;
+		return -1;
+	}
+	for (i = 0; i < nsops; i++)
+	{
+		if ( /* sops[i].sem_num < 0 || */ sops[i].sem_num >= SemInfo->set[semid].nsems)
+		{
+                       sem_post(SemInfo->sem);
+			errno = EFBIG;
+			return -1;
+		}
+	}
+
+	for (i = 0; i < nsops; i++)
+	{
+		if (sops[i].sem_op < 0)
+		{
+			if (SemInfo->set[semid].semV[sops[i].sem_num].semval < -sops[i].sem_op)
+			{
+				if (sops[i].sem_flg & IPC_NOWAIT)
+				{
+                                       sem_post(SemInfo->sem);
+					errno = EAGAIN;
+					return -1;
+				}
+				SemInfo->set[semid].semV[sops[i].sem_num].semncnt++;
+				if (SemInfo->set[semid].pendingOps[sops[i].sem_num].idx >= OPMAX)
+				{
+					/* pending operations array overflow */
+                                       sem_post(SemInfo->sem);
+					errno = ERANGE;
+					return -1;
+				}
+				SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx++] = sops[i].sem_op;
+				/* suspend */
+                               sem_post(SemInfo->sem);         /* avoid deadlock */
+                               r1 = sem_wait(SemInfo->set[semid].sem[sops[i].sem_num]);
+                               sem_wait(SemInfo->sem);
+				if (r1)
+				{
+					errno1 = errno;
+					r = r1;
+					/* remove pending operation */
+					SemInfo->set[semid].pendingOps[sops[i].sem_num].op[--SemInfo->set[semid].pendingOps[sops[i].sem_num].idx] = 0;
+				}
+				else
+					SemInfo->set[semid].semV[sops[i].sem_num].semval -= -sops[i].sem_op;
+				SemInfo->set[semid].semV[sops[i].sem_num].semncnt--;
+			}
+			else
+				SemInfo->set[semid].semV[sops[i].sem_num].semval -= -sops[i].sem_op;
+		}
+		else if (sops[i].sem_op > 0)
+		{
+			SemInfo->set[semid].semV[sops[i].sem_num].semval += sops[i].sem_op;
+			op = sops[i].sem_op;
+			while (op > 0 && SemInfo->set[semid].pendingOps[sops[i].sem_num].idx > 0)
+			{					/* operations pending */
+				if (SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx - 1] + op >= 0)
+				{
+					/* unsuspend processes */
+                                       if (sem_post(SemInfo->set[semid].sem[sops[i].sem_num]))
+					{
+						errno1 = errno;
+						r = -1;
+					}
+					/* adjust pending operations */
+					op += SemInfo->set[semid].pendingOps[sops[i].sem_num].op[--SemInfo->set[semid].pendingOps[sops[i].sem_num].idx];
+					SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx] = 0;
+				}
+				else
+				{
+					/* adjust pending operations */
+					SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx - 1] += op;
+					op = 0;
+				}
+			}
+		}
+		else
+			/* sops[i].sem_op == 0 */
+		{
+			/* not supported */
+                       sem_post(SemInfo->sem);
+			errno = ENOSYS;
+			return -1;
+		}
+		SemInfo->set[semid].semV[sops[i].sem_num].sempid = getpid();
+	}
+
+       sem_post(SemInfo->sem);
+
+	errno = errno1;
+	return r;
+}
diff --git a/src/backend/port/dynloader/darwin.c b/src/backend/port/dynloader/darwin.c
index d45e4ad9eaf5efa58058597a45c213eba47295c8..6c149b9f55e0c68a30b8c7f6f23d0da72041b3de 100644
--- a/src/backend/port/dynloader/darwin.c
+++ b/src/backend/port/dynloader/darwin.c
@@ -3,14 +3,14 @@
  * available with a PostgreSQL-compatible license.  Kudos Wilfredo
  * S�nchez <wsanchez@apple.com>.
  *
- * $Header: /cvsroot/pgsql/src/backend/port/dynloader/darwin.c,v 1.3 2000/11/14 21:26:21 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/port/dynloader/darwin.c,v 1.4 2000/12/11 00:49:54 tgl Exp $
  */
 
 #include "postgres.h"
 #include <mach-o/dyld.h>
 #include "dynloader.h"
 
-void *pg_dlopen(const char *filename)
+void *pg_dlopen(char *filename)
 {
 	NSObjectFileImage image;
 
@@ -26,18 +26,26 @@ void pg_dlclose(void *handle)
 	return;
 }
 
-PGFunction pg_dlsym(void *handle, const char *funcname)
+PGFunction pg_dlsym(void *handle, char *funcname)
 {
 	NSSymbol symbol;
 	char *symname = (char*)malloc(strlen(funcname)+2);
 
 	sprintf(symname, "_%s", funcname);
-	symbol = NSLookupAndBindSymbol(symname);
-	free(symname);
-	return (PGFunction) NSAddressOfSymbol(symbol);
+	if (NSIsSymbolNameDefined(symname))
+	{
+		symbol = NSLookupAndBindSymbol(symname);
+		free(symname);
+		return (PGFunction) NSAddressOfSymbol(symbol);
+	}
+	else
+	{
+		free(symname);
+		return (PGFunction)NULL;
+	}
 }
 
-const char *pg_dlerror(void)
+char *pg_dlerror(void)
 {
 	return "no error message available";
 }
diff --git a/src/backend/port/dynloader/darwin.h b/src/backend/port/dynloader/darwin.h
index 36ba3f348862915332ff143355ff09f1b6dcdc31..0e73eb2be67f8f18ea01c730700511984d665cee 100644
--- a/src/backend/port/dynloader/darwin.h
+++ b/src/backend/port/dynloader/darwin.h
@@ -1,8 +1,8 @@
-/* $Header: /cvsroot/pgsql/src/backend/port/dynloader/darwin.h,v 1.2 2000/11/09 19:00:50 petere Exp $ */
+/* $Header: /cvsroot/pgsql/src/backend/port/dynloader/darwin.h,v 1.3 2000/12/11 00:49:54 tgl Exp $ */
 
 #include "fmgr.h"
 
-void	   *pg_dlopen(const char *filename);
-PGFunction	pg_dlsym(void *handle, const char *funcname);
+void*		pg_dlopen(char *filename);
+PGFunction	pg_dlsym(void *handle, char *funcname);
 void		pg_dlclose(void *handle);
-const char *pg_dlerror(void);
+char*		pg_dlerror(void);
diff --git a/src/backend/storage/buffer/s_lock.c b/src/backend/storage/buffer/s_lock.c
index 72b167977d52a387775f4bfa4d0759eaa6a2ba6b..7f658ad26a8bf8977696a8e7f2b7e97cd25e6dfa 100644
--- a/src/backend/storage/buffer/s_lock.c
+++ b/src/backend/storage/buffer/s_lock.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/buffer/Attic/s_lock.c,v 1.26 2000/11/28 23:27:55 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/buffer/Attic/s_lock.c,v 1.27 2000/12/11 00:49:51 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -119,6 +119,35 @@ _success:			\n\
 
 #endif	 /* __m68k__ */
 
+#if defined(__APPLE__) && defined(__ppc__)
+/* used in darwin. */
+/* We key off __APPLE__ here because this function differs from
+ * the LinuxPPC implementation only in compiler syntax. 
+ */
+static void
+tas_dummy()
+{
+       __asm__("               \n\
+               .globl  tas     \n\
+               .globl  _tas    \n\
+_tas:                          \n\
+tas:                           \n\
+               lwarx   r5,0,r3 \n\
+               cmpwi   r5,0    \n\
+               bne     fail    \n\
+               addi    r5,r5,1 \n\
+               stwcx.  r5,0,r3 \n\
+               beq     success \n\
+fail:          li      r3,1    \n\
+               blr             \n\
+success:                       \n\
+               li r3,0         \n\
+               blr             \n\
+	");
+}
+
+#endif  /* __APPLE__ && __ppc__ */
+
 #if defined(__powerpc__)
 /* Note: need a nice gcc constrained asm version so it can be inlined */
 static void
diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c
index 804411bb960e40b3d97453e1e6696d6b40b78b24..ee1bd7aeab1226630ed504b3b1cebcb1d17ac0ee 100644
--- a/src/backend/storage/ipc/ipc.c
+++ b/src/backend/storage/ipc/ipc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.56 2000/12/03 17:18:10 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.57 2000/12/11 00:49:52 tgl Exp $
  *
  * NOTES
  *
@@ -45,14 +45,19 @@
 #ifdef HAVE_KERNEL_OS_H
 #include <kernel/OS.h>
 #endif
-#include "miscadmin.h"
-#include "utils/memutils.h"
-#include "libpq/libpq.h"
 
 #if defined(solaris_sparc)
 #include <sys/ipc.h>
 #endif
 
+#if defined(__darwin__)
+#include "port/darwin/sem.h"
+#endif
+
+#include "miscadmin.h"
+#include "utils/memutils.h"
+#include "libpq/libpq.h"
+
 
 /*
  * This flag is set during proc_exit() to change elog()'s behavior,
diff --git a/src/backend/storage/ipc/spin.c b/src/backend/storage/ipc/spin.c
index a93ae69e0327f71c7920c8b16d64347f5d0c49f9..554eeba797e7a82d358a7d506cb99ed3a1b561c0 100644
--- a/src/backend/storage/ipc/spin.c
+++ b/src/backend/storage/ipc/spin.c
@@ -14,14 +14,14 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/spin.c,v 1.26 2000/11/28 23:27:56 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/spin.c,v 1.27 2000/12/11 00:49:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
 
 #include <errno.h>
-#ifndef HAS_TEST_AND_SET
+#if !defined(HAS_TEST_AND_SET) && defined(HAVE_SYS_SEM_H)
 #include <sys/sem.h>
 #endif
 
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index 0193a7ad2e73746f200a1aa8afa8a713b86897b5..550a43bb54a58822f8e6431fe6e0f96f714922b0 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.84 2000/11/28 23:27:56 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.85 2000/12/11 00:49:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,7 +47,7 @@
  *		This is so that we can support more backends. (system-wide semaphore
  *		sets run out pretty fast.)				  -ay 4/95
  *
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.84 2000/11/28 23:27:56 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.85 2000/12/11 00:49:52 tgl Exp $
  */
 #include "postgres.h"
 
@@ -61,6 +61,10 @@
 #include <sys/sem.h>
 #endif
 
+#if defined(__darwin__)
+#include "port/darwin/sem.h"
+#endif
+
 #include "miscadmin.h"
 
 
@@ -71,6 +75,7 @@
 
 #include "storage/proc.h"
 
+
 void		HandleDeadLock(SIGNAL_ARGS);
 static void ProcFreeAllSemaphores(void);
 static bool GetOffWaitqueue(PROC *);
diff --git a/src/include/port/darwin.h b/src/include/port/darwin.h
index 597b998a017cc949f38938ab861a49a9ef2b7298..5d5072aa550737c61b01aaea10084607189a2d64 100644
--- a/src/include/port/darwin.h
+++ b/src/include/port/darwin.h
@@ -1,5 +1,10 @@
+#define __darwin__  1
+
+#if defined(__ppc__)
 #define HAS_TEST_AND_SET
-#if defined(__powerpc__)
+#endif
+
+#if defined(__ppc__)
 typedef unsigned int slock_t;
 #else
 typedef unsigned char slock_t;
diff --git a/src/include/port/darwin/sem.h b/src/include/port/darwin/sem.h
new file mode 100644
index 0000000000000000000000000000000000000000..9e3e28d646a618dbfe702fddb161a73f1c6de936
--- /dev/null
+++ b/src/include/port/darwin/sem.h
@@ -0,0 +1,75 @@
+/*-------------------------------------------------------------------------
+ *
+ * sem.h
+ *	  System V Semaphore Emulation
+ *
+ * Copyright (c) 1999, repas AEG Automation GmbH
+ *
+ *
+ * IDENTIFICATION
+ *       $Header: /cvsroot/pgsql/src/include/port/darwin/Attic/sem.h,v 1.1 2000/12/11 00:49:53 tgl Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _SYS_SEM_H
+#define _SYS_SEM_H
+
+/* #define DEBUG_IPC here if you want to see the shim in action */
+
+#include <sys/ipc.h>
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+/*
+ *	Semctl Command Definitions.
+ */
+
+#define GETNCNT 3				/* get semncnt */
+#define GETPID	4				/* get sempid */
+#define GETVAL	5				/* get semval */
+#define GETALL	6				/* get all semval's */
+#define GETZCNT 7				/* get semzcnt */
+#define SETVAL	8				/* set semval */
+#define SETALL	9				/* set all semval's */
+
+#ifndef ushort_t
+#define ushort_t unsigned int
+#endif
+
+/*
+ *	There is one semaphore structure for each semaphore in the system.
+ */
+
+	struct sem
+	{
+		ushort_t	semval;		/* semaphore text map address	*/
+		pid_t		sempid;		/* pid of last operation	*/
+		ushort_t	semncnt;	/* # awaiting semval > cval */
+		ushort_t	semzcnt;	/* # awaiting semval = 0	*/
+	};
+
+/*
+ * User semaphore template for semop system calls.
+ */
+
+	struct sembuf
+	{
+		ushort_t	sem_num;	/* semaphore #			*/
+		short		sem_op;		/* semaphore operation		*/
+		short		sem_flg;	/* operation flags		*/
+	};
+
+	extern int	semctl(int semid, int semnum, int cmd, /* ... */ union semun arg);
+	extern int	semget(key_t key, int nsems, int semflg);
+	extern int	semop(int semid, struct sembuf * sops, size_t nsops);
+
+#ifdef __cplusplus
+}
+
+#endif
+
+#endif	 /* _SYS_SEM_H */
diff --git a/src/makefiles/Makefile.darwin b/src/makefiles/Makefile.darwin
index fe167e048dd375837bba7932fa79ede346bb67aa..cfeba7f922f2955579cb665fc6570844fd904b21 100644
--- a/src/makefiles/Makefile.darwin
+++ b/src/makefiles/Makefile.darwin
@@ -1,4 +1,5 @@
 AROPT = cr
+AWK= awk
  
 DLSUFFIX = .so
 CFLAGS_SL = -bundle -undefined suppress
diff --git a/src/template/darwin b/src/template/darwin
index fb99dffb89cd5d9aacb87f469f0ce9eeac174b21..9685f4840a94561acabde95d56550b8e70058dc2 100644
--- a/src/template/darwin
+++ b/src/template/darwin
@@ -1,4 +1,3 @@
-# regular cpp is broken in current development releases
+# -traditional-cpp means "don't use apple's cpp-precomp" on darwin
+# this should change to -no-cpp-precomp when that flag is implemented
 CC="$CC -traditional-cpp"
-# be on safe side while they sort out their compiler
-CFLAGS=-O0