Patchwork [6/7] add assertions on the owner of a QemuMutex

login
register
mail settings
Submitter Paolo Bonzini
Date Feb. 10, 2011, 5:37 p.m.
Message ID <1297359464-9789-7-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/82635/
State New
Headers show

Comments

Paolo Bonzini - Feb. 10, 2011, 5:37 p.m.
These are already present in the Win32 implementation, add them to
the pthread wrappers as well.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Cc: Stefan Weil <weil@mail.berlios.de>
Cc: Blue Swirl <blauwirbel@gmail.com>
---
 qemu-thread-posix.c |   20 +++++++++++++++++++-
 qemu-thread-posix.h |    1 +
 2 files changed, 20 insertions(+), 1 deletions(-)
Jan Kiszka - Feb. 10, 2011, 6:25 p.m.
On 2011-02-10 18:37, Paolo Bonzini wrote:
> These are already present in the Win32 implementation, add them to
> the pthread wrappers as well.

Better use PTHREAD_MUTEX_ERRORCHECK.

Jan
Paolo Bonzini - Feb. 11, 2011, 12:14 p.m.
On 02/10/2011 07:25 PM, Jan Kiszka wrote:
> On 2011-02-10 18:37, Paolo Bonzini wrote:
>> These are already present in the Win32 implementation, add them to
>> the pthread wrappers as well.
>
> Better use PTHREAD_MUTEX_ERRORCHECK.

True.  However, later I'd like to include tests that the mutex is held 
during cond_signal/cond_broadcast, so I would have to track the owner 
manually anyway.

Paolo
Jan Kiszka - Feb. 11, 2011, 12:54 p.m.
On 2011-02-11 13:14, Paolo Bonzini wrote:
> On 02/10/2011 07:25 PM, Jan Kiszka wrote:
>> On 2011-02-10 18:37, Paolo Bonzini wrote:
>>> These are already present in the Win32 implementation, add them to
>>> the pthread wrappers as well.
>>
>> Better use PTHREAD_MUTEX_ERRORCHECK.
> 
> True.  However, later I'd like to include tests that the mutex is held 
> during cond_signal/cond_broadcast, so I would have to track the owner 
> manually anyway.

You could still save the assertions where pthread does the work already.

Jan

Patch

diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c
index fbc78fe..e6cafd9 100644
--- a/qemu-thread-posix.c
+++ b/qemu-thread-posix.c
@@ -16,9 +16,12 @@ 
 #include <time.h>
 #include <signal.h>
 #include <stdint.h>
+#include <assert.h>
 #include <string.h>
 #include "qemu-thread.h"
 
+static pthread_t pthread_null;
+
 static void error_exit(int err, const char *msg)
 {
     fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err));
@@ -29,6 +32,7 @@  void qemu_mutex_init(QemuMutex *mutex)
 {
     int err;
 
+    mutex->owner = pthread_null;
     err = pthread_mutex_init(&mutex->lock, NULL);
     if (err)
         error_exit(err, __func__);
@@ -48,13 +52,22 @@  void qemu_mutex_lock(QemuMutex *mutex)
     int err;
 
     err = pthread_mutex_lock(&mutex->lock);
+    assert (pthread_equal(mutex->owner, pthread_null));
+    mutex->owner = pthread_self();
     if (err)
         error_exit(err, __func__);
 }
 
 int qemu_mutex_trylock(QemuMutex *mutex)
 {
-    return pthread_mutex_trylock(&mutex->lock);
+    int err;
+    err = pthread_mutex_trylock(&mutex->lock);
+    if (err == 0) {
+        assert (pthread_equal(mutex->owner, pthread_null));
+        mutex->owner = pthread_self();
+    }
+
+    return !!err;
 }
 
 static void timespec_add_ms(struct timespec *ts, uint64_t msecs)
@@ -85,6 +98,8 @@  void qemu_mutex_unlock(QemuMutex *mutex)
 {
     int err;
 
+    assert (pthread_equal(mutex->owner, pthread_self()));
+    mutex->owner = pthread_null;
     err = pthread_mutex_unlock(&mutex->lock);
     if (err)
         error_exit(err, __func__);
@@ -130,7 +145,10 @@  void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
 {
     int err;
 
+    assert (pthread_equal(mutex->owner, pthread_self()));
+    mutex->owner = pthread_null;
     err = pthread_cond_wait(&cond->cond, &mutex->lock);
+    mutex->owner = pthread_self();
     if (err)
         error_exit(err, __func__);
 }
diff --git a/qemu-thread-posix.h b/qemu-thread-posix.h
index 7af371c..11978db 100644
--- a/qemu-thread-posix.h
+++ b/qemu-thread-posix.h
@@ -4,6 +4,7 @@ 
 
 struct QemuMutex {
     pthread_mutex_t lock;
+    pthread_t owner;
 };
 
 struct QemuCond {