[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 0/5] coroutine-lock: polymorphic CoQueue
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v3 0/5] coroutine-lock: polymorphic CoQueue |
Date: |
Thu, 25 Jan 2018 18:59:44 +0100 |
There are cases in which a queued coroutine must be restarted from
non-coroutine context (with qemu_co_enter_next). In this cases,
qemu_co_enter_next also needs to be thread-safe, but it cannot use a
CoMutex and so cannot qemu_co_queue_wait. This happens in curl (which
right now is rolling its own list of Coroutines) and will happen in
Fam's NVMe driver as well.
This series extracts the idea of a polymorphic lockable object
from my "scoped lock guard" proposal, and applies it to CoQueue.
The implementation of QemuLockable is similar to C11 _Generic, but
redone using the preprocessor and GCC builtins for compatibility.
In general, while a bit on the esoteric side, the functionality used
to emulate _Generic is fairly old in GCC, and the builtins are already
used by include/qemu/atomic.h; the series was tested with Fedora 27 (boot
Damn Small Linux via http) and CentOS 6 (compiled only).
Paolo
v1->v2: fix typos and copyright year
v2->v3: add tests, fix brown paper bag bug, avoid -Waddress errors
Paolo Bonzini (5):
test-coroutine: add simple CoMutex test
lockable: add QemuLockable
coroutine-lock: convert CoQueue to use QemuLockable
coroutine-lock: make qemu_co_enter_next thread-safe
curl: convert to CoQueue
block/curl.c | 20 +++--------
fsdev/qemu-fsdev-throttle.c | 4 +--
include/qemu/compiler.h | 40 +++++++++++++++++++++
include/qemu/coroutine.h | 25 ++++++++-----
include/qemu/lockable.h | 88 +++++++++++++++++++++++++++++++++++++++++++++
include/qemu/thread.h | 5 ++-
include/qemu/typedefs.h | 4 +++
tests/test-coroutine.c | 75 ++++++++++++++++++++++++++++++++++++--
util/qemu-coroutine-lock.c | 22 ++++++++----
9 files changed, 245 insertions(+), 38 deletions(-)
create mode 100644 include/qemu/lockable.h
--
2.14.3
- [Qemu-devel] [PATCH v3 0/5] coroutine-lock: polymorphic CoQueue,
Paolo Bonzini <=