commit - e317e37406f8597d42c1e37ab7fcc4f7f901b342
commit + 73722a8bbf80f47ea2df2a212516d1b857ffe29a
blob - 3c9614e60c8b6059218f42caf6d7a785be17ca64
blob + c8c96796428ae85fb94b89c32d765b7ce403dc4d
--- src/libthread/channel.c
+++ src/libthread/channel.c
Channel *c;
c = malloc(sizeof *c+bufsize*elemsize);
+ if(c == nil)
+ sysfatal("chancreate malloc: %r");
memset(c, 0, sizeof *c);
c->elemsize = elemsize;
c->bufsize = bufsize;
blob - 8ca8f8f1edd17ec70f1b88783b68ebf6621fadb5
blob + 6540605d373cdf3efbbe70b2baad09a828ebbd2b
--- src/libthread/pthread.c
+++ src/libthread/pthread.c
}
}
+static void
+startprocfn(void *v)
+{
+ void **a;
+ void (*fn)(void*);
+ Proc *p;
+
+ a = (void**)v;
+ fn = a[0];
+ p = a[1];
+ free(a);
+ p->tid = pthread_self();
+ pthread_detach(p->tid);
+
+ (*fn)(p);
+
+ pthread_exit(0);
+}
+
void
-_procstart(Proc *p, void (*fn)(void*))
+_procstart(Proc *p, void (*fn)(Proc*))
{
-//print("pc\n");
- if(pthread_create(&p->tid, nil, (void*(*)(void*))fn, p) < 0){
-//print("pc1\n");
+ void **a;
+
+ a = malloc(2*sizeof a[0]);
+ if(a == nil)
+ sysfatal("_procstart malloc: %r");
+ a[0] = fn;
+ a[1] = p;
+
+ if(pthread_create(&p->tid, nil, (void*(*)(void*))startprocfn, (void*)a) < 0){
fprint(2, "pthread_create: %r\n");
abort();
}
-//print("pc2\n");
}
static pthread_key_t prockey;
blob - 4d02bcb8848a72079cd0ea60cba988f38fbaa52b
blob + 158f6e9c708c43d73b00c5e1530c86217df75664
--- src/libthread/thread.c
+++ src/libthread/thread.c
static void addthreadinproc(Proc*, _Thread*);
static void delthreadinproc(Proc*, _Thread*);
static void contextswitch(Context *from, Context *to);
-static void scheduler(void*);
+static void scheduler(Proc*);
static _Thread*
getthreadnow(void)
Proc *p;
p = malloc(sizeof *p);
+ if(p == nil)
+ sysfatal("procalloc malloc: %r");
memset(p, 0, sizeof *p);
lock(&threadnproclock);
threadnproc++;
/* allocate the task and stack together */
t = malloc(sizeof *t+stack);
+ if(t == nil)
+ sysfatal("threadalloc malloc: %r");
memset(t, 0, sizeof *t);
t->stk = (uchar*)(t+1);
t->stksize = stack;
}
static void
-scheduler(void *v)
+scheduler(Proc *p)
{
_Thread *t;
- Proc *p;
- p = v;
setproc(p);
// print("s %p %d\n", p, gettid());
- p->tid = pthread_self();
- pthread_detach(p->tid);
lock(&p->lock);
for(;;){
while((t = p->runqueue.head) == nil){
unlock(&p->lock);
free(p);
setproc(0);
- pthread_exit(nil);
}
void
blob - fb7e4c3bcb8f7bde2c94504066a1e62e579f71ea
blob + e88e321cd7cbedae4b2eaf8dd88ebff8bec33aee
--- src/libthread/threadimpl.h
+++ src/libthread/threadimpl.h
#define proc() _threadproc()
#define setproc(p) _threadsetproc(p)
-extern void _procstart(Proc*, void (*fn)(void*));
+extern void _procstart(Proc*, void (*fn)(Proc*));
extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
extern void _threadexit(void);
extern Proc *_threadproc(void);