This is an attempt to make a C API that resembles the C++ std::unique_lock (mostly untested). The idea is that you can write
QEMU_LOCK_GUARD(QemuMutex, guard_name, &some_mutex); instead of qemu_mutex_lock(&some_mutex); ... out: qemu_mutex_unlock(&some_mutex); and the mutex will be unlocked on all exit paths. In C++ that would be "std::unique_lock<QemuMutex> guard_name(some_mutex);". Likewise, QEMU_WITH_LOCK(QemuMutex, guard_name, &some_mutex) { ... } is the same as qemu_mutex_lock(&some_mutex); ... qemu_mutex_unlock(&some_mutex); except that any returns within the region will unlock the mutex. It's possible to use QemuLockGuard also with a spinlock or a CoMutex. However, it is _not_ possible to return a QemuLockGuard since C doesn't have an equivalent of C++'s "move semantics", so there are other "constructor" macros such as QEMU_ADOPT_LOCK and QEMU_TAKEN_LOCK. On the positive side, I checked that the entire abstraction is removed by the compiler, the generated code is more or less the same. Also, it would let us for example change block/curl.c to use a CoQueue instead of a home-grown list+QemuMutex. However, I am still not sure about the readability, and it doesn't play well with another common idiom in QEMU, which is to wrap global mutexes with function such as static void block_job_lock(void) { qemu_mutex_lock(&block_job_mutex); } static void block_job_unlock(void) { qemu_mutex_unlock(&block_job_mutex); } So I'm a bit underwhelmed by this experiment. Other opinions? Paolo Paolo Bonzini (5): compiler: add a helper for C99 inline functions lock-guard: add scoped lock implementation qemu-timer: convert to use lock guards qht: convert to use lock guards thread-pool: convert to use lock guards include/qemu/compiler.h | 15 +++++++ include/qemu/coroutine.h | 4 ++ include/qemu/lock-guard.h | 99 +++++++++++++++++++++++++++++++++++++++++++++++ include/qemu/thread.h | 7 ++++ util/Makefile.objs | 1 + util/qemu-thread.c | 17 ++++++++ util/qemu-timer.c | 84 ++++++++++++++++++++-------------------- util/qht.c | 59 ++++++++++++++-------------- util/thread-pool.c | 26 ++++++------- 9 files changed, 225 insertions(+), 87 deletions(-) create mode 100644 include/qemu/lock-guard.h create mode 100644 util/qemu-thread.c -- 2.14.3