qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH 0/5] Scoped locks using attribute((cleanup))


From: Paolo Bonzini
Subject: [Qemu-devel] [RFC PATCH 0/5] Scoped locks using attribute((cleanup))
Date: Fri, 8 Dec 2017 11:55:48 +0100

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]