|
From: | Programmingkid |
Subject: | Re: [Qemu-devel] Help with deadlock when using sound |
Date: | Tue, 12 May 2015 23:23:02 -0400 |
On May 12, 2015, at 3:45 AM, Paolo Bonzini wrote:
Found out why QEMU is deadlocking. It is because a mutex that has been unlocked over 20 times in a row is being locked. According to the above link, if pthread_mutex_unlock() is called on a mutex that isn't locked, undefined behavior results. This means the mutex that has been unlocked so many times in a row cannot be trusted. There isn't a way to find out who owns a mutex on Mac OS X, so I made my own logging code to help find out what was going on. If you have access to Mac OS 10.6, you could try out this code by just pasting it in qemu-thread-posix.c: // Debugging code #define MAX_SIZE 100 int thread_dict[MAX_SIZE] = {0}; int mutex_dict[MAX_SIZE] = {0}; int addToDict(int id, int * a_dict) { static int index = 0; if(index > 99) { printf("ERROR: too many threads to keep track of!\n"); return -1; } a_dict[index] = id; index++; return index; } int getID(int origID, int* a_dict) { int index; for (index = 0; index < MAX_SIZE; index++) { if(a_dict[index] == origID) { return index; } } return addToDict(origID, a_dict); } #include <sys/syscall.h> void qemu_mutex_lock(QemuMutex *mutex) { int err; static int count = 0; printf("Lock\tThread = %d\tMutex = %d\n", getID(syscall(SYS_thread_selfid), thread_dict), getID(&mutex, mutex_dict)); err = pthread_mutex_lock(&mutex->lock); if (err) error_exit(err, __func__); } int qemu_mutex_trylock(QemuMutex *mutex) { printf("Trying lock\tThread = %d\tMutex = %d\n", getID(syscall(SYS_thread_selfid), thread_dict), getID(&mutex, mutex_dict)); return pthread_mutex_trylock(&mutex->lock); } void qemu_mutex_unlock(QemuMutex *mutex) { int err; static int count = 0; printf("Unlock\tThread = %d\tMutex = %d\n", getID(syscall(SYS_thread_selfid), thread_dict), getID(&mutex, mutex_dict)); err = pthread_mutex_unlock(&mutex->lock); if (err) error_exit(err, __func__); } Locking mutex 38 is where qemu-system-i386 seems to fail the most. To test the code, I just ran qemu with -soundhw pcspk. |
[Prev in Thread] | Current Thread | [Next in Thread] |