URI: 
       tVarious tweaks to make things run on Mac OS. The main change is the use of pthread to implement ffork. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit a995e477ffb4dd1184da87e9e46a9e57f3178c63
   DIR parent e182749a982e415fba755bc1035c35da5c4fe606
  HTML Author: rsc <devnull@localhost>
       Date:   Wed,  1 Oct 2003 02:50:57 +0000
       
       Various tweaks to make things run on Mac OS.
       The main change is the use of pthread to implement ffork.
       
       Diffstat:
         M include/lib9.h                      |       8 +++++++-
         M src/cmd/sam/unix.c                  |      36 +++++++++++++++++++++++++++++++
         M src/lib9/Makefile                   |       4 ++--
         M src/lib9/argv0.c                    |       5 +++++
         M src/lib9/await.c                    |       1 +
         M src/lib9/ffork-FreeBSD.c            |       6 ++++++
         M src/lib9/ffork-Linux.c              |       6 ++++++
         M src/lib9/lock.c                     |       7 ++-----
         M src/lib9/sysfatal.c                 |       1 +
         M src/libthread/getpid.c              |       5 ++---
         M src/libthread/label.h               |      15 +++++++++++++++
         M src/libthread/trend.c               |       2 +-
       
       12 files changed, 84 insertions(+), 12 deletions(-)
       ---
   DIR diff --git a/include/lib9.h b/include/lib9.h
       t@@ -46,6 +46,11 @@ extern "C" {
        #                undef _NEEDUINT
        #        endif
        #endif
       +#if defined(__APPLE__)
       +#        include <sys/types.h>
       +#        undef _NEEDUSHORT
       +#        undef _NEEDUINT
       +#endif
        
        typedef signed char schar;
        typedef unsigned int u32int;
       t@@ -213,7 +218,8 @@ extern int                errstr(char*, uint);
        
        /* command line */
        extern char        *argv0;
       -#define        ARGBEGIN        for((argv0||(argv0=*argv)),argv++,argc--;\
       +extern void __fixargv0(void);
       +#define        ARGBEGIN        for((argv0||(argv0=(__fixargv0(),*argv))),argv++,argc--;\
                                    argv[0] && argv[0][0]=='-' && argv[0][1];\
                                    argc--, argv++) {\
                                        char *_args, *_argt;\
   DIR diff --git a/src/cmd/sam/unix.c b/src/cmd/sam/unix.c
       t@@ -270,3 +270,39 @@ int create(char *name, int omode, int perm)
        
            return fd;                          
        }
       +
       +/* SHOULD BE ELSEWHERE */
       +#ifdef __APPLE__
       +#include <lib9.h>
       +
       +Lock plk;
       +
       +ulong
       +pread(int fd, void *buf, ulong n, ulong off)
       +{
       +        ulong rv;
       +
       +        lock(&plk);
       +        if (lseek(fd, off, 0) != off)
       +                return -1;
       +        rv = read(fd, buf, n);
       +        unlock(&plk);
       +
       +        return rv;
       +}
       +
       +ulong
       +pwrite(int fd, void *buf, ulong n, ulong off)
       +{
       +        ulong rv;
       +
       +        lock(&plk);
       +        if (lseek(fd, off, 0) != off)
       +                return -1;
       +        rv = write(fd, buf, n);
       +        unlock(&plk);
       +
       +        return rv;
       +}
       +#endif
       +
   DIR diff --git a/src/lib9/Makefile b/src/lib9/Makefile
       t@@ -19,7 +19,7 @@ OFILES=\
                nrand.$O\
                qlock.$O\
                readn.$O\
       -        rendez.$O\
       +        rendez-$(SYSNAME).$O\
                strecpy.$O\
                sysfatal.$O\
                tas-$(OBJTYPE).$O\
       t@@ -31,7 +31,7 @@ OFILES=\
                werrstr.$O\
        
        HFILES=\
       -        lib9.h\
       +        $(9SRC)/include/lib9.h\
        
        include $(9SRC)/Makesyslib
        
   DIR diff --git a/src/lib9/argv0.c b/src/lib9/argv0.c
       t@@ -2,3 +2,8 @@
        
        char *argv0;
        
       +/*
       + * Mac OS can't deal with files that only declare data.
       + * ARGBEGIN mentions this function so that this file gets pulled in.
       + */
       +void __fixargv0(void) { }
   DIR diff --git a/src/lib9/await.c b/src/lib9/await.c
       t@@ -1,5 +1,6 @@
        #include <signal.h>
        #include <sys/types.h>
       +#include <sys/time.h>
        #include <sys/resource.h>
        #include <sys/wait.h>
        #include <sys/time.h>
   DIR diff --git a/src/lib9/ffork-FreeBSD.c b/src/lib9/ffork-FreeBSD.c
       t@@ -31,3 +31,9 @@ _spinlock(spinlock_t *lk)
                lock((Lock*)&lk->access_lock);
        }
        
       +int
       +getfforkid(void)
       +{
       +        return getpid();
       +}
       +
   DIR diff --git a/src/lib9/ffork-Linux.c b/src/lib9/ffork-Linux.c
       t@@ -37,3 +37,9 @@ ffork(int flags, void (*fn)(void*), void *arg)
                return pid;
        }
        
       +int
       +getfforkid(void)
       +{
       +        return getpid();
       +}
       +
   DIR diff --git a/src/lib9/lock.c b/src/lib9/lock.c
       t@@ -8,12 +8,9 @@ _xtas(void *v)
        {
                int x;
        
       -_ntas++;
       +        _ntas++;
                x = _tas(v);
       -        if(x == 0 || x == 0xCAFEBABE)
       -                return x;
       -        fprint(2, "%d: tas %p got %ux\n", getpid(), v, x);
       -        abort();
       +        return x;
        }
        
        int
   DIR diff --git a/src/lib9/sysfatal.c b/src/lib9/sysfatal.c
       t@@ -14,6 +14,7 @@ sysfatal(char *fmt, ...)
                vseprint(buf, buf+sizeof buf, fmt, arg);
                va_end(arg);
        
       +        __fixargv0();
                fprint(2, "%s; %s\n", argv0 ? argv0 : "<prog>", buf);
                exits("fatal");
        }
   DIR diff --git a/src/libthread/getpid.c b/src/libthread/getpid.c
       t@@ -1,8 +1,7 @@
        #include "threadimpl.h"
       -#include <unistd.h>
       -
       +extern int getfforkid(void);
        int
        _threadgetpid(void)
        {
       -        return getpid();
       +        return getfforkid();
        }
   DIR diff --git a/src/libthread/label.h b/src/libthread/label.h
       t@@ -17,6 +17,21 @@ struct Label
                ulong si;
                ulong di;
        };
       +#elif defined(__APPLE__)
       +struct Label
       +{
       +        ulong        pc;                /* lr */
       +        ulong        cr;                /* mfcr */
       +        ulong        ctr;                /* mfcr */
       +        ulong        xer;                /* mfcr */
       +        ulong        sp;                /* callee saved: r1 */
       +        ulong        toc;                /* callee saved: r2 */
       +        ulong        gpr[19];        /* callee saved: r13-r31 */
       +// XXX: currently do not save vector registers or floating-point state
       +//        ulong        pad;
       +//        uvlong        fpr[18];        /* callee saved: f14-f31 */
       +//        ulong        vr[4*12];        /* callee saved: v20-v31, 256-bits each */
       +};
        #else
        #error "Unknown or unsupported architecture"
        #endif
   DIR diff --git a/src/libthread/trend.c b/src/libthread/trend.c
       t@@ -25,7 +25,7 @@ threadmain(int argc, char **argv)
                c[1] = chancreate(sizeof(ulong), 1);
                c[2] = c[0];
        
       -        threadcreate(pingpong, c, 16384);
       +        proccreate(pingpong, c, 16384);
                threadcreate(pingpong, c+1, 16384);
                sendul(c[0], atoi(argv[1]));
        }