5 #include "threadimpl.h"
7 static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER;
12 pthread_mutexattr_t attr;
14 pthread_mutex_lock(&initmutex);
16 pthread_mutexattr_init(&attr);
17 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
18 pthread_mutex_init(&lk->mutex, &attr);
19 pthread_mutexattr_destroy(&attr);
22 pthread_mutex_unlock(&initmutex);
26 _threadlock(Lock *lk, int block, ulong pc)
33 if(pthread_mutex_lock(&lk->mutex) != 0)
37 r = pthread_mutex_trylock(&lk->mutex);
48 _threadunlock(Lock *lk, ulong pc)
50 if(pthread_mutex_unlock(&lk->mutex) != 0)
55 _procsleep(_Procrendez *r)
57 /* r is protected by r->l, which we hold */
58 pthread_cond_init(&r->cond, 0);
60 pthread_cond_wait(&r->cond, &r->l->mutex);
61 pthread_cond_destroy(&r->cond);
66 _procwakeup(_Procrendez *r)
70 pthread_cond_signal(&r->cond);
85 p->osprocid = pthread_self();
86 pthread_detach(p->osprocid);
94 _procstart(Proc *p, void (*fn)(Proc*))
98 a = malloc(2*sizeof a[0]);
100 sysfatal("_procstart malloc: %r");
104 if(pthread_create(&p->osprocid, nil, (void*(*)(void*))startprocfn, (void*)a) < 0){
105 fprint(2, "pthread_create: %r\n");
110 static pthread_key_t prockey;
117 p = pthread_getspecific(prockey);
122 _threadsetproc(Proc *p)
124 pthread_setspecific(prockey, p);
130 pthread_key_create(&prockey, 0);