Subversion Repositories HelenOS-historic

Rev

Rev 814 | Rev 842 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 814 Rev 822
Line 224... Line 224...
224
 *
224
 *
225
 */
225
 */
226
thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, int flags)
226
thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, int flags)
227
{
227
{
228
    thread_t *t;
228
    thread_t *t;
-
 
229
    ipl_t ipl;
229
 
230
   
230
    t = (thread_t *) slab_alloc(thread_slab, 0);
231
    t = (thread_t *) slab_alloc(thread_slab, 0);
231
    if (t) {
-
 
232
        ipl_t ipl;
-
 
233
   
232
   
234
        /* Not needed, but good for debugging */
233
    /* Not needed, but good for debugging */
235
        memsetb((__address)t->kstack, THREAD_STACK_SIZE, 0);
234
    memsetb((__address)t->kstack, THREAD_STACK_SIZE, 0);
236
 
235
   
237
        ipl = interrupts_disable();
236
    ipl = interrupts_disable();
238
        spinlock_lock(&tidlock);
237
    spinlock_lock(&tidlock);
239
        t->tid = ++last_tid;
238
    t->tid = ++last_tid;
240
        spinlock_unlock(&tidlock);
239
    spinlock_unlock(&tidlock);
241
        interrupts_restore(ipl);
240
    interrupts_restore(ipl);
242
       
241
   
243
        context_save(&t->saved_context);
242
    context_save(&t->saved_context);
244
        context_set(&t->saved_context, FADDR(cushion), (__address) t->kstack, THREAD_STACK_SIZE);
243
    context_set(&t->saved_context, FADDR(cushion), (__address) t->kstack, THREAD_STACK_SIZE);
245
       
244
   
246
        the_initialize((the_t *) t->kstack);
245
    the_initialize((the_t *) t->kstack);
247
 
246
   
248
        ipl = interrupts_disable();
247
    ipl = interrupts_disable();
249
        t->saved_context.ipl = interrupts_read();
248
    t->saved_context.ipl = interrupts_read();
250
        interrupts_restore(ipl);
249
    interrupts_restore(ipl);
251
       
250
   
252
        t->thread_code = func;
251
    t->thread_code = func;
253
        t->thread_arg = arg;
252
    t->thread_arg = arg;
254
        t->ticks = -1;
253
    t->ticks = -1;
255
        t->priority = -1;       /* start in rq[0] */
254
    t->priority = -1;       /* start in rq[0] */
256
        t->cpu = NULL;
255
    t->cpu = NULL;
257
        t->flags = 0;
256
    t->flags = 0;
258
        t->state = Entering;
257
    t->state = Entering;
259
        t->call_me = NULL;
258
    t->call_me = NULL;
260
        t->call_me_with = NULL;
259
    t->call_me_with = NULL;
261
       
260
   
262
        timeout_initialize(&t->sleep_timeout);
261
    timeout_initialize(&t->sleep_timeout);
263
        t->sleep_queue = NULL;
262
    t->sleep_queue = NULL;
264
        t->timeout_pending = 0;
263
    t->timeout_pending = 0;
265
       
264
   
266
        t->rwlock_holder_type = RWLOCK_NONE;
265
    t->rwlock_holder_type = RWLOCK_NONE;
267
       
-
 
268
        t->task = task;
-
 
269
       
-
 
270
        t->fpu_context_exists=0;
-
 
271
        t->fpu_context_engaged=0;
-
 
272
       
266
       
-
 
267
    t->task = task;
-
 
268
   
-
 
269
    t->fpu_context_exists=0;
-
 
270
    t->fpu_context_engaged=0;
-
 
271
   
273
        /*
272
    /*
274
         * Register this thread in the system-wide list.
273
     * Register this thread in the system-wide list.
275
         */
274
     */
276
        ipl = interrupts_disable();
275
    ipl = interrupts_disable();
277
        spinlock_lock(&threads_lock);
276
    spinlock_lock(&threads_lock);
278
        list_append(&t->threads_link, &threads_head);
277
    list_append(&t->threads_link, &threads_head);
279
        spinlock_unlock(&threads_lock);
278
    spinlock_unlock(&threads_lock);
280
 
279
   
281
        /*
280
    /*
282
         * Attach to the containing task.
281
     * Attach to the containing task.
283
         */
282
     */
284
        spinlock_lock(&task->lock);
283
    spinlock_lock(&task->lock);
285
        list_append(&t->th_link, &task->th_head);
284
    list_append(&t->th_link, &task->th_head);
286
        spinlock_unlock(&task->lock);
285
    spinlock_unlock(&task->lock);
287
 
286
   
288
        interrupts_restore(ipl);
287
    interrupts_restore(ipl);
289
    }
-
 
290
 
288
 
291
    return t;
289
    return t;
292
}
290
}
293
 
291
 
294
 
292