1 cea10000 2005-05-01 devnull #include "threadimpl.h"
2 cea10000 2005-05-01 devnull #include "BSD.c"
4 b20b42b8 2005-08-10 devnull #include <dlfcn.h>
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;
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;
20 fe8c925e 2005-07-21 devnull _thread_malloc_lock(void)
22 fe8c925e 2005-07-21 devnull _spinlock(&mlock);
26 fe8c925e 2005-07-21 devnull _thread_malloc_unlock(void)
28 fe8c925e 2005-07-21 devnull _spinunlock(&mlock);
32 fe8c925e 2005-07-21 devnull _thread_malloc_init(void)
37 826babae 2005-12-29 devnull * for ld.so
40 826babae 2005-12-29 devnull _thread_dl_lock(int t)
43 826babae 2005-12-29 devnull _spinunlock(&dl_lock);
45 826babae 2005-12-29 devnull _spinlock(&dl_lock);
49 826babae 2005-12-29 devnull * for libc
51 826babae 2005-12-29 devnull static void
52 826babae 2005-12-29 devnull _thread_tag_init(void **tag)
54 826babae 2005-12-29 devnull struct thread_tag *t;
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;
65 826babae 2005-12-29 devnull _spinunlock(&tag_lock);
69 826babae 2005-12-29 devnull _thread_tag_lock(void **tag)
71 826babae 2005-12-29 devnull struct thread_tag *t;
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);
80 826babae 2005-12-29 devnull _thread_tag_unlock(void **tag)
82 826babae 2005-12-29 devnull struct thread_tag *t;
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);
90 826babae 2005-12-29 devnull static void *
91 826babae 2005-12-29 devnull _thread_tag_insert(struct thread_tag *t, void *v)
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;
99 826babae 2005-12-29 devnull static void *
100 826babae 2005-12-29 devnull _thread_tag_lookup(struct thread_tag *tag, int size)
102 826babae 2005-12-29 devnull struct thread_tag *t;
103 826babae 2005-12-29 devnull void *p;
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)
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;
115 826babae 2005-12-29 devnull _thread_tag_insert(tag, p);
117 826babae 2005-12-29 devnull _spinunlock(&tag->l);
118 826babae 2005-12-29 devnull return tag->data;
122 826babae 2005-12-29 devnull _thread_tag_storage(void **tag, void *storage, size_t n, void *err)
124 826babae 2005-12-29 devnull struct thread_tag *t;
125 826babae 2005-12-29 devnull void *r;
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;
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;
135 826babae 2005-12-29 devnull memcpy(r, storage, n);
136 826babae 2005-12-29 devnull return r;
140 b20b42b8 2005-08-10 devnull _pthreadinit(void)
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);