Changeset 5573942 in mainline for kernel/generic/src/synch/waitq.c


Ignore:
Timestamp:
2007-02-04T11:46:18Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
15819e37
Parents:
cf5ddf6
Message:

Revert thread_interrupt_sleep() to waitq_interrupt_sleep().
I'd prefer that this, IMO, waitq related stuff stays together.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/synch/waitq.c

    rcf5ddf6 r5573942  
    117117}
    118118
     119/** Interrupt sleeping thread.
     120 *
     121 * This routine attempts to interrupt a thread from its sleep in a waitqueue.
     122 * If the thread is not found sleeping, no action is taken.
     123 *
     124 * @param t Thread to be interrupted.
     125 */
     126void waitq_interrupt_sleep(thread_t *t)
     127{
     128        waitq_t *wq;
     129        bool do_wakeup = false;
     130        ipl_t ipl;
     131
     132        ipl = interrupts_disable();
     133        spinlock_lock(&threads_lock);
     134        if (!thread_exists(t))
     135                goto out;
     136
     137grab_locks:
     138        spinlock_lock(&t->lock);
     139        if ((wq = t->sleep_queue)) {            /* assignment */
     140                if (!(t->sleep_interruptible)) {
     141                        /*
     142                         * The sleep cannot be interrupted.
     143                         */
     144                        spinlock_unlock(&t->lock);
     145                        goto out;
     146                }
     147                       
     148                if (!spinlock_trylock(&wq->lock)) {
     149                        spinlock_unlock(&t->lock);
     150                        goto grab_locks;        /* avoid deadlock */
     151                }
     152
     153                if (t->timeout_pending && timeout_unregister(&t->sleep_timeout))
     154                        t->timeout_pending = false;
     155
     156                list_remove(&t->wq_link);
     157                t->saved_context = t->sleep_interruption_context;
     158                do_wakeup = true;
     159                t->sleep_queue = NULL;
     160                spinlock_unlock(&wq->lock);
     161        }
     162        spinlock_unlock(&t->lock);
     163
     164        if (do_wakeup)
     165                thread_ready(t);
     166
     167out:
     168        spinlock_unlock(&threads_lock);
     169        interrupts_restore(ipl);
     170}
    119171
    120172/** Sleep until either wakeup, timeout or interruption occurs
Note: See TracChangeset for help on using the changeset viewer.