Blame


1 619085f0 2004-12-25 devnull #include "threadimpl.h"
2 619085f0 2004-12-25 devnull
3 3d867865 2005-01-18 devnull #undef exits
4 3d867865 2005-01-18 devnull #undef _exits
5 3d867865 2005-01-18 devnull
6 619085f0 2004-12-25 devnull static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER;
7 619085f0 2004-12-25 devnull
8 619085f0 2004-12-25 devnull static void
9 619085f0 2004-12-25 devnull lockinit(Lock *lk)
10 619085f0 2004-12-25 devnull {
11 619085f0 2004-12-25 devnull pthread_mutexattr_t attr;
12 619085f0 2004-12-25 devnull
13 619085f0 2004-12-25 devnull pthread_mutex_lock(&initmutex);
14 619085f0 2004-12-25 devnull if(lk->init == 0){
15 619085f0 2004-12-25 devnull pthread_mutexattr_init(&attr);
16 619085f0 2004-12-25 devnull pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
17 619085f0 2004-12-25 devnull pthread_mutex_init(&lk->mutex, &attr);
18 619085f0 2004-12-25 devnull pthread_mutexattr_destroy(&attr);
19 619085f0 2004-12-25 devnull lk->init = 1;
20 619085f0 2004-12-25 devnull }
21 619085f0 2004-12-25 devnull pthread_mutex_unlock(&initmutex);
22 619085f0 2004-12-25 devnull }
23 619085f0 2004-12-25 devnull
24 619085f0 2004-12-25 devnull int
25 619085f0 2004-12-25 devnull _threadlock(Lock *lk, int block, ulong pc)
26 619085f0 2004-12-25 devnull {
27 619085f0 2004-12-25 devnull int r;
28 619085f0 2004-12-25 devnull
29 619085f0 2004-12-25 devnull if(!lk->init)
30 619085f0 2004-12-25 devnull lockinit(lk);
31 619085f0 2004-12-25 devnull if(block){
32 619085f0 2004-12-25 devnull if(pthread_mutex_lock(&lk->mutex) != 0)
33 619085f0 2004-12-25 devnull abort();
34 619085f0 2004-12-25 devnull return 1;
35 619085f0 2004-12-25 devnull }else{
36 619085f0 2004-12-25 devnull r = pthread_mutex_trylock(&lk->mutex);
37 619085f0 2004-12-25 devnull if(r == 0)
38 619085f0 2004-12-25 devnull return 1;
39 619085f0 2004-12-25 devnull if(r == EBUSY)
40 619085f0 2004-12-25 devnull return 0;
41 619085f0 2004-12-25 devnull abort();
42 619085f0 2004-12-25 devnull return 0;
43 619085f0 2004-12-25 devnull }
44 619085f0 2004-12-25 devnull }
45 619085f0 2004-12-25 devnull
46 619085f0 2004-12-25 devnull void
47 619085f0 2004-12-25 devnull _threadunlock(Lock *lk, ulong pc)
48 619085f0 2004-12-25 devnull {
49 619085f0 2004-12-25 devnull if(pthread_mutex_unlock(&lk->mutex) != 0)
50 619085f0 2004-12-25 devnull abort();
51 619085f0 2004-12-25 devnull }
52 619085f0 2004-12-25 devnull
53 619085f0 2004-12-25 devnull void
54 619085f0 2004-12-25 devnull _procsleep(_Procrendez *r)
55 619085f0 2004-12-25 devnull {
56 619085f0 2004-12-25 devnull /* r is protected by r->l, which we hold */
57 619085f0 2004-12-25 devnull pthread_cond_init(&r->cond, 0);
58 619085f0 2004-12-25 devnull r->asleep = 1;
59 619085f0 2004-12-25 devnull pthread_cond_wait(&r->cond, &r->l->mutex);
60 619085f0 2004-12-25 devnull pthread_cond_destroy(&r->cond);
61 619085f0 2004-12-25 devnull r->asleep = 0;
62 619085f0 2004-12-25 devnull }
63 619085f0 2004-12-25 devnull
64 619085f0 2004-12-25 devnull void
65 619085f0 2004-12-25 devnull _procwakeup(_Procrendez *r)
66 619085f0 2004-12-25 devnull {
67 619085f0 2004-12-25 devnull if(r->asleep){
68 619085f0 2004-12-25 devnull r->asleep = 0;
69 619085f0 2004-12-25 devnull pthread_cond_signal(&r->cond);
70 619085f0 2004-12-25 devnull }
71 619085f0 2004-12-25 devnull }
72 619085f0 2004-12-25 devnull
73 a0a331aa 2005-01-06 devnull void
74 a0a331aa 2005-01-06 devnull _procwakeupandunlock(_Procrendez *r)
75 a0a331aa 2005-01-06 devnull {
76 a0a331aa 2005-01-06 devnull if(r->asleep){
77 a0a331aa 2005-01-06 devnull r->asleep = 0;
78 a0a331aa 2005-01-06 devnull pthread_cond_signal(&r->cond);
79 a0a331aa 2005-01-06 devnull }
80 c345061e 2005-01-07 devnull unlock(r->l);
81 a0a331aa 2005-01-06 devnull }
82 a0a331aa 2005-01-06 devnull
83 73722a8b 2004-12-27 devnull static void
84 73722a8b 2004-12-27 devnull startprocfn(void *v)
85 73722a8b 2004-12-27 devnull {
86 73722a8b 2004-12-27 devnull void **a;
87 73722a8b 2004-12-27 devnull void (*fn)(void*);
88 73722a8b 2004-12-27 devnull Proc *p;
89 73722a8b 2004-12-27 devnull
90 73722a8b 2004-12-27 devnull a = (void**)v;
91 c345061e 2005-01-07 devnull fn = (void(*)(void*))a[0];
92 73722a8b 2004-12-27 devnull p = a[1];
93 73722a8b 2004-12-27 devnull free(a);
94 4dbefdd4 2004-12-27 devnull p->osprocid = pthread_self();
95 4dbefdd4 2004-12-27 devnull pthread_detach(p->osprocid);
96 73722a8b 2004-12-27 devnull
97 73722a8b 2004-12-27 devnull (*fn)(p);
98 73722a8b 2004-12-27 devnull
99 73722a8b 2004-12-27 devnull pthread_exit(0);
100 73722a8b 2004-12-27 devnull }
101 73722a8b 2004-12-27 devnull
102 619085f0 2004-12-25 devnull void
103 73722a8b 2004-12-27 devnull _procstart(Proc *p, void (*fn)(Proc*))
104 619085f0 2004-12-25 devnull {
105 73722a8b 2004-12-27 devnull void **a;
106 73722a8b 2004-12-27 devnull
107 73722a8b 2004-12-27 devnull a = malloc(2*sizeof a[0]);
108 73722a8b 2004-12-27 devnull if(a == nil)
109 73722a8b 2004-12-27 devnull sysfatal("_procstart malloc: %r");
110 c345061e 2005-01-07 devnull a[0] = (void*)fn;
111 73722a8b 2004-12-27 devnull a[1] = p;
112 73722a8b 2004-12-27 devnull
113 4dbefdd4 2004-12-27 devnull if(pthread_create(&p->osprocid, nil, (void*(*)(void*))startprocfn, (void*)a) < 0){
114 619085f0 2004-12-25 devnull fprint(2, "pthread_create: %r\n");
115 619085f0 2004-12-25 devnull abort();
116 619085f0 2004-12-25 devnull }
117 619085f0 2004-12-25 devnull }
118 619085f0 2004-12-25 devnull
119 619085f0 2004-12-25 devnull static pthread_key_t prockey;
120 619085f0 2004-12-25 devnull
121 619085f0 2004-12-25 devnull Proc*
122 619085f0 2004-12-25 devnull _threadproc(void)
123 619085f0 2004-12-25 devnull {
124 619085f0 2004-12-25 devnull Proc *p;
125 619085f0 2004-12-25 devnull
126 619085f0 2004-12-25 devnull p = pthread_getspecific(prockey);
127 619085f0 2004-12-25 devnull return p;
128 619085f0 2004-12-25 devnull }
129 619085f0 2004-12-25 devnull
130 619085f0 2004-12-25 devnull void
131 619085f0 2004-12-25 devnull _threadsetproc(Proc *p)
132 619085f0 2004-12-25 devnull {
133 619085f0 2004-12-25 devnull pthread_setspecific(prockey, p);
134 619085f0 2004-12-25 devnull }
135 619085f0 2004-12-25 devnull
136 619085f0 2004-12-25 devnull void
137 e1dc7e45 2004-12-27 devnull _pthreadinit(void)
138 619085f0 2004-12-25 devnull {
139 7a2c8850 2005-01-17 devnull static struct utsname un;
140 7a2c8850 2005-01-17 devnull pthread_t id;
141 7a2c8850 2005-01-17 devnull
142 3d867865 2005-01-18 devnull if(uname(&un) < 0)
143 7a2c8850 2005-01-17 devnull fprint(2, "warning: uname failed: %r\n");
144 7a2c8850 2005-01-17 devnull if(strcmp(un.sysname, "Linux") == 0){
145 7a2c8850 2005-01-17 devnull /*
146 7a2c8850 2005-01-17 devnull * Want to distinguish between the old LinuxThreads pthreads
147 7a2c8850 2005-01-17 devnull * and the new NPTL implementation. NPTL uses much bigger
148 7a2c8850 2005-01-17 devnull * thread IDs.
149 7a2c8850 2005-01-17 devnull */
150 7a2c8850 2005-01-17 devnull id = pthread_self();
151 46cfcf55 2005-02-03 devnull if(*(ulong*)(void*)&id < 1024*1024)
152 7a2c8850 2005-01-17 devnull sysfatal("cannot use LinuxThreads as pthread library; see %s/src/libthread/README.Linux", get9root());
153 7a2c8850 2005-01-17 devnull }
154 619085f0 2004-12-25 devnull pthread_key_create(&prockey, 0);
155 619085f0 2004-12-25 devnull }
156 619085f0 2004-12-25 devnull
157 93eb807a 2004-12-28 devnull void
158 93eb807a 2004-12-28 devnull threadexitsall(char *msg)
159 93eb807a 2004-12-28 devnull {
160 93eb807a 2004-12-28 devnull exits(msg);
161 93eb807a 2004-12-28 devnull }
162 93eb807a 2004-12-28 devnull
163 1d2533d0 2004-12-28 devnull void
164 1d2533d0 2004-12-28 devnull _threadpexit(void)
165 1d2533d0 2004-12-28 devnull {
166 1d2533d0 2004-12-28 devnull pthread_exit(0);
167 1d2533d0 2004-12-28 devnull }