]> granicus.if.org Git - postgresql/commitdiff
First test of Darwin port with POSIX semaphore code.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 5 May 2002 01:03:26 +0000 (01:03 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 5 May 2002 01:03:26 +0000 (01:03 +0000)
src/backend/port/darwin/Makefile
src/backend/port/darwin/README
src/backend/port/darwin/sem.c [deleted file]
src/backend/port/posix_sema.c

index 898fb627e366f8bceb528932621e00f0debbeabd..2c72ab31d3861fe65ac7f7af6a8920009fe7e28b 100644 (file)
@@ -4,7 +4,7 @@
 #    Makefile for port/darwin
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/port/darwin/Makefile,v 1.2 2001/11/08 04:24:03 tgl Exp $
+#    $Header: /cvsroot/pgsql/src/backend/port/darwin/Makefile,v 1.3 2002/05/05 01:03:26 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -12,7 +12,7 @@ subdir = src/backend/port/darwin
 top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 
-OBJS = sem.o system.o
+OBJS = system.o
 
 all: SUBSYS.o
 
index 1a056bd5149922463a0877ba4102719a5e85c4dd..1c160654a4132556161cb0046eafc25e6bcf6bb4 100644 (file)
@@ -16,23 +16,11 @@ Radar Bug#s 2767956, 2683531, 2805147.  One hopes we can retire this
 kluge in the not too distant future.
 
 
-As of PostgreSQL 7.2 and Mac OS X 10.1, one should expect warnings
+As of PostgreSQL 7.3 and Mac OS X 10.1, one should expect warnings
 like these while linking the backend:
 
 /usr/bin/ld: warning unused multiple definitions of symbol _system
 port/SUBSYS.o definition of _system in section (__TEXT,__text)
 /usr/lib/libm.dylib(system.o) unused definition of _system
-/usr/bin/ld: warning unused multiple definitions of symbol _semctl
-port/SUBSYS.o definition of _semctl in section (__TEXT,__text)
-/usr/lib/libm.dylib(semctl.o) unused definition of _semctl
-/usr/bin/ld: warning unused multiple definitions of symbol _semget
-port/SUBSYS.o definition of _semget in section (__TEXT,__text)
-/usr/lib/libm.dylib(semget.o) unused definition of _semget
-/usr/bin/ld: warning unused multiple definitions of symbol _semop
-port/SUBSYS.o definition of _semop in section (__TEXT,__text)
-/usr/lib/libm.dylib(semop.o) unused definition of _semop
 
-The first of these shows us overriding system() per the above-described
-hack.  The rest show sem.c overriding the nonfunctional semaphore stubs
-in libc.  (Perhaps sem.c can also be retired someday, but semget support
-is reportedly not high on Apple's to-do list.)
+These are due to overriding system() per the above-described hack.
diff --git a/src/backend/port/darwin/sem.c b/src/backend/port/darwin/sem.c
deleted file mode 100644 (file)
index abb52c0..0000000
+++ /dev/null
@@ -1,389 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * 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.5 2001/10/25 05:49:40 momjian Exp $
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include <errno.h>
-#include <semaphore.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-
-#include "miscadmin.h"
-#include "storage/ipc.h"
-#include "storage/proc.h"
-#include "port/darwin/sem.h"
-
-#define SEMMAX IPC_NMAXSEM
-#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_set_info
-{
-       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 */
-};
-
-struct sem_info
-{
-       sem_t      *sem;
-       int                     nsets;
-       /* there are actually nsets of these: */
-       struct sem_set_info set[1]; /* VARIABLE LENGTH ARRAY */
-};
-
-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 >= SemInfo->nsets ||
-               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,
-                               nsets;
-       int                     exist = 0;
-       Size            sem_info_size;
-       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; */
-                       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. */
-               nsets = PROC_SEM_MAP_ENTRIES(MaxBackends);
-               sem_info_size = sizeof(struct sem_info) + (nsets - 1) * sizeof(struct sem_set_info);
-               ftruncate(fd, sem_info_size);
-               SemInfo = mmap(NULL, sem_info_size,
-                                          PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-               if (SemInfo == MAP_FAILED)
-                       return -1;
-               if (!exist)
-               {
-                       /* initialize shared memory */
-                       memset(SemInfo, 0, sem_info_size);
-                       SemInfo->nsets = nsets;
-                       for (semid = 0; semid < nsets; semid++)
-                               SemInfo->set[semid].key = -1;
-                       /* 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_unlink(semname);
-               }
-       }
-
-       sem_wait(SemInfo->sem);
-       nsets = SemInfo->nsets;
-
-       if (key != IPC_PRIVATE)
-       {
-               /* search existing element */
-               semid = 0;
-               while (semid < nsets && SemInfo->set[semid].key != key)
-                       semid++;
-               if (!(semflg & IPC_CREAT) && semid >= nsets)
-               {
-                       sem_post(SemInfo->sem);
-                       errno = ENOENT;
-                       return -1;
-               }
-               else if (semid < nsets)
-               {
-                       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 < nsets && SemInfo->set[semid].key != -1)
-               semid++;
-       if (semid >= nsets)
-       {
-#ifdef DEBUG_IPC
-               fprintf(stderr, "darwin semget failed because all keys were -1\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);
-               sem_unlink(semname);
-
-               /* Currently sem_init always returns -1. */
-#ifdef NOT_USED
-               if (sem_init(&SemInfo->set[semid].sem[semnum], 1, 0) == -1)
-               {
-                       int                     semnum1;
-
-                       for (semnum1 = 0; semnum1 < semnum; semnum1++)
-                               sem_close(SemInfo->set[semid].sem[semnum1]);
-                       sem_post(SemInfo->sem);
-                       return -1;
-               }
-#endif
-       }
-
-       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 >= SemInfo->nsets)
-       {
-               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;
-}
index 1dd02f8def6d771dbd78182ff2e5c1d5cfe1b03f..2c32421e8d77615ae8e4d976b048e671594d3413 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/port/posix_sema.c,v 1.1 2002/05/05 00:03:28 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/port/posix_sema.c,v 1.2 2002/05/05 01:03:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,6 +21,8 @@
 #include <signal.h>
 #include <unistd.h>
 
+#include "miscadmin.h"
+#include "storage/ipc.h"
 #include "storage/pg_sema.h"
 
 
@@ -70,7 +72,7 @@ PosixSemaphoreCreate(void)
 
                mySem = sem_open(semname, O_CREAT | O_EXCL,
                                                 (mode_t) IPCProtection, (unsigned) 1);
-               if (mySem != SEM_FAILED)
+               if (mySem != (sem_t *) SEM_FAILED)
                        break;
 
                /* Loop if error indicates a collision */