diff --git a/src/backend/port/darwin/sem.c b/src/backend/port/darwin/sem.c
index c55090cedc2e342c04dbe3a2267736a704610ffc..7dc7b0c919402fbc715d80dbbbbe1ab76c13ffe8 100644
--- a/src/backend/port/darwin/sem.c
+++ b/src/backend/port/darwin/sem.c
@@ -10,7 +10,7 @@
  *   - 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 $
+ *       $Header: /cvsroot/pgsql/src/backend/port/darwin/Attic/sem.c,v 1.2 2001/01/17 22:11:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -155,11 +155,13 @@ semget(key_t key, int nsems, int semflg)
 		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);
+/* 			exist = 1; */
+			shm_unlink(SHM_INFO_NAME);
+			fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE);
 		}
 		if (fd == -1)
 			return fd;
+		shm_unlink(SHM_INFO_NAME);
 		/* The size may only be set once. Ignore errors. */
                ftruncate(fd, sizeof(struct sem_info));
 		SemInfo = mmap(NULL, sizeof(struct sem_info),
@@ -174,6 +176,7 @@ semget(key_t key, int nsems, int semflg)
                        fprintf(stderr, "darwin creating sem %s to cover shared mem.\n", semname);
 #endif
                        SemInfo->sem = sem_open(semname, O_CREAT, semflg & 0777, 1);
+                       sem_unlink(semname);
                        sem_wait(SemInfo->sem);
 			/* initilize shared memory */
 			memset(SemInfo->set, 0, sizeof(SemInfo->set));
@@ -244,6 +247,7 @@ fprintf(stderr, "darwin semget failed because if (nsems != 0 && SemInfo->set[sem
                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);
+               sem_unlink(semname);
 
 /* Currently sem_init always returns -1.
 	if( sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 ) == -1 )	{