Changeset c0d814a in mainline for kernel/generic/src/synch/condvar.c
- Timestamp:
- 2025-04-10T20:02:30Z (4 days ago)
- Children:
- b8b031f
- Parents:
- a92290d (diff), 90dd8aee (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Wayne Thornton <wmthornton-dev@…> (2025-04-10 20:02:30)
- git-committer:
- GitHub <noreply@…> (2025-04-10 20:02:30)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/synch/condvar.c
ra92290d rc0d814a 79 79 * @return See comment for waitq_sleep_timeout(). 80 80 */ 81 errno_t condvar_wait_timeout(condvar_t *cv, mutex_t *mtx, uint32_t usec)81 errno_t __condvar_wait_timeout_mutex(condvar_t *cv, mutex_t *mtx, uint32_t usec) 82 82 { 83 83 wait_guard_t guard = waitq_sleep_prepare(&cv->wq); … … 92 92 } 93 93 94 errno_t condvar_wait(condvar_t *cv, mutex_t *mtx)94 errno_t __condvar_wait_mutex(condvar_t *cv, mutex_t *mtx) 95 95 { 96 96 wait_guard_t guard = waitq_sleep_prepare(&cv->wq); … … 105 105 } 106 106 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 */ 125 errno_t _condvar_wait_timeout_spinlock_impl(condvar_t *cv, spinlock_t *lock, 126 uint32_t usec, int flags) 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) 127 110 { 128 111 wait_guard_t guard = waitq_sleep_prepare(&cv->wq); … … 131 114 spinlock_unlock(lock); 132 115 133 errno_t rc = waitq_sleep_timeout_unsafe(&cv->wq, usec, flags, guard); 116 errno_t rc = waitq_sleep_timeout_unsafe(&cv->wq, usec, 117 SYNCH_FLAGS_NON_BLOCKING, guard); 134 118 135 119 spinlock_lock(lock); … … 137 121 } 138 122 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 */153 errno_t _ condvar_wait_timeout_irq_spinlock(condvar_t *cv, irq_spinlock_t *irq_lock,154 uint32_t usec, int flags)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) 155 139 { 156 140 errno_t rc; … … 171 155 * running) and there is no danger of a deadlock. 172 156 */ 173 rc = _condvar_wait_timeout_spinlock(cv, &irq_lock->lock, usec, flags); 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); 174 176 175 177 irq_lock->guard = guard;
Note:
See TracChangeset
for help on using the changeset viewer.