Rev 3734 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3734 | Rev 3875 | ||
---|---|---|---|
Line 100... | Line 100... | ||
100 | 100 | ||
101 | SPINLOCK_INITIALIZE(tidlock); |
101 | SPINLOCK_INITIALIZE(tidlock); |
102 | thread_id_t last_tid = 0; |
102 | thread_id_t last_tid = 0; |
103 | 103 | ||
104 | static slab_cache_t *thread_slab; |
104 | static slab_cache_t *thread_slab; |
105 | #ifdef ARCH_HAS_FPU |
105 | #ifdef CONFIG_FPU |
106 | slab_cache_t *fpu_context_slab; |
106 | slab_cache_t *fpu_context_slab; |
107 | #endif |
107 | #endif |
108 | 108 | ||
109 | /** Thread wrapper. |
109 | /** Thread wrapper. |
110 | * |
110 | * |
Line 159... | Line 159... | ||
159 | link_initialize(&t->th_link); |
159 | link_initialize(&t->th_link); |
160 | 160 | ||
161 | /* call the architecture-specific part of the constructor */ |
161 | /* call the architecture-specific part of the constructor */ |
162 | thr_constructor_arch(t); |
162 | thr_constructor_arch(t); |
163 | 163 | ||
164 | #ifdef ARCH_HAS_FPU |
164 | #ifdef CONFIG_FPU |
165 | #ifdef CONFIG_FPU_LAZY |
165 | #ifdef CONFIG_FPU_LAZY |
166 | t->saved_fpu_context = NULL; |
166 | t->saved_fpu_context = NULL; |
167 | #else |
167 | #else |
168 | t->saved_fpu_context = slab_alloc(fpu_context_slab, kmflags); |
168 | t->saved_fpu_context = slab_alloc(fpu_context_slab, kmflags); |
169 | if (!t->saved_fpu_context) |
169 | if (!t->saved_fpu_context) |
170 | return -1; |
170 | return -1; |
171 | #endif |
171 | #endif |
172 | #endif |
172 | #endif |
173 | 173 | ||
174 | t->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); |
174 | t->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); |
175 | if (!t->kstack) { |
175 | if (!t->kstack) { |
176 | #ifdef ARCH_HAS_FPU |
176 | #ifdef CONFIG_FPU |
177 | if (t->saved_fpu_context) |
177 | if (t->saved_fpu_context) |
178 | slab_free(fpu_context_slab, t->saved_fpu_context); |
178 | slab_free(fpu_context_slab, t->saved_fpu_context); |
179 | #endif |
179 | #endif |
180 | return -1; |
180 | return -1; |
181 | } |
181 | } |
Line 194... | Line 194... | ||
194 | 194 | ||
195 | /* call the architecture-specific part of the destructor */ |
195 | /* call the architecture-specific part of the destructor */ |
196 | thr_destructor_arch(t); |
196 | thr_destructor_arch(t); |
197 | 197 | ||
198 | frame_free(KA2PA(t->kstack)); |
198 | frame_free(KA2PA(t->kstack)); |
199 | #ifdef ARCH_HAS_FPU |
199 | #ifdef CONFIG_FPU |
200 | if (t->saved_fpu_context) |
200 | if (t->saved_fpu_context) |
201 | slab_free(fpu_context_slab, t->saved_fpu_context); |
201 | slab_free(fpu_context_slab, t->saved_fpu_context); |
202 | #endif |
202 | #endif |
203 | return 1; /* One page freed */ |
203 | return 1; /* One page freed */ |
204 | } |
204 | } |
Line 213... | Line 213... | ||
213 | THREAD = NULL; |
213 | THREAD = NULL; |
214 | atomic_set(&nrdy, 0); |
214 | atomic_set(&nrdy, 0); |
215 | thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
215 | thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
216 | thr_constructor, thr_destructor, 0); |
216 | thr_constructor, thr_destructor, 0); |
217 | 217 | ||
218 | #ifdef ARCH_HAS_FPU |
218 | #ifdef CONFIG_FPU |
219 | fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
219 | fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
220 | FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
220 | FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
221 | #endif |
221 | #endif |
222 | 222 | ||
223 | avltree_create(&threads_tree); |
223 | avltree_create(&threads_tree); |