qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] crashes with win2008 host


From: KONRAD Frederic
Subject: [Qemu-devel] crashes with win2008 host
Date: Thu, 13 Sep 2018 19:02:56 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1

Hi Andrey,

I've strange crashes since this commit: (yes its old)

commit 12f8def0e02232d7c6416ad9b66640f973c531d1
Author: Andrey Shedel <address@hidden>
Date:   Fri Mar 24 15:01:41 2017 -0700

    win32: replace custom mutex and condition variable with
           native primitives

Basically it just crashes.. (exception 0xc0000135) like this:

(gdb) run
Starting program: C:\home\konrad\temp\qemu-system-sparc --version
[New Thread 5324.0xdf8]
gdb: unknown target exception 0xc0000135 at 0x77636698
gdb: unknown target exception 0xc0000135 at 0x77636698

Program received signal ?, Unknown signal.
0x0000000077636698 in ntdll!RtlRaiseStatus ()
   from C:\Windows\system32\ntdll.dll
(gdb) bt
#0  0x0000000077636698 in ntdll!RtlRaiseStatus ()
   from C:\Windows\system32\ntdll.dll
#1  0x00000000775dcbf7 in ntdll!LdrGetProcedureAddress ()
   from C:\Windows\system32\ntdll.dll
#2  0x00000000775a536e in ntdll!LdrInitializeThunk ()
   from C:\Windows\system32\ntdll.dll
#3  0x0000000000000000 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb)

Sorry the backtrace is not really helpful..

I can reproduce the same behavior with v3.0.0.. and only with
the Windows 2008 server host..

If I partially revert the patch, eg: using CriticalSection
instead of SRWL it seems to work.. But I don't understand why
because SRWL should be supported on 2008 Server..

Here is the change I did (which is wrongly making qemu_mutex
recursive for now):

diff --git a/include/qemu/thread-win32.h b/include/qemu/thread-win32.h
index d668d789b4..b335687604 100644
--- a/include/qemu/thread-win32.h
+++ b/include/qemu/thread-win32.h
@@ -4,7 +4,8 @@
 #include <windows.h>

 struct QemuMutex {
-    SRWLOCK lock;
+    CRITICAL_SECTION lock;
+    LONG owner;
 #ifdef CONFIG_DEBUG_MUTEX
     const char *file;
     int line;
diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c
index b303188a36..09ce4fd957 100644
--- a/util/qemu-thread-win32.c
+++ b/util/qemu-thread-win32.c
@@ -45,7 +45,7 @@ static void error_exit(int err, const char *msg)

 void qemu_mutex_init(QemuMutex *mutex)
 {
-    InitializeSRWLock(&mutex->lock);
+    InitializeCriticalSection(&mutex->lock);
     qemu_mutex_post_init(mutex);
 }

@@ -53,14 +53,14 @@ void qemu_mutex_destroy(QemuMutex *mutex)
 {
     assert(mutex->initialized);
     mutex->initialized = false;
-    InitializeSRWLock(&mutex->lock);
+    DeleteCriticalSection(&mutex->lock);
 }

void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line)
 {
     assert(mutex->initialized);
     qemu_mutex_pre_lock(mutex, file, line);
-    AcquireSRWLockExclusive(&mutex->lock);
+    EnterCriticalSection(&mutex->lock);
     qemu_mutex_post_lock(mutex, file, line);
 }

@@ -69,7 +69,7 @@ int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line)
     int owned;

     assert(mutex->initialized);
-    owned = TryAcquireSRWLockExclusive(&mutex->lock);
+    owned = TryEnterCriticalSection(&mutex->lock);there
     if (owned) {
         qemu_mutex_post_lock(mutex, file, line);
         return 0;
@@ -81,7 +81,7 @@ void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line)
 {
     assert(mutex->initialized);
     qemu_mutex_pre_unlock(mutex, file, line);
-    ReleaseSRWLockExclusive(&mutex->lock);
+    LeaveCriticalSection(&mutex->lock);
 }

 void qemu_rec_mutex_init(QemuRecMutex *mutex)
@@ -141,11 +141,12 @@ void qemu_cond_broadcast(QemuCond *cond)
     WakeAllConditionVariable(&cond->var);
 }

-void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file, const int line) +void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file,
+                         const int line)
 {
     assert(cond->initialized);
     qemu_mutex_pre_unlock(mutex, file, line);
- SleepConditionVariableSRW(&cond->var, &mutex->lock, INFINITE, 0);
+    SleepConditionVariableCS(&cond->var, &mutex->lock, INFINITE);
     qemu_mutex_post_lock(mutex, file, line);
 }

--
2.16.2

Do you have any idea of what's happening?

Regards,
Fred



reply via email to

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