On 10/24/19 1:54 PM, Kevin Wolf wrote: > Am 24.10.2019 um 11:59 hat Denis Lunev geschrieben: >> On 10/23/19 6:26 PM, Kevin Wolf wrote: >>> Some functions require that the caller holds a certain CoMutex for them >>> to operate correctly. Add a function so that they can assert the lock is >>> really held. >>> >>> Cc: qemu-sta...@nongnu.org >>> Signed-off-by: Kevin Wolf <kw...@redhat.com> >>> --- >>> include/qemu/coroutine.h | 7 +++++++ >>> 1 file changed, 7 insertions(+) >>> >>> diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h >>> index 9801e7f5a4..a36bcfe5c8 100644 >>> --- a/include/qemu/coroutine.h >>> +++ b/include/qemu/coroutine.h >>> @@ -167,6 +167,13 @@ void coroutine_fn qemu_co_mutex_lock(CoMutex *mutex); >>> */ >>> void coroutine_fn qemu_co_mutex_unlock(CoMutex *mutex); >>> >>> +/** >>> + * Assert that the current coroutine holds @mutex. >>> + */ >>> +static inline coroutine_fn void qemu_co_mutex_assert_locked(CoMutex *mutex) >>> +{ >>> + assert(mutex->locked && mutex->holder == qemu_coroutine_self()); >>> +} >>> >>> /** >>> * CoQueues are a mechanism to queue coroutines in order to continue >>> executing >> I think that we should use atomic_read(&mutex->locked) and require barriers >> working with holder. > Hm, this would only be necessary for the case that the assertion doesn't > hold true. I'll do the atomic_read() because it's easy enough, but I > don't think we need or want barriers here. If another thread modifies > this concurrently, the condition is false either way. > > Kevin > It looks like you are correct. We will see either NULL or something other if we are in the process of lock taking. Does this worth a comment? :)
Den