Subversion Repositories HelenOS

Rev

Rev 2089 | Rev 2118 | 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