Rev 2446 | Rev 2470 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2446 | Rev 2451 | ||
---|---|---|---|
Line 76... | Line 76... | ||
76 | "Running", |
76 | "Running", |
77 | "Sleeping", |
77 | "Sleeping", |
78 | "Ready", |
78 | "Ready", |
79 | "Entering", |
79 | "Entering", |
80 | "Exiting", |
80 | "Exiting", |
81 | "JoinMe" |
81 | "Lingering" |
82 | }; |
82 | }; |
83 | 83 | ||
84 | /** Lock protecting the threads_btree B+tree. |
84 | /** Lock protecting the threads_btree B+tree. |
85 | * |
85 | * |
86 | * For locking rules, see declaration thereof. |
86 | * For locking rules, see declaration thereof. |
Line 354... | Line 354... | ||
354 | * |
354 | * |
355 | * Assume thread->lock is held!! |
355 | * Assume thread->lock is held!! |
356 | */ |
356 | */ |
357 | void thread_destroy(thread_t *t) |
357 | void thread_destroy(thread_t *t) |
358 | { |
358 | { |
359 | ASSERT(t->state == Exiting || t->state == JoinMe); |
359 | ASSERT(t->state == Exiting || t->state == Lingering); |
360 | ASSERT(t->task); |
360 | ASSERT(t->task); |
361 | ASSERT(t->cpu); |
361 | ASSERT(t->cpu); |
362 | 362 | ||
363 | spinlock_lock(&t->cpu->lock); |
363 | spinlock_lock(&t->cpu->lock); |
364 | if (t->cpu->fpu_owner == t) |
364 | if (t->cpu->fpu_owner == t) |
Line 518... | Line 518... | ||
518 | return rc; |
518 | return rc; |
519 | } |
519 | } |
520 | 520 | ||
521 | /** Detach thread. |
521 | /** Detach thread. |
522 | * |
522 | * |
523 | * Mark the thread as detached, if the thread is already in the JoinMe state, |
523 | * Mark the thread as detached, if the thread is already in the Lingering |
524 | * deallocate its resources. |
524 | * state, deallocate its resources. |
525 | * |
525 | * |
526 | * @param t Thread to be detached. |
526 | * @param t Thread to be detached. |
527 | */ |
527 | */ |
528 | void thread_detach(thread_t *t) |
528 | void thread_detach(thread_t *t) |
529 | { |
529 | { |
Line 534... | Line 534... | ||
534 | * pointer to it must be still valid. |
534 | * pointer to it must be still valid. |
535 | */ |
535 | */ |
536 | ipl = interrupts_disable(); |
536 | ipl = interrupts_disable(); |
537 | spinlock_lock(&t->lock); |
537 | spinlock_lock(&t->lock); |
538 | ASSERT(!t->detached); |
538 | ASSERT(!t->detached); |
539 | if (t->state == JoinMe) { |
539 | if (t->state == Lingering) { |
540 | thread_destroy(t); /* unlocks &t->lock */ |
540 | thread_destroy(t); /* unlocks &t->lock */ |
541 | interrupts_restore(ipl); |
541 | interrupts_restore(ipl); |
542 | return; |
542 | return; |
543 | } else { |
543 | } else { |
544 | t->detached = true; |
544 | t->detached = true; |