| 1276 | } |
| 1277 | |
| 1278 | void |
| 1279 | mtx_wait_unlocked(struct mtx *m) |
| 1280 | { |
| 1281 | struct thread *owner; |
| 1282 | uintptr_t v; |
| 1283 | |
| 1284 | KASSERT(m->mtx_lock != MTX_DESTROYED, |
| 1285 | ("%s() of destroyed mutex %p", __func__, m)); |
| 1286 | KASSERT(LOCK_CLASS(&m->lock_object) == &lock_class_mtx_sleep, |
| 1287 | ("%s() not a sleep mutex %p (%s)", __func__, m, |
| 1288 | m->lock_object.lo_name)); |
| 1289 | KASSERT(!mtx_owned(m), ("%s() waiting on myself on lock %p (%s)", __func__, m, |
| 1290 | m->lock_object.lo_name)); |
| 1291 | |
| 1292 | for (;;) { |
| 1293 | v = atomic_load_acq_ptr(&m->mtx_lock); |
| 1294 | if (v == MTX_UNOWNED) { |
| 1295 | break; |
| 1296 | } |
| 1297 | owner = lv_mtx_owner(v); |
| 1298 | if (!TD_IS_RUNNING(owner)) { |
| 1299 | mtx_lock(m); |
| 1300 | mtx_unlock(m); |
| 1301 | break; |
| 1302 | } |
| 1303 | cpu_spinwait(); |
| 1304 | } |
| 1305 | } |
| 1306 | |
| 1307 | #ifdef DDB |
| 1308 | void |
no test coverage detected