* Place an unused thread on the zombie list. */
| 548 | * Place an unused thread on the zombie list. |
| 549 | */ |
| 550 | void |
| 551 | thread_zombie(struct thread *td) |
| 552 | { |
| 553 | struct thread_domain_data *tdd; |
| 554 | struct thread *ztd; |
| 555 | |
| 556 | tdd = &thread_domain_data[td->td_allocdomain]; |
| 557 | ztd = atomic_load_ptr(&tdd->tdd_zombies); |
| 558 | for (;;) { |
| 559 | td->td_zombie = ztd; |
| 560 | if (atomic_fcmpset_rel_ptr((uintptr_t *)&tdd->tdd_zombies, |
| 561 | (uintptr_t *)&ztd, (uintptr_t)td)) |
| 562 | break; |
| 563 | continue; |
| 564 | } |
| 565 | } |
| 566 | |
| 567 | /* |
| 568 | * Release a thread that has exited after cpu_throw(). |