URI:
       tChanges for Mac OS X.  Most important is stack sizes in samterm, which were completely bogus.  (Libthread used to ignore them but not anymore.  Maybe we really should ignore them, but that breaks Venti, which needs *really* big stacks.) - 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 912fba95e74c7631352bc5007249d75e720bbcdf
   DIR parent 2db9e4821d8ae4889e63e5bb205b04eccb7af405
  HTML Author: rsc <devnull@localhost>
       Date:   Mon, 24 Nov 2003 22:39:06 +0000
       
       Changes for Mac OS X.  Most important is stack sizes in samterm,
       which were completely bogus.  (Libthread used to ignore them but
       not anymore.  Maybe we really should ignore them, but that breaks
       Venti, which needs *really* big stacks.)
       
       Diffstat:
         M src/cmd/rm.c                        |       2 +-
         M src/cmd/sam/sam.h                   |       1 +
         M src/cmd/samterm/mkfile              |       2 +-
         M src/cmd/samterm/plan9.c             |       8 +++++---
         M src/cmd/venti/mkfile                |       2 +-
         M src/lib9/await.c                    |       2 +-
         M src/lib9/dirread.c                  |      13 ++++++++-----
         M src/lib9/ffork-pthread.c            |       4 +++-
         M src/lib9/mkfile                     |       1 -
         M src/lib9/tas-PowerMacintosh.c       |       4 ++--
         M src/libdraw/mkfile                  |       4 ++--
         M src/libthread/channel.c             |       2 +-
         M src/libthread/exec-unix.c           |      16 +++++++++++++---
         M src/libthread/rendez.c              |       4 ++--
         M src/libthread/sched.c               |       2 ++
         M src/mkhdr                           |       1 +
         M src/mksyslib                        |       4 ++--
       
       17 files changed, 46 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/src/cmd/rm.c b/src/cmd/rm.c
       t@@ -6,7 +6,7 @@
        char        errbuf[ERRMAX];
        int        ignerr = 0;
        
       -void
       +static void
        err(char *f)
        {
                if(!ignerr){
   DIR diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h
       t@@ -16,6 +16,7 @@
        #define        TRUE                1
        #define        FALSE                0
        
       +#undef INFINITY        /* Darwin declares this as HUGE_VAL */
        #define        INFINITY        0x7FFFFFFFL
        #define        INCR                25
        #define        STRSIZE                (2*BLOCKSIZE)
   DIR diff --git a/src/cmd/samterm/mkfile b/src/cmd/samterm/mkfile
       t@@ -25,6 +25,6 @@ CFLAGS=$CFLAGS -I../sam
        LDFLAGS=$LDFLAGS -lframe -ldraw -lthread -l9 -lregexp9 \
                -lbio -lfmt -lutf -L$X11/lib -lX11 -lm
        
       -o.samterm: $PLAN9/lib/libdraw.a
       +o.samterm: $PLAN9/lib/libframe.a $PLAN9/lib/libdraw.a $PLAN9/lib/libthread.a
        
        <$PLAN9/src/mkone
   DIR diff --git a/src/cmd/samterm/plan9.c b/src/cmd/samterm/plan9.c
       t@@ -15,6 +15,8 @@
        
        static char *exname;
        
       +#define STACK 8192
       +
        void
        getscreen(int argc, char **argv)
        {
       t@@ -163,7 +165,7 @@ extstart(void)
                plumbc = chancreate(sizeof(int), 0);
                arg[0] = plumbc;
                arg[1] = (void*)fd;
       -        proccreate(extproc, arg, 8192);
       +        proccreate(extproc, arg, STACK);
                atexit(removeextern);
        }
        
       t@@ -256,7 +258,7 @@ plumbstart(void)
                }
                arg[0] =plumbc;
                arg[1] = &fd;
       -        proccreate(plumbproc, arg, 4096);
       +        proccreate(plumbproc, arg, STACK);
                return 1;
        }
        #endif
       t@@ -293,5 +295,5 @@ void
        hoststart(void)
        {
                hostc = chancreate(sizeof(int), 0);
       -        proccreate(hostproc, hostc, 1024);
       +        proccreate(hostproc, hostc, STACK);
        }
   DIR diff --git a/src/cmd/venti/mkfile b/src/cmd/venti/mkfile
       t@@ -72,7 +72,7 @@ it:V: all
        <$PLAN9/src/mkmany
        
        $SLIB: $LIBOFILES
       -        ar rvc $SLIB $LIBOFILES
       +        $AR rvc $SLIB $LIBOFILES
        
        # xml.c:D:        mkxml dat.h
        #         ./mkxml dat.h > xml.c
   DIR diff --git a/src/lib9/await.c b/src/lib9/await.c
       t@@ -4,9 +4,9 @@
        
        #include <signal.h>
        #include <sys/types.h>
       +#include <sys/time.h>
        #include <sys/resource.h>
        #include <sys/wait.h>
       -#include <sys/time.h>
        
        static struct {
                int sig;
   DIR diff --git a/src/lib9/dirread.c b/src/lib9/dirread.c
       t@@ -11,12 +11,16 @@
        
        extern int _p9dir(struct stat*, char*, Dir*, char**, char*);
        
       -#if !defined(_HAVEGETDENTS) && defined(_HAVEGETDIRENTRIES)
       +/* everyone has getdirentries, just use that */
        static int
       -getdents(int fd, char *buf, int n)
       +mygetdents(int fd, char *buf, int n)
        {
                ssize_t nn;
       +#if _GETDIRENTRIES_TAKES_LONG
       +        long off;
       +#else
                off_t off;
       +#endif
        
                off = seek(fd, 0, 1);
                nn = getdirentries(fd, buf, n, &off);
       t@@ -24,7 +28,6 @@ getdents(int fd, char *buf, int n)
                        seek(fd, off, 0);
                return nn;
        }
       -#endif
        
        static int
        countde(char *p, int n)
       t@@ -123,7 +126,7 @@ dirread(int fd, Dir **dp)
                if(buf == nil)
                        return -1;
        
       -        n = getdents(fd, (void*)buf, st.st_blksize);
       +        n = mygetdents(fd, (void*)buf, st.st_blksize);
                if(n < 0){
                        free(buf);
                        return -1;
       t@@ -156,7 +159,7 @@ dirreadall(int fd, Dir **d)
                                return -1;
                        }
                        buf = nbuf;
       -                n = getdents(fd, (void*)(buf+ts), st.st_blksize);
       +                n = mygetdents(fd, (void*)(buf+ts), st.st_blksize);
                        if(n <= 0)
                                break;
                        ts += n;
   DIR diff --git a/src/lib9/ffork-pthread.c b/src/lib9/ffork-pthread.c
       t@@ -1,4 +1,6 @@
       -#include <lib9.h>
       +#define NOPLAN9DEFINES
       +#include <u.h>
       +#include <libc.h>
        #include <pthread.h>
        
        extern int __isthreaded;
   DIR diff --git a/src/lib9/mkfile b/src/lib9/mkfile
       t@@ -38,7 +38,6 @@ OFILES=\
                getuser.$O\
                getwd.$O\
                jmp.$O\
       -        jmp-$SYSNAME.$O\
                lock.$O\
                main.$O\
                malloctag.$O\
   DIR diff --git a/src/lib9/tas-PowerMacintosh.c b/src/lib9/tas-PowerMacintosh.c
       t@@ -6,7 +6,7 @@
         * r3 contains return value upon return.
         */
        int
       -_tas(void *x)
       +_tas(int *x)
        {
                int     v;
                /*
       t@@ -36,7 +36,7 @@ _tas(void *x)
                switch(v) {
                case 0:                return 0;
                case 0xdeaddead: return 1;
       -        default:        print("tas: corrupted 0x%lux\n", v);
       +        default:        fprint(2, "tas: corrupted 0x%lux\n", v);
                }
                return 0;
        }
   DIR diff --git a/src/libdraw/mkfile b/src/libdraw/mkfile
       t@@ -119,6 +119,6 @@ CFLAGS=$CFLAGS -I$X11/include
        
        <$PLAN9/src/mksyslib
        
       -test: test.o $LIB
       -        gcc -o test test.o -L$PLAN9 -ldraw -l9 -lfmt -lutf -L$X11/lib -lX11 -lm
       +test: test.o $PLAN9/lib/$LIB
       +        gcc -o test test.o -L$PLAN9/lib -ldraw -l9 -lfmt -lutf -L$X11/lib -lX11 -lm
        
   DIR diff --git a/src/libthread/channel.c b/src/libthread/channel.c
       t@@ -359,7 +359,7 @@ enqueue(Alt *a, Channel **c)
        {
                int i;
        
       -        _threaddebug(DBGCHAN, "Queuing alt %p on channel %p", a, a->c);
       +        _threaddebug(DBGCHAN, "Queueing alt %p on channel %p", a, a->c);
                a->tag = c;
                i = emptyentry(a->c);
                a->c->qentry[i] = a;
   DIR diff --git a/src/libthread/exec-unix.c b/src/libthread/exec-unix.c
       t@@ -16,6 +16,7 @@ procexec(Channel *pidc, char *prog, char *args[])
                if(p->threads.head != t || p->threads.head->nextt != nil){
                        werrstr("not only thread in proc");
                Bad:
       +                _threaddebug(DBGEXEC, "procexec bad %r");
                        if(pidc)
                                sendul(pidc, ~0);
                        return;
       t@@ -35,6 +36,8 @@ procexec(Channel *pidc, char *prog, char *args[])
                 */
                if(pipe(p->exec.fd) < 0)
                        goto Bad;
       +        if(fcntl(p->exec.fd[0], F_SETFD, 1) < 0)
       +                goto Bad;
                if(fcntl(p->exec.fd[1], F_SETFD, 1) < 0)
                        goto Bad;
        
       t@@ -57,6 +60,7 @@ procexec(Channel *pidc, char *prog, char *args[])
                if(pidc)
                        sendul(pidc, t->ret);
        
       +        _threaddebug(DBGEXEC, "procexec schedexecwait");
                /* wait for exec'ed program, then exit */
                _schedexecwait();
        }
       t@@ -105,8 +109,7 @@ efork(void *ve)
                Execargs *e;
        
                e = ve;
       -        _threaddebug(DBGEXEC, "_schedexec %s", e->prog);
       -        close(e->fd[0]);
       +        _threaddebug(DBGEXEC, "_schedexec %s -- calling execv", e->prog);
                execv(e->prog, e->args);
                _threaddebug(DBGEXEC, "_schedexec failed: %r");
                rerrstr(buf, sizeof buf);
       t@@ -120,5 +123,12 @@ efork(void *ve)
        int
        _schedexec(Execargs *e)
        {
       -        return ffork(RFFDG|RFPROC|RFMEM, efork, e);
       +        int pid;
       +
       +        pid = fork();
       +        if(pid == 0){
       +                efork(e);
       +                _exit(1);
       +        }
       +        return pid;
        }
   DIR diff --git a/src/libthread/rendez.c b/src/libthread/rendez.c
       t@@ -52,12 +52,12 @@ _threadnrendez++;
                t->rendval = val;
                t->rendhash = *l;
                *l = t;
       -        t->nextstate = Rendezvous;
                ++nrendez;
                if(nrendez > _threadhighnrendez)
                        _threadhighnrendez = nrendez;
       -        _threaddebug(DBGREND, "Rendezvous for tag %lud", t->rendtag);
       +        _threaddebug(DBGREND, "Rendezvous for tag %lud (m=%d)", t->rendtag, t->moribund);
                unlock(&_threadrgrp.lock);
       +        t->nextstate = Rendezvous;
                _sched();
                t->inrendez = 0;
                _threaddebug(DBGREND, "Woke after rendezvous; val is %lud", t->rendval);
   DIR diff --git a/src/libthread/sched.c b/src/libthread/sched.c
       t@@ -41,6 +41,8 @@ _schedinit(void *arg)
                if((t=p->thread) != nil){
                        p->thread = nil;
                        if(t->moribund){
       +                        if(t->moribund != 1)
       +                                fprint(2, "moribund %d\n", t->moribund);
                                assert(t->moribund == 1);
                                t->state = Dead;
                                if(t->prevt)
   DIR diff --git a/src/mkhdr b/src/mkhdr
       t@@ -5,6 +5,7 @@ X11=/usr/X11R6
        CC=9c
        LD=9l
        AS=9a
       +AR=9ar
        CFLAGS=
        LDFLAGS=
        AFLAGS=
   DIR diff --git a/src/mksyslib b/src/mksyslib
       t@@ -1,10 +1,10 @@
        default:V:        $PLAN9/lib/$LIB
        
        $PLAN9/lib/$LIB:V:        $OFILES                        # force archive even when not needed
       -        ar rvc $PLAN9/lib/$LIB $newprereq
       +        $AR rvc $PLAN9/lib/$LIB $newprereq
        
        &:n:        &.$O
       -        ar rvc $LIB $stem.$O
       +        $AR rvc $PLAN9/lib/$LIB $stem.$O
        
        all install:V: $PLAN9/lib/$LIB