Changeset b3f8fb7 in mainline for kernel/generic/src/proc/thread.c


Ignore:
Timestamp:
2007-01-28T13:25:49Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8e8c1a5
Parents:
1ba41c5
Message:

huge type system cleanup
remove cyclical type dependencies across multiple header files
many minor coding style fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/thread.c

    r1ba41c5 rb3f8fb7  
    5454#include <adt/btree.h>
    5555#include <adt/list.h>
    56 #include <typedefs.h>
    5756#include <time/clock.h>
     57#include <time/timeout.h>
    5858#include <config.h>
    5959#include <arch/interrupt.h>
     
    679679}
    680680
     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 */
     688void 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
     699grab_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
     729out:
     730        spinlock_unlock(&threads_lock);
     731        interrupts_restore(ipl);
     732}
     733
    681734/** @}
    682735 */
Note: See TracChangeset for help on using the changeset viewer.