commit a995e477ffb4dd1184da87e9e46a9e57f3178c63 from: rsc date: Wed Oct 01 02:50:57 2003 UTC Various tweaks to make things run on Mac OS. The main change is the use of pthread to implement ffork. commit - e182749a982e415fba755bc1035c35da5c4fe606 commit + a995e477ffb4dd1184da87e9e46a9e57f3178c63 blob - dd6244844e1252e3fd7afc531762e58bf569cff5 blob + 42f6f44b66ef6b229141095df0ca3aa7851f6458 --- include/lib9.h +++ include/lib9.h @@ -45,6 +45,11 @@ extern "C" { # undef _NEEDUSHORT # undef _NEEDUINT # endif +#endif +#if defined(__APPLE__) +# include +# undef _NEEDUSHORT +# undef _NEEDUINT #endif typedef signed char schar; @@ -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;\ blob - cc15db44a0ef9e48e8780f6b873e2be6aedaaa5a blob + 205af4cdffe61e512339f4afa3197462db950b76 --- src/cmd/sam/unix.c +++ src/cmd/sam/unix.c @@ -269,4 +269,40 @@ int create(char *name, int omode, int perm) remove(name); return fd; +} + +/* SHOULD BE ELSEWHERE */ +#ifdef __APPLE__ +#include + +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 + blob - 5f8e5aee35c2a4d73191271d74fd3beda71d6a6f blob + ab694858f7dc0cc95ef6472ceb58f1eefb1e4192 --- src/lib9/Makefile +++ src/lib9/Makefile @@ -19,7 +19,7 @@ OFILES=\ nrand.$O\ qlock.$O\ readn.$O\ - rendez.$O\ + rendez-$(SYSNAME).$O\ strecpy.$O\ sysfatal.$O\ tas-$(OBJTYPE).$O\ @@ -31,7 +31,7 @@ OFILES=\ werrstr.$O\ HFILES=\ - lib9.h\ + $(9SRC)/include/lib9.h\ include $(9SRC)/Makesyslib blob - 2c846f4d327ad54b84d43c80b83d64301fc2e4c7 blob + 4c61f444c257edc8bfca86f01a5c3257d196b46e --- src/lib9/argv0.c +++ src/lib9/argv0.c @@ -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) { } blob - 9df7faa5c2264e487ec01e0af2fc1b2a07095023 blob + 49160e766c82011c3d1a63295d944a3859e92ccf --- src/lib9/await.c +++ src/lib9/await.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include blob - a7c82e64f738cdf70832c9be47174caf41825ef9 blob + 3829bb2da26a35fab2f9df843484b465f677f298 --- src/lib9/ffork-FreeBSD.c +++ src/lib9/ffork-FreeBSD.c @@ -31,3 +31,9 @@ _spinlock(spinlock_t *lk) lock((Lock*)&lk->access_lock); } +int +getfforkid(void) +{ + return getpid(); +} + blob - aad80041b642d79660e98eca92d1d26c9a7a74c4 blob + 3b5c8ee08551eb4385c35fff40f3541ab2108b30 --- src/lib9/ffork-Linux.c +++ src/lib9/ffork-Linux.c @@ -37,3 +37,9 @@ ffork(int flags, void (*fn)(void*), void *arg) return pid; } +int +getfforkid(void) +{ + return getpid(); +} + blob - 2da736267cbb850d21146c975baea983fcd9d76c blob + 5d6f2f3e154a56e67cc612b6923393708ad3197e --- src/lib9/lock.c +++ src/lib9/lock.c @@ -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 blob - f9ab69857f6937cc159358ee31fbaa07121afbab blob + 33a533b8391aff2fdc1b9bb6c65585dbbb238650 --- src/lib9/sysfatal.c +++ src/lib9/sysfatal.c @@ -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 : "", buf); exits("fatal"); } blob - da03bd3f7a6ddbab22edc7f977cedf1b5268fba9 blob + c4d23dad8abb84ab9cdf405f23d776b620cfdcc4 --- src/libthread/getpid.c +++ src/libthread/getpid.c @@ -1,8 +1,7 @@ #include "threadimpl.h" -#include - +extern int getfforkid(void); int _threadgetpid(void) { - return getpid(); + return getfforkid(); } blob - 0c9f3030b5f7526220c8549c100f28335a7d2abd blob + a1f6fa5ab0ee28a816347213e0ee5cca842d6831 --- src/libthread/label.h +++ src/libthread/label.h @@ -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 blob - 6f8adcd5087fadf08f2e8a34e60de4d9fa1bff2e blob + 1ccf1a7968f29bc5c94e3923546c9b30036d7767 --- src/libthread/trend.c +++ src/libthread/trend.c @@ -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])); }