commit - babe3439cc2bb8baa027be65da67d02d980ebb05
commit + fc567f476a9cb381a50a94a355c4e0dd990b2539
blob - 5f18e28fd077f6d9bb7c5d33ee9fb53d421372b2
blob + e9928ca9783670bbcb64f8f07522e4dec1adb186
--- INSTALL
+++ INSTALL
if ./a.out >/dev/null
then
echo " NPTL found."
- echo "SYSVERSION=2.6.x" >$PLAN9/config
+ echo "SYSVERSION=2.6.x" >>$PLAN9/config
else
echo " NPTL not found."
- echo "SYSVERSION=2.4.x" >$PLAN9/config
+ echo "SYSVERSION=2.4.x" >>$PLAN9/config
fi
rm -f ./a.out
fi
+if [ `uname` = Darwin ]; then
+ # On Darwin, uname -m -p cannot be trusted.
+ echo "* Running on Darwin: checking architecture..."
+ rm -f ./a.out
+ gcc lib/darwin-main.c >/dev/null 2>&1
+ case "$(file ./a.out 2>/dev/null)" in
+ *x86_64*)
+ echo " x86-64 found."
+ echo "OBJTYPE=x86_64" >>$PLAN9/config
+ ;;
+ *i386*)
+ echo " i386 found."
+ echo "OBJTYPE=386" >>$PLAN9/config
+ ;;
+ esac
+ rm -f ./a.out
+fi
+
if [ -f LOCAL.config ]; then
echo Using LOCAL.config options:
sed 's/^/ /' LOCAL.config
blob - 7ee8beb46a9103eef9df9c6fc077a47942ba602d
blob + 753797c8f644a115c84ae225b68887732a355491
--- bin/9a
+++ bin/9a
exit 1
fi
+test -f $PLAN9/config && . $PLAN9/config
+
aflags=""
-case "`uname`" in
-Darwin)
- aflags="-arch `arch`"
+case "`uname`-${OBJTYPE:-`uname -m`}" in
+Darwin-*386*)
+ aflags="-arch i386"
+ ;;
+Darwin-*x86_64*)
+ aflags="-arch x86_64"
+ ;;
esac
out=`echo $1 | sed 's/\.s$//;s/$/.o/'`
blob - bfdac4caad400244c61ff54fb5881bcca6515611
blob + 34238e9337ffdfae00a15152a873de903efb9d71
--- bin/9c
+++ bin/9c
*FreeBSD*gcc*) usegcc ;;
*FreeBSD*clang*) useclang ;;
*BSD*) usegcc ;;
+*Darwin-x86_64*) usegcc
+ cflags="$ngflags -g3 -no-cpp-precomp -m64" ;;
*Darwin*) usegcc
cflags="$ngflags -g3 -no-cpp-precomp -m32" ;;
*HP-UX*) cc=${CC9:-cc}; cflags="-g -O -c -Ae" ;;
blob - e3fa3091d4d11cda11e5864e7c5d6200723d41f5
blob + 68d099e39982b0162a7a288c20fb227a4a5c5c38
--- bin/9l
+++ bin/9l
;;
esac
;;
+*Darwin*x86_64*)
+ ld="${CC9:-gcc} -m64"
+ ;;
*Darwin*)
ld="${CC9:-gcc} -m32"
;;
blob - c5e115690a1855c9e2530eb95074c96739aade14
blob + a9ce7b7a7181bc5de84e579aac083cf66607456f
--- src/lib9/ctime.c
+++ src/lib9/ctime.c
char*
asctime(Tm *t)
{
- char *ncp;
+ const char *ncp;
static char cbuf[30];
strcpy(cbuf, "Thu Jan 01 00:00:00 GMT 1970\n");
blob - 99f899cc154023afd44fb17d84107379ed2c1dd1
blob + 9c06f331255a80a702d5f8b95baec5178d2066a9
--- src/libthread/mkfile
+++ src/libthread/mkfile
echo tspawn should take 3 seconds, not 6
$PLAN9/bin/time ./tspawn sleep 3 >/dev/null
-CLEANFILES=p1.txt p2.txt tp1.txt tp2.txt
-
-
+CLEANFILES=p1.txt p2.txt tp1.txt tp2.txt test/*.$O
blob - 32600a7147f767f2bff6080218f39b0b4d1ea209
blob + b136bcf99f189f40be22ff71ed3f443d62073d36
--- src/libthread/sysofiles.sh
+++ src/libthread/sysofiles.sh
tag="$OBJTYPE-$SYSNAME-${SYSVERSION:-`uname -r`}-${CC9:-cc}"
case "$tag" in
-*-Linux-2.6.*)
- echo pthread.o
- ;;
-*-FreeBSD-[5-9].*)
- echo pthread.o
- ;;
-*-Linux-*)
+*-Linux-2.[0-5]*)
# will have to fix this for linux power pc
echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o
;;
-*-FreeBSD-*)
+*-FreeBSD-[0-4].*)
echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o
;;
*-NetBSD-*)
echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o
;;
-*-Darwin-*)
- echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o pthread.o
+*-Darwin-10.[5-6].*)
+ echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME-${OBJTYPE}.o pthread.o
;;
*-OpenBSD-*)
echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o $SYSNAME.o
blob - 56744984bddc4bc5f1ffd7822803e14cf5d8ceed
blob + 77626b6df82a0f5af08dd85ab317743288fda9f6
--- src/libthread/test/tprimes.c
+++ src/libthread/test/tprimes.c
mk(countthread, c, STACK);
mk(filterthread, c, STACK);
recvp(chancreate(sizeof(void*), 0));
+ threadexitsall(0);
}
void
blob - 06230f53fd82f6e09be4c68f59c11fb84c18c2d9
blob + 731a68cbe05f861cd66b5d4e019f8b156e8d6855
--- src/libthread/thread.c
+++ src/libthread/thread.c
z |= y;
t = (_Thread*)z;
-/*print("threadstart %p\n", v); */
+//print("threadstart sp=%p arg=%p startfn=%p t=%p\n", &t, t, t->startfn, t->startarg);
t->startfn(t->startarg);
/*print("threadexits %p\n", v); */
threadexits(nil);
t->stk = (uchar*)(t+1);
t->stksize = stack;
t->id = incref(&threadidref);
+//print("fn=%p arg=%p\n", fn, arg);
t->startfn = fn;
t->startarg = arg;
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
/* do a reasonable initialization */
memset(&t->context.uc, 0, sizeof t->context.uc);
sigemptyset(&zero);
sigprocmask(SIG_BLOCK, &zero, &t->context.uc.uc_sigmask);
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
/* must initialize with current context */
if(getcontext(&t->context.uc) < 0)
sysfatal("threadalloc getcontext: %r");
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
/* call makecontext to do the real work. */
/* leave a few words open on both ends */
* function that takes some number of word-sized variables,
* and on 64-bit machines pointers are bigger than words.
*/
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
z = (ulong)t;
y = z;
z >>= 16; /* hide undefined 32-bit shift from 32-bit compilers */
blob - 8b931ae7597a396888c95c67ef632ce24f0bf5af
blob + 0352d755490329cbcbccf4eb94c90e407e743e68
--- src/libthread/threadimpl.h
+++ src/libthread/threadimpl.h
extern void makecontext(ucontext_t*, void(*)(), int, ...);
#endif
-#if defined(__APPLE__)
+#if defined(__APPLE__) && !defined(__x86_64__)
/*
* OS X before 10.5 (Leopard) does not provide
* swapcontext nor makecontext, so we have to use our own.
# define makecontext libthread_makecontext
# if defined(__i386__)
# include "386-ucontext.h"
-# else
+# elif defined(__power__)
# include "power-ucontext.h"
+# else
+# error "unknown architecture"
# endif
#endif
struct Context
{
ucontext_t uc;
+#ifdef __APPLE__
+ /*
+ * On Snow Leopard, etc., the context routines exist,
+ * so we use them, but apparently they write past the
+ * end of the ucontext_t. Sigh. We put some extra
+ * scratch space here for them.
+ */
+ uchar buf[512];
+#endif
};
struct Execjob
_Thread *allnext;
_Thread *allprev;
Context context;
+ void (*startfn)(void*);
+ void *startarg;
uint id;
uchar *stk;
uint stksize;
int exiting;
- void (*startfn)(void*);
- void *startarg;
Proc *proc;
char name[256];
char state[256];
blob - 076f4e6b4ea40277da2d946dceaed64ae17098ed
blob + c7e9dddec175f0a3ba5a81df066aad9a2a5da772
--- src/mkhdr
+++ src/mkhdr
LIB=
SHORTLIB=9
+<|cat $PLAN9/config 2>/dev/null || true
<|cat $PLAN9/src/mk.$SYSNAME-$OBJTYPE 2>/dev/null || true