[libxml2] Fix the fix to Windows locking



commit 620a70615e68b30db1a80a993180a41dc24f12b9
Author: Steve Nairn <steven nairn kewill com>
Date:   Tue Mar 3 19:40:06 2015 +0800

    Fix the fix to Windows locking
    
    For https://bugzilla.gnome.org/show_bug.cgi?id=737851
    
    Unfortunately this change has introduced a problem which results in
    occasional hangs on Windows when running multi-threaded on a multi-core
    host.
    
    When locking the xmlRMutex the count field is increment inside the
    critical section but when unlocking the count field is decremented
    outside the critical section. The increment/decrement is not atomic so
    this can result in the count field being updated incorrectly.
    
    The solution is to change xmlRMutexUnlock to decrement the count field
    before leaving the critical section rather than after.

 threads.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/threads.c b/threads.c
index 78006a2..b9d6cae 100644
--- a/threads.c
+++ b/threads.c
@@ -415,8 +415,8 @@ xmlRMutexUnlock(xmlRMutexPtr tok ATTRIBUTE_UNUSED)
     pthread_mutex_unlock(&tok->lock);
 #elif defined HAVE_WIN32_THREADS
     if (tok->count > 0) {
-        LeaveCriticalSection(&tok->cs);
        tok->count--;
+        LeaveCriticalSection(&tok->cs);
     }
 #elif defined HAVE_BEOS_THREADS
     if (tok->lock->tid == find_thread(NULL)) {


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