1 #include "threadimpl.h"
3 static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER;
8 pthread_mutexattr_t attr;
10 pthread_mutex_lock(&initmutex);
12 pthread_mutexattr_init(&attr);
13 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
14 pthread_mutex_init(&lk->mutex, &attr);
15 pthread_mutexattr_destroy(&attr);
18 pthread_mutex_unlock(&initmutex);
22 _threadlock(Lock *lk, int block, ulong pc)
29 if(pthread_mutex_lock(&lk->mutex) != 0)
33 r = pthread_mutex_trylock(&lk->mutex);
44 _threadunlock(Lock *lk, ulong pc)
46 if(pthread_mutex_unlock(&lk->mutex) != 0)
51 _procsleep(_Procrendez *r)
53 /* r is protected by r->l, which we hold */
54 pthread_cond_init(&r->cond, 0);
56 pthread_cond_wait(&r->cond, &r->l->mutex);
57 pthread_cond_destroy(&r->cond);
62 _procwakeup(_Procrendez *r)
66 pthread_cond_signal(&r->cond);
81 p->osprocid = pthread_self();
82 pthread_detach(p->osprocid);
90 _procstart(Proc *p, void (*fn)(Proc*))
94 a = malloc(2*sizeof a[0]);
96 sysfatal("_procstart malloc: %r");
100 if(pthread_create(&p->osprocid, nil, (void*(*)(void*))startprocfn, (void*)a) < 0){
101 fprint(2, "pthread_create: %r\n");
106 static pthread_key_t prockey;
113 p = pthread_getspecific(prockey);
118 _threadsetproc(Proc *p)
120 pthread_setspecific(prockey, p);
126 pthread_key_create(&prockey, 0);
130 threadexitsall(char *msg)