Subversion Repositories HelenOS

Rev

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);