Rev 2089 | Rev 2183 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2089 | Rev 2109 | ||
---|---|---|---|
Line 676... | Line 676... | ||
676 | thread_exit(); |
676 | thread_exit(); |
677 | /* Unreachable */ |
677 | /* Unreachable */ |
678 | return 0; |
678 | return 0; |
679 | } |
679 | } |
680 | 680 | ||
681 | /** Interrupt sleeping thread. |
- | |
682 | * |
- | |
683 | * This routine attempts to interrupt a thread from its sleep in a waitqueue. |
- | |
684 | * If the thread is not found sleeping, no action is taken. |
- | |
685 | * |
- | |
686 | * @param t Thread to be interrupted. |
- | |
687 | */ |
- | |
688 | void thread_interrupt_sleep(thread_t *t) |
- | |
689 | { |
- | |
690 | waitq_t *wq; |
- | |
691 | bool do_wakeup = false; |
- | |
692 | ipl_t ipl; |
- | |
693 | - | ||
694 | ipl = interrupts_disable(); |
- | |
695 | spinlock_lock(&threads_lock); |
- | |
696 | if (!thread_exists(t)) |
- | |
697 | goto out; |
- | |
698 | - | ||
699 | grab_locks: |
- | |
700 | spinlock_lock(&t->lock); |
- | |
701 | if ((wq = t->sleep_queue)) { /* assignment */ |
- | |
702 | if (!(t->sleep_interruptible)) { |
- | |
703 | /* |
- | |
704 | * The sleep cannot be interrupted. |
- | |
705 | */ |
- | |
706 | spinlock_unlock(&t->lock); |
- | |
707 | goto out; |
- | |
708 | } |
- | |
709 | - | ||
710 | if (!spinlock_trylock(&wq->lock)) { |
- | |
711 | spinlock_unlock(&t->lock); |
- | |
712 | goto grab_locks; /* avoid deadlock */ |
- | |
713 | } |
- | |
714 | - | ||
715 | if (t->timeout_pending && timeout_unregister(&t->sleep_timeout)) |
- | |
716 | t->timeout_pending = false; |
- | |
717 | - | ||
718 | list_remove(&t->wq_link); |
- | |
719 | t->saved_context = t->sleep_interruption_context; |
- | |
720 | do_wakeup = true; |
- | |
721 | t->sleep_queue = NULL; |
- | |
722 | spinlock_unlock(&wq->lock); |
- | |
723 | } |
- | |
724 | spinlock_unlock(&t->lock); |
- | |
725 | - | ||
726 | if (do_wakeup) |
- | |
727 | thread_ready(t); |
- | |
728 | - | ||
729 | out: |
- | |
730 | spinlock_unlock(&threads_lock); |
- | |
731 | interrupts_restore(ipl); |
- | |
732 | } |
- | |
733 | - | ||
734 | /** @} |
681 | /** @} |
735 | */ |
682 | */ |
736 | 683 |