Lines Matching refs:lock

41 void coroutine_fn qemu_co_queue_wait_impl(CoQueue *queue, QemuLockable *lock,  in qemu_co_queue_wait_impl()  argument
51 if (lock) { in qemu_co_queue_wait_impl()
52 qemu_lockable_unlock(lock); in qemu_co_queue_wait_impl()
69 if (lock) { in qemu_co_queue_wait_impl()
70 qemu_lockable_lock(lock); in qemu_co_queue_wait_impl()
74 bool qemu_co_enter_next_impl(CoQueue *queue, QemuLockable *lock) in qemu_co_enter_next_impl() argument
84 if (lock) { in qemu_co_enter_next_impl()
85 qemu_lockable_unlock(lock); in qemu_co_enter_next_impl()
88 if (lock) { in qemu_co_enter_next_impl()
89 qemu_lockable_lock(lock); in qemu_co_enter_next_impl()
100 void qemu_co_enter_all_impl(CoQueue *queue, QemuLockable *lock) in qemu_co_enter_all_impl() argument
102 while (qemu_co_enter_next_impl(queue, lock)) { in qemu_co_enter_all_impl()
338 void qemu_co_rwlock_init(CoRwlock *lock) in qemu_co_rwlock_init() argument
340 qemu_co_mutex_init(&lock->mutex); in qemu_co_rwlock_init()
341 lock->owners = 0; in qemu_co_rwlock_init()
342 QSIMPLEQ_INIT(&lock->tickets); in qemu_co_rwlock_init()
346 static void coroutine_fn qemu_co_rwlock_maybe_wake_one(CoRwlock *lock) in qemu_co_rwlock_maybe_wake_one() argument
348 CoRwTicket *tkt = QSIMPLEQ_FIRST(&lock->tickets); in qemu_co_rwlock_maybe_wake_one()
358 if (lock->owners >= 0) { in qemu_co_rwlock_maybe_wake_one()
359 lock->owners++; in qemu_co_rwlock_maybe_wake_one()
363 if (lock->owners == 0) { in qemu_co_rwlock_maybe_wake_one()
364 lock->owners = -1; in qemu_co_rwlock_maybe_wake_one()
371 QSIMPLEQ_REMOVE_HEAD(&lock->tickets, next); in qemu_co_rwlock_maybe_wake_one()
372 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_maybe_wake_one()
375 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_maybe_wake_one()
379 void coroutine_fn qemu_co_rwlock_rdlock(CoRwlock *lock) in qemu_co_rwlock_rdlock() argument
383 qemu_co_mutex_lock(&lock->mutex); in qemu_co_rwlock_rdlock()
385 if (lock->owners == 0 || (lock->owners > 0 && QSIMPLEQ_EMPTY(&lock->tickets))) { in qemu_co_rwlock_rdlock()
386 lock->owners++; in qemu_co_rwlock_rdlock()
387 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_rdlock()
391 QSIMPLEQ_INSERT_TAIL(&lock->tickets, &my_ticket, next); in qemu_co_rwlock_rdlock()
392 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_rdlock()
394 assert(lock->owners >= 1); in qemu_co_rwlock_rdlock()
397 qemu_co_mutex_lock(&lock->mutex); in qemu_co_rwlock_rdlock()
398 qemu_co_rwlock_maybe_wake_one(lock); in qemu_co_rwlock_rdlock()
404 void coroutine_fn qemu_co_rwlock_unlock(CoRwlock *lock) in qemu_co_rwlock_unlock() argument
411 qemu_co_mutex_lock(&lock->mutex); in qemu_co_rwlock_unlock()
412 if (lock->owners > 0) { in qemu_co_rwlock_unlock()
413 lock->owners--; in qemu_co_rwlock_unlock()
415 assert(lock->owners == -1); in qemu_co_rwlock_unlock()
416 lock->owners = 0; in qemu_co_rwlock_unlock()
419 qemu_co_rwlock_maybe_wake_one(lock); in qemu_co_rwlock_unlock()
422 void coroutine_fn qemu_co_rwlock_downgrade(CoRwlock *lock) in qemu_co_rwlock_downgrade() argument
424 qemu_co_mutex_lock(&lock->mutex); in qemu_co_rwlock_downgrade()
425 assert(lock->owners == -1); in qemu_co_rwlock_downgrade()
426 lock->owners = 1; in qemu_co_rwlock_downgrade()
429 qemu_co_rwlock_maybe_wake_one(lock); in qemu_co_rwlock_downgrade()
432 void coroutine_fn qemu_co_rwlock_wrlock(CoRwlock *lock) in qemu_co_rwlock_wrlock() argument
436 qemu_co_mutex_lock(&lock->mutex); in qemu_co_rwlock_wrlock()
437 if (lock->owners == 0) { in qemu_co_rwlock_wrlock()
438 lock->owners = -1; in qemu_co_rwlock_wrlock()
439 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_wrlock()
443 QSIMPLEQ_INSERT_TAIL(&lock->tickets, &my_ticket, next); in qemu_co_rwlock_wrlock()
444 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_wrlock()
446 assert(lock->owners == -1); in qemu_co_rwlock_wrlock()
452 void coroutine_fn qemu_co_rwlock_upgrade(CoRwlock *lock) in qemu_co_rwlock_upgrade() argument
454 qemu_co_mutex_lock(&lock->mutex); in qemu_co_rwlock_upgrade()
455 assert(lock->owners > 0); in qemu_co_rwlock_upgrade()
457 if (lock->owners == 1 && QSIMPLEQ_EMPTY(&lock->tickets)) { in qemu_co_rwlock_upgrade()
458 lock->owners = -1; in qemu_co_rwlock_upgrade()
459 qemu_co_mutex_unlock(&lock->mutex); in qemu_co_rwlock_upgrade()
463 lock->owners--; in qemu_co_rwlock_upgrade()
464 QSIMPLEQ_INSERT_TAIL(&lock->tickets, &my_ticket, next); in qemu_co_rwlock_upgrade()
465 qemu_co_rwlock_maybe_wake_one(lock); in qemu_co_rwlock_upgrade()
467 assert(lock->owners == -1); in qemu_co_rwlock_upgrade()