|
@@ -40,13 +40,13 @@ void qemu_co_queue_init(CoQueue *queue)
|
|
QSIMPLEQ_INIT(&queue->entries);
|
|
QSIMPLEQ_INIT(&queue->entries);
|
|
}
|
|
}
|
|
|
|
|
|
-void coroutine_fn qemu_co_queue_wait(CoQueue *queue, CoMutex *mutex)
|
|
|
|
|
|
+void coroutine_fn qemu_co_queue_wait_impl(CoQueue *queue, QemuLockable *lock)
|
|
{
|
|
{
|
|
Coroutine *self = qemu_coroutine_self();
|
|
Coroutine *self = qemu_coroutine_self();
|
|
QSIMPLEQ_INSERT_TAIL(&queue->entries, self, co_queue_next);
|
|
QSIMPLEQ_INSERT_TAIL(&queue->entries, self, co_queue_next);
|
|
|
|
|
|
- if (mutex) {
|
|
|
|
- qemu_co_mutex_unlock(mutex);
|
|
|
|
|
|
+ if (lock) {
|
|
|
|
+ qemu_lockable_unlock(lock);
|
|
}
|
|
}
|
|
|
|
|
|
/* There is no race condition here. Other threads will call
|
|
/* There is no race condition here. Other threads will call
|
|
@@ -60,9 +60,11 @@ void coroutine_fn qemu_co_queue_wait(CoQueue *queue, CoMutex *mutex)
|
|
/* TODO: OSv implements wait morphing here, where the wakeup
|
|
/* TODO: OSv implements wait morphing here, where the wakeup
|
|
* primitive automatically places the woken coroutine on the
|
|
* primitive automatically places the woken coroutine on the
|
|
* mutex's queue. This avoids the thundering herd effect.
|
|
* mutex's queue. This avoids the thundering herd effect.
|
|
|
|
+ * This could be implemented for CoMutexes, but not really for
|
|
|
|
+ * other cases of QemuLockable.
|
|
*/
|
|
*/
|
|
- if (mutex) {
|
|
|
|
- qemu_co_mutex_lock(mutex);
|
|
|
|
|
|
+ if (lock) {
|
|
|
|
+ qemu_lockable_lock(lock);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|