]> granicus.if.org Git - postgresql/commitdiff
Darwin porting patches from Peter Bierman <bierman@apple.com>
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Dec 2000 00:49:54 +0000 (00:49 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Dec 2000 00:49:54 +0000 (00:49 +0000)
13 files changed:
src/backend/port/Makefile.in
src/backend/port/darwin/Makefile [new file with mode: 0644]
src/backend/port/darwin/sem.c [new file with mode: 0644]
src/backend/port/dynloader/darwin.c
src/backend/port/dynloader/darwin.h
src/backend/storage/buffer/s_lock.c
src/backend/storage/ipc/ipc.c
src/backend/storage/ipc/spin.c
src/backend/storage/lmgr/proc.c
src/include/port/darwin.h
src/include/port/darwin/sem.h [new file with mode: 0644]
src/makefiles/Makefile.darwin
src/template/darwin

index 2b3430a05a0c166f70446f3a57a145be19c22a1b..a7c2de98cb06ec05593ea1be97e7a14b586f0402 100644 (file)
@@ -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 (file)
index 0000000..6696529
--- /dev/null
@@ -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 (file)
index 0000000..c55090c
--- /dev/null
@@ -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;
+}
index d45e4ad9eaf5efa58058597a45c213eba47295c8..6c149b9f55e0c68a30b8c7f6f23d0da72041b3de 100644 (file)
@@ -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";
 }
index 36ba3f348862915332ff143355ff09f1b6dcdc31..0e73eb2be67f8f18ea01c730700511984d665cee 100644 (file)
@@ -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);
index 72b167977d52a387775f4bfa4d0759eaa6a2ba6b..7f658ad26a8bf8977696a8e7f2b7e97cd25e6dfa 100644 (file)
@@ -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
index 804411bb960e40b3d97453e1e6696d6b40b78b24..ee1bd7aeab1226630ed504b3b1cebcb1d17ac0ee 100644 (file)
@@ -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
  *
 #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,
index a93ae69e0327f71c7920c8b16d64347f5d0c49f9..554eeba797e7a82d358a7d506cb99ed3a1b561c0 100644 (file)
  *
  *
  * 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
 
index 0193a7ad2e73746f200a1aa8afa8a713b86897b5..550a43bb54a58822f8e6431fe6e0f96f714922b0 100644 (file)
@@ -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"
 
 #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 *);
index 597b998a017cc949f38938ab861a49a9ef2b7298..5d5072aa550737c61b01aaea10084607189a2d64 100644 (file)
@@ -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 (file)
index 0000000..9e3e28d
--- /dev/null
@@ -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 */
index fe167e048dd375837bba7932fa79ede346bb67aa..cfeba7f922f2955579cb665fc6570844fd904b21 100644 (file)
@@ -1,4 +1,5 @@
 AROPT = cr
+AWK= awk
  
 DLSUFFIX = .so
 CFLAGS_SL = -bundle -undefined suppress
index fb99dffb89cd5d9aacb87f469f0ce9eeac174b21..9685f4840a94561acabde95d56550b8e70058dc2 100644 (file)
@@ -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