Ignore:
File:
1 edited

Legend:

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

    r0b47781 r597fa24  
    7979 * @return              See comment for waitq_sleep_timeout().
    8080 */
    81 errno_t __condvar_wait_timeout_mutex(condvar_t *cv, mutex_t *mtx, uint32_t usec)
     81errno_t condvar_wait_timeout(condvar_t *cv, mutex_t *mtx, uint32_t usec)
    8282{
    8383        wait_guard_t guard = waitq_sleep_prepare(&cv->wq);
     
    9292}
    9393
    94 errno_t __condvar_wait_mutex(condvar_t *cv, mutex_t *mtx)
     94errno_t condvar_wait(condvar_t *cv, mutex_t *mtx)
    9595{
    9696        wait_guard_t guard = waitq_sleep_prepare(&cv->wq);
     
    105105}
    106106
    107 /** Same as __condvar_wait_timeout_mutex(), except for spinlock_t. */
    108 errno_t __condvar_wait_timeout_spinlock(condvar_t *cv, spinlock_t *lock,
    109     uint32_t usec)
     107/** Wait for the condition to become true with a locked spinlock.
     108 *
     109 * The function is not aware of irq_spinlock. Therefore do not even
     110 * try passing irq_spinlock_t to it. Use _condvar_wait_timeout_irq_spinlock()
     111 * instead.
     112 *
     113 * @param cv            Condition variable.
     114 * @param lock          Locked spinlock.
     115 * @param usec          Timeout value in microseconds.
     116 * @param flags         Select mode of operation.
     117 *
     118 * For exact description of meaning of possible combinations of usec and flags,
     119 * see comment for waitq_sleep_timeout().  Note that when
     120 * SYNCH_FLAGS_NON_BLOCKING is specified here, EAGAIN is always
     121 * returned.
     122 *
     123 * @return See comment for waitq_sleep_timeout().
     124 */
     125errno_t _condvar_wait_timeout_spinlock_impl(condvar_t *cv, spinlock_t *lock,
     126    uint32_t usec, int flags)
    110127{
    111128        wait_guard_t guard = waitq_sleep_prepare(&cv->wq);
     
    114131        spinlock_unlock(lock);
    115132
    116         errno_t rc = waitq_sleep_timeout_unsafe(&cv->wq, usec,
    117             SYNCH_FLAGS_NON_BLOCKING, guard);
     133        errno_t rc = waitq_sleep_timeout_unsafe(&cv->wq, usec, flags, guard);
    118134
    119135        spinlock_lock(lock);
     
    121137}
    122138
    123 errno_t __condvar_wait_spinlock(condvar_t *cv, spinlock_t *mtx)
    124 {
    125         wait_guard_t guard = waitq_sleep_prepare(&cv->wq);
    126 
    127         /* Unlock only after the waitq is locked so we don't miss a wakeup. */
    128         spinlock_unlock(mtx);
    129 
    130         errno_t rc = waitq_sleep_unsafe(&cv->wq, guard);
    131 
    132         spinlock_lock(mtx);
    133         return rc;
    134 }
    135 
    136 /** Same as __condvar_wait_timeout_mutex(), except for irq_spinlock_t. */
    137 errno_t __condvar_wait_timeout_irq_spinlock(condvar_t *cv,
    138     irq_spinlock_t *irq_lock, uint32_t usec)
     139/** Wait for the condition to become true with a locked irq spinlock.
     140 *
     141 * @param cv            Condition variable.
     142 * @param lock          Locked irq spinlock.
     143 * @param usec          Timeout value in microseconds.
     144 * @param flags         Select mode of operation.
     145 *
     146 * For exact description of meaning of possible combinations of usec and flags,
     147 * see comment for waitq_sleep_timeout().  Note that when
     148 * SYNCH_FLAGS_NON_BLOCKING is specified here, EAGAIN is always
     149 * returned.
     150 *
     151 * @return See comment for waitq_sleep_timeout().
     152 */
     153errno_t _condvar_wait_timeout_irq_spinlock(condvar_t *cv, irq_spinlock_t *irq_lock,
     154    uint32_t usec, int flags)
    139155{
    140156        errno_t rc;
     
    155171         * running) and there is no danger of a deadlock.
    156172         */
    157         rc = __condvar_wait_timeout_spinlock(cv, &irq_lock->lock, usec);
    158 
    159         irq_lock->guard = guard;
    160         irq_lock->ipl = ipl;
    161 
    162         return rc;
    163 }
    164 
    165 /** Same as __condvar_wait_mutex(), except for irq_spinlock_t. */
    166 errno_t __condvar_wait_irq_spinlock(condvar_t *cv, irq_spinlock_t *irq_lock)
    167 {
    168         errno_t rc;
    169         /* Save spinlock's state so we can restore it correctly later on. */
    170         ipl_t ipl = irq_lock->ipl;
    171         bool guard = irq_lock->guard;
    172 
    173         irq_lock->guard = false;
    174 
    175         rc = __condvar_wait_spinlock(cv, &irq_lock->lock);
     173        rc = _condvar_wait_timeout_spinlock(cv, &irq_lock->lock, usec, flags);
    176174
    177175        irq_lock->guard = guard;
Note: See TracChangeset for help on using the changeset viewer.