parent
babe3439cc
commit
fc567f476a
11 changed files with 63 additions and 24 deletions
|
|
@ -52,6 +52,4 @@ test:V: tprimes tspawn
|
|||
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
|
||||
|
|
|
|||
|
|
@ -4,24 +4,18 @@ test -f $PLAN9/config && . $PLAN9/config
|
|||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ threadmain(int argc, char **argv)
|
|||
mk(countthread, c, STACK);
|
||||
mk(filterthread, c, STACK);
|
||||
recvp(chancreate(sizeof(void*), 0));
|
||||
threadexitsall(0);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ threadstart(uint y, uint x)
|
|||
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);
|
||||
|
|
@ -114,17 +114,21 @@ threadalloc(void (*fn)(void*), void *arg, uint stack)
|
|||
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 */
|
||||
|
|
@ -141,6 +145,7 @@ threadalloc(void (*fn)(void*), void *arg, uint stack)
|
|||
* 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 */
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ extern int swapcontext(ucontext_t*, ucontext_t*);
|
|||
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.
|
||||
|
|
@ -40,8 +40,10 @@ extern void makecontext(ucontext_t*, void(*)(), int, ...);
|
|||
# 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
|
||||
|
||||
|
|
@ -99,6 +101,15 @@ enum
|
|||
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
|
||||
|
|
@ -116,12 +127,12 @@ struct _Thread
|
|||
_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];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue