Blame


1 cea10000 2005-05-01 devnull #include "threadimpl.h"
2 cea10000 2005-05-01 devnull #include "BSD.c"
3 cea10000 2005-05-01 devnull
4 b20b42b8 2005-08-10 devnull #include <dlfcn.h>
5 fe8c925e 2005-07-21 devnull
6 826babae 2005-12-29 devnull struct thread_tag {
7 826babae 2005-12-29 devnull struct thread_tag *next;
8 826babae 2005-12-29 devnull spinlock_t l;
9 826babae 2005-12-29 devnull volatile int key;
10 826babae 2005-12-29 devnull void *data;
11 b20b42b8 2005-08-10 devnull };
12 b20b42b8 2005-08-10 devnull
13 826babae 2005-12-29 devnull static spinlock_t mlock;
14 826babae 2005-12-29 devnull static spinlock_t dl_lock;
15 826babae 2005-12-29 devnull static spinlock_t tag_lock;
16 826babae 2005-12-29 devnull static struct thread_tag *thread_tag_store = nil;
17 826babae 2005-12-29 devnull static uint nextkey = 0;
18 b20b42b8 2005-08-10 devnull
19 fe8c925e 2005-07-21 devnull void
20 fe8c925e 2005-07-21 devnull _thread_malloc_lock(void)
21 fe8c925e 2005-07-21 devnull {
22 fe8c925e 2005-07-21 devnull _spinlock(&mlock);
23 fe8c925e 2005-07-21 devnull }
24 fe8c925e 2005-07-21 devnull
25 fe8c925e 2005-07-21 devnull void
26 fe8c925e 2005-07-21 devnull _thread_malloc_unlock(void)
27 fe8c925e 2005-07-21 devnull {
28 fe8c925e 2005-07-21 devnull _spinunlock(&mlock);
29 fe8c925e 2005-07-21 devnull }
30 fe8c925e 2005-07-21 devnull
31 fe8c925e 2005-07-21 devnull void
32 fe8c925e 2005-07-21 devnull _thread_malloc_init(void)
33 fe8c925e 2005-07-21 devnull {
34 fe8c925e 2005-07-21 devnull }
35 b20b42b8 2005-08-10 devnull
36 b20b42b8 2005-08-10 devnull /*
37 826babae 2005-12-29 devnull * for ld.so
38 b20b42b8 2005-08-10 devnull */
39 826babae 2005-12-29 devnull void
40 826babae 2005-12-29 devnull _thread_dl_lock(int t)
41 b20b42b8 2005-08-10 devnull {
42 826babae 2005-12-29 devnull if(t)
43 826babae 2005-12-29 devnull _spinunlock(&dl_lock);
44 826babae 2005-12-29 devnull else
45 826babae 2005-12-29 devnull _spinlock(&dl_lock);
46 b20b42b8 2005-08-10 devnull }
47 b20b42b8 2005-08-10 devnull
48 b20b42b8 2005-08-10 devnull /*
49 826babae 2005-12-29 devnull * for libc
50 b20b42b8 2005-08-10 devnull */
51 826babae 2005-12-29 devnull static void
52 826babae 2005-12-29 devnull _thread_tag_init(void **tag)
53 b20b42b8 2005-08-10 devnull {
54 826babae 2005-12-29 devnull struct thread_tag *t;
55 b20b42b8 2005-08-10 devnull
56 826babae 2005-12-29 devnull _spinlock(&tag_lock);
57 826babae 2005-12-29 devnull if(*tag == nil) {
58 826babae 2005-12-29 devnull t = malloc(sizeof (*t));
59 826babae 2005-12-29 devnull if(t != nil) {
60 826babae 2005-12-29 devnull memset(&t->l, 0, sizeof(t->l));
61 826babae 2005-12-29 devnull t->key = nextkey++;
62 826babae 2005-12-29 devnull *tag = t;
63 b20b42b8 2005-08-10 devnull }
64 b20b42b8 2005-08-10 devnull }
65 826babae 2005-12-29 devnull _spinunlock(&tag_lock);
66 826babae 2005-12-29 devnull }
67 b20b42b8 2005-08-10 devnull
68 826babae 2005-12-29 devnull void
69 826babae 2005-12-29 devnull _thread_tag_lock(void **tag)
70 826babae 2005-12-29 devnull {
71 826babae 2005-12-29 devnull struct thread_tag *t;
72 826babae 2005-12-29 devnull
73 826babae 2005-12-29 devnull if(*tag == nil)
74 826babae 2005-12-29 devnull _thread_tag_init(tag);
75 826babae 2005-12-29 devnull t = *tag;
76 826babae 2005-12-29 devnull _spinlock(&t->l);
77 b20b42b8 2005-08-10 devnull }
78 b20b42b8 2005-08-10 devnull
79 b20b42b8 2005-08-10 devnull void
80 826babae 2005-12-29 devnull _thread_tag_unlock(void **tag)
81 b20b42b8 2005-08-10 devnull {
82 826babae 2005-12-29 devnull struct thread_tag *t;
83 b20b42b8 2005-08-10 devnull
84 826babae 2005-12-29 devnull if(*tag == nil)
85 826babae 2005-12-29 devnull _thread_tag_init(tag);
86 826babae 2005-12-29 devnull t = *tag;
87 826babae 2005-12-29 devnull _spinunlock(&t->l);
88 826babae 2005-12-29 devnull }
89 b20b42b8 2005-08-10 devnull
90 826babae 2005-12-29 devnull static void *
91 826babae 2005-12-29 devnull _thread_tag_insert(struct thread_tag *t, void *v)
92 826babae 2005-12-29 devnull {
93 826babae 2005-12-29 devnull t->data = v;
94 826babae 2005-12-29 devnull t->next = thread_tag_store;
95 826babae 2005-12-29 devnull thread_tag_store = t;
96 826babae 2005-12-29 devnull return t;
97 826babae 2005-12-29 devnull }
98 b20b42b8 2005-08-10 devnull
99 826babae 2005-12-29 devnull static void *
100 826babae 2005-12-29 devnull _thread_tag_lookup(struct thread_tag *tag, int size)
101 826babae 2005-12-29 devnull {
102 826babae 2005-12-29 devnull struct thread_tag *t;
103 826babae 2005-12-29 devnull void *p;
104 826babae 2005-12-29 devnull
105 826babae 2005-12-29 devnull _spinlock(&tag->l);
106 826babae 2005-12-29 devnull for(t = thread_tag_store; t != nil; t = t->next)
107 826babae 2005-12-29 devnull if(t->key == tag->key)
108 826babae 2005-12-29 devnull break;
109 826babae 2005-12-29 devnull if(t == nil) {
110 826babae 2005-12-29 devnull p = malloc(size);
111 826babae 2005-12-29 devnull if(p == nil) {
112 826babae 2005-12-29 devnull _spinunlock(&tag->l);
113 826babae 2005-12-29 devnull return nil;
114 826babae 2005-12-29 devnull }
115 826babae 2005-12-29 devnull _thread_tag_insert(tag, p);
116 b20b42b8 2005-08-10 devnull }
117 826babae 2005-12-29 devnull _spinunlock(&tag->l);
118 826babae 2005-12-29 devnull return tag->data;
119 b20b42b8 2005-08-10 devnull }
120 b20b42b8 2005-08-10 devnull
121 826babae 2005-12-29 devnull void *
122 826babae 2005-12-29 devnull _thread_tag_storage(void **tag, void *storage, size_t n, void *err)
123 b20b42b8 2005-08-10 devnull {
124 826babae 2005-12-29 devnull struct thread_tag *t;
125 826babae 2005-12-29 devnull void *r;
126 826babae 2005-12-29 devnull
127 826babae 2005-12-29 devnull if(*tag == nil)
128 826babae 2005-12-29 devnull _thread_tag_init(tag);
129 826babae 2005-12-29 devnull t = *tag;
130 826babae 2005-12-29 devnull
131 826babae 2005-12-29 devnull r = _thread_tag_lookup(t, n);
132 826babae 2005-12-29 devnull if(r == nil)
133 826babae 2005-12-29 devnull r = err;
134 b20b42b8 2005-08-10 devnull else
135 826babae 2005-12-29 devnull memcpy(r, storage, n);
136 826babae 2005-12-29 devnull return r;
137 b20b42b8 2005-08-10 devnull }
138 b20b42b8 2005-08-10 devnull
139 b20b42b8 2005-08-10 devnull void
140 b20b42b8 2005-08-10 devnull _pthreadinit(void)
141 b20b42b8 2005-08-10 devnull {
142 b20b42b8 2005-08-10 devnull __isthreaded = 1;
143 b20b42b8 2005-08-10 devnull dlctl(nil, DL_SETTHREADLCK, _thread_dl_lock);
144 b20b42b8 2005-08-10 devnull signal(SIGUSR2, sigusr2handler);
145 b20b42b8 2005-08-10 devnull }