Changeset 5573942 in mainline


Ignore:
Timestamp:
2007-02-04T11:46:18Z (17 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.

Location:
kernel/generic
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/ddi/irq.h

    rcf5ddf6 r5573942  
    8484typedef void (* irq_handler_t)(struct irq *irq, void *arg, ...);
    8585
    86 
    87 
    8886/** IPC notification config structure.
    8987 *
  • kernel/generic/include/proc/thread.h

    rcf5ddf6 r5573942  
    244244extern void thread_update_accounting(void);
    245245extern bool thread_exists(thread_t *t);
    246 extern void thread_interrupt_sleep(thread_t *t);
    247246
    248247/** Fpu context slab cache. */
  • kernel/generic/include/synch/waitq.h

    rcf5ddf6 r5573942  
    6464        waitq_sleep_timeout((wq), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE)
    6565
     66struct thread;
     67
    6668extern void waitq_initialize(waitq_t *wq);
    6769extern int waitq_sleep_timeout(waitq_t *wq, uint32_t usec, int flags);
     
    7173extern void waitq_wakeup(waitq_t *wq, bool all);
    7274extern void _waitq_wakeup_unsafe(waitq_t *wq, bool all);
     75extern void waitq_interrupt_sleep(struct thread *t);
    7376
    7477#endif
  • kernel/generic/src/proc/task.c

    rcf5ddf6 r5573942  
    4343#include <mm/slab.h>
    4444#include <synch/spinlock.h>
     45#include <synch/waitq.h>
    4546#include <arch.h>
    4647#include <panic.h>
     
    364365               
    365366                if (sleeping)
    366                         thread_interrupt_sleep(thr);
     367                        waitq_interrupt_sleep(thr);
    367368        }
    368369       
  • kernel/generic/src/proc/thread.c

    rcf5ddf6 r5573942  
    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  */
    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 
    734681/** @}
    735682 */
  • 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.