Commit 6c27a0de authored by Alex Bennée's avatar Alex Bennée Committed by Paolo Bonzini
Browse files

util/qemu-thread-*: add qemu_lock, locked and unlock trace events

parent 15a356c4
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -22,9 +22,31 @@ typedef struct QemuThread QemuThread;

void qemu_mutex_init(QemuMutex *mutex);
void qemu_mutex_destroy(QemuMutex *mutex);
void qemu_mutex_lock(QemuMutex *mutex);
int qemu_mutex_trylock(QemuMutex *mutex);
void qemu_mutex_unlock(QemuMutex *mutex);
int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line);
void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line);
void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line);

#define qemu_mutex_lock(mutex) \
        qemu_mutex_lock_impl(mutex, __FILE__, __LINE__)
#define qemu_mutex_trylock(mutex) \
        qemu_mutex_trylock_impl(mutex, __FILE__, __LINE__)
#define qemu_mutex_unlock(mutex) \
        qemu_mutex_unlock_impl(mutex, __FILE__, __LINE__)

static inline void (qemu_mutex_lock)(QemuMutex *mutex)
{
    qemu_mutex_lock(mutex);
}

static inline int (qemu_mutex_trylock)(QemuMutex *mutex)
{
    return qemu_mutex_trylock(mutex);
}

static inline void (qemu_mutex_unlock)(QemuMutex *mutex)
{
    qemu_mutex_unlock(mutex);
}

/* Prototypes for other functions are in thread-posix.h/thread-win32.h.  */
void qemu_rec_mutex_init(QemuRecMutex *mutex);
@@ -39,7 +61,16 @@ void qemu_cond_destroy(QemuCond *cond);
 */
void qemu_cond_signal(QemuCond *cond);
void qemu_cond_broadcast(QemuCond *cond);
void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex);
void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex,
                         const char *file, const int line);

#define qemu_cond_wait(cond, mutex) \
        qemu_cond_wait_impl(cond, mutex, __FILE__, __LINE__)

static inline void (qemu_cond_wait)(QemuCond *cond, QemuMutex *mutex)
{
    qemu_cond_wait(cond, mutex);
}

void qemu_sem_init(QemuSemaphore *sem, int init);
void qemu_sem_post(QemuSemaphore *sem);
+12 −9
Original line number Diff line number Diff line
@@ -57,26 +57,28 @@ void qemu_mutex_destroy(QemuMutex *mutex)
        error_exit(err, __func__);
}

void qemu_mutex_lock(QemuMutex *mutex)
void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line)
{
    int err;

    assert(mutex->initialized);
    trace_qemu_mutex_lock(mutex, file, line);

    err = pthread_mutex_lock(&mutex->lock);
    if (err)
        error_exit(err, __func__);

    trace_qemu_mutex_locked(mutex);
    trace_qemu_mutex_locked(mutex, file, line);
}

int qemu_mutex_trylock(QemuMutex *mutex)
int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line)
{
    int err;

    assert(mutex->initialized);
    err = pthread_mutex_trylock(&mutex->lock);
    if (err == 0) {
        trace_qemu_mutex_locked(mutex);
        trace_qemu_mutex_locked(mutex, file, line);
        return 0;
    }
    if (err != EBUSY) {
@@ -85,15 +87,16 @@ int qemu_mutex_trylock(QemuMutex *mutex)
    return -EBUSY;
}

void qemu_mutex_unlock(QemuMutex *mutex)
void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line)
{
    int err;

    assert(mutex->initialized);
    trace_qemu_mutex_unlocked(mutex);
    err = pthread_mutex_unlock(&mutex->lock);
    if (err)
        error_exit(err, __func__);

    trace_qemu_mutex_unlock(mutex, file, line);
}

void qemu_rec_mutex_init(QemuRecMutex *mutex)
@@ -152,14 +155,14 @@ void qemu_cond_broadcast(QemuCond *cond)
        error_exit(err, __func__);
}

void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file, const int line)
{
    int err;

    assert(cond->initialized);
    trace_qemu_mutex_unlocked(mutex);
    trace_qemu_mutex_unlock(mutex, file, line);
    err = pthread_cond_wait(&cond->cond, &mutex->lock);
    trace_qemu_mutex_locked(mutex);
    trace_qemu_mutex_locked(mutex, file, line);
    if (err)
        error_exit(err, __func__);
}
+11 −9
Original line number Diff line number Diff line
@@ -56,30 +56,32 @@ void qemu_mutex_destroy(QemuMutex *mutex)
    InitializeSRWLock(&mutex->lock);
}

void qemu_mutex_lock(QemuMutex *mutex)
void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line)
{
    assert(mutex->initialized);
    trace_qemu_mutex_lock(mutex, file, line);

    AcquireSRWLockExclusive(&mutex->lock);
    trace_qemu_mutex_locked(mutex);
    trace_qemu_mutex_locked(mutex, file, line);
}

int qemu_mutex_trylock(QemuMutex *mutex)
int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line)
{
    int owned;

    assert(mutex->initialized);
    owned = TryAcquireSRWLockExclusive(&mutex->lock);
    if (owned) {
        trace_qemu_mutex_locked(mutex);
        trace_qemu_mutex_locked(mutex, file, line);
        return 0;
    }
    return -EBUSY;
}

void qemu_mutex_unlock(QemuMutex *mutex)
void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line)
{
    assert(mutex->initialized);
    trace_qemu_mutex_unlocked(mutex);
    trace_qemu_mutex_unlock(mutex, file, line);
    ReleaseSRWLockExclusive(&mutex->lock);
}

@@ -140,12 +142,12 @@ void qemu_cond_broadcast(QemuCond *cond)
    WakeAllConditionVariable(&cond->var);
}

void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file, const int line)
{
    assert(cond->initialized);
    trace_qemu_mutex_unlocked(mutex);
    trace_qemu_mutex_unlock(mutex, file, line);
    SleepConditionVariableSRW(&cond->var, &mutex->lock, INFINITE, 0);
    trace_qemu_mutex_locked(mutex);
    trace_qemu_mutex_locked(mutex, file, line);
}

void qemu_sem_init(QemuSemaphore *sem, int init)
+4 −3
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ lockcnt_futex_wait(const void *lockcnt, int val) "lockcnt %p waiting on %d"
lockcnt_futex_wait_resume(const void *lockcnt, int new) "lockcnt %p after wait: %d"
lockcnt_futex_wake(const void *lockcnt) "lockcnt %p waking up one waiter"

# util/qemu-thread-posix.c
qemu_mutex_locked(void *lock) "locked mutex %p"
qemu_mutex_unlocked(void *lock) "unlocked mutex %p"
# util/qemu-thread.c
qemu_mutex_lock(void *mutex, const char *file, const int line) "waiting on mutex %p (%s:%d)"
qemu_mutex_locked(void *mutex, const char *file, const int line) "taken mutex %p (%s:%d)"
qemu_mutex_unlock(void *mutex, const char *file, const int line) "released mutex %p (%s:%d)"