You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2006/11/17 13:34:05 UTC

svn commit: r476121 - /incubator/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/apr_thread_ext.c

Author: varlax
Date: Fri Nov 17 04:34:05 2006
New Revision: 476121

URL: http://svn.apache.org/viewvc?view=rev&rev=476121
Log:
Applied HARMONY-1669 Classlib test tests/api/java/io/PipedInputStreamTest hangs on Windows 2003.
Did some cleanup in the original patch.
Tested on Win2003

Modified:
    incubator/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/apr_thread_ext.c

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/apr_thread_ext.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/apr_thread_ext.c?view=diff&rev=476121&r1=476120&r2=476121
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/apr_thread_ext.c (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/port/src/thread/win/apr_thread_ext.c Fri Nov 17 04:34:05 2006
@@ -22,9 +22,8 @@
 #include <windows.h>
 #include <stdio.h>
 #include "apr_thread_ext.h"
-//#include "apr_arch_threadproc.h"
+#include <apr_atomic.h>
 
-static int convert_priority(apr_int32_t priority);
 
 APR_DECLARE(apr_status_t) apr_thread_set_priority(apr_thread_t *thread, 
                 apr_int32_t priority) 
@@ -36,38 +35,49 @@
         return status;
     }
     
-    if (SetThreadPriority(*os_thread, (int)convert_priority(priority))) {
+    if (SetThreadPriority(*os_thread, (int)priority)) {
         return APR_SUCCESS;
     } else {
         return apr_get_os_error();
     }
-    
-    
-}
-
-static int convert_priority(apr_int32_t priority) {
-    return (int)priority;
 }
 
 // touch thread to flash memory
 APR_DECLARE(apr_status_t) apr_thread_yield_other(apr_thread_t* thread) {
     HANDLE *os_thread = NULL;
-    apr_status_t status;   
-    if (status = apr_os_thread_get(&((apr_os_thread_t *)os_thread), thread)) {
+    apr_status_t status;  
+
+    static CRITICAL_SECTION *yield_other_mutex = NULL;
+    if (yield_other_mutex == NULL) {
+        CRITICAL_SECTION *cs = malloc(sizeof(CRITICAL_SECTION));
+        InitializeCriticalSectionAndSpinCount(cs, 400);
+        // there should be the only one CS
+        // do nothing if some one else already init it.
+        if(apr_atomic_casptr ((volatile void**)&yield_other_mutex, (void*)cs, NULL)) {
+            DeleteCriticalSection(cs);
+            free(cs);
+        }
+    }
+
+	if (status = apr_os_thread_get(&((apr_os_thread_t *)os_thread), thread)) {
         return status;
     }
-        if(!os_thread) {
-//        printf ("detached thread\n");
-              return status;
-        }
-       //printf("suspending %d\n", *os_thread);
-    if(-1!=SuspendThread(*os_thread)) {
-         ResumeThread(*os_thread);
- //      printf("resuming %d\n", *os_thread);
-        } else {
-  //            printf("fail to suspend %d\n", *os_thread);
-        }
-  return APR_SUCCESS; 
+	if(!os_thread) {
+        return status;
+    }
+
+    /* 
+     * Synchronization is needed to avoid cyclic (mutual) suspension problem.
+     * Accordingly to MSDN, it is possible on multiprocessor box that
+     * 2 threads suspend each other and become deadlocked.
+     */
+    EnterCriticalSection(yield_other_mutex);
+    if(-1 != SuspendThread(*os_thread)) {
+        /* suspended successfully, so resume it back. */
+        ResumeThread(*os_thread);
+    } 
+    LeaveCriticalSection(yield_other_mutex);
+    return APR_SUCCESS; 
 }
 
 APR_DECLARE(void) apr_memory_rw_barrier() {