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);
71 _procwakeupandunlock(_Procrendez *r)
75 pthread_cond_signal(&r->cond);
88 fn = (void(*)(void*))a[0];
91 p->osprocid = pthread_self();
92 pthread_detach(p->osprocid);
100 _procstart(Proc *p, void (*fn)(Proc*))
104 a = malloc(2*sizeof a[0]);
106 sysfatal("_procstart malloc: %r");
110 if(pthread_create(&p->osprocid, nil, (void*(*)(void*))startprocfn, (void*)a) < 0){
111 fprint(2, "pthread_create: %r\n");
116 static pthread_key_t prockey;
123 p = pthread_getspecific(prockey);
128 _threadsetproc(Proc *p)
130 pthread_setspecific(prockey, p);
136 pthread_key_create(&prockey, 0);
140 threadexitsall(char *msg)