You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ib...@apache.org on 2009/07/23 08:11:49 UTC

svn commit: r796958 - /harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c

Author: iberezhn
Date: Thu Jul 23 06:11:49 2009
New Revision: 796958

URL: http://svn.apache.org/viewvc?rev=796958&view=rev
Log:
Make working on FreeBSD 7.1 with libthr threading library

Modified:
    harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c?rev=796958&r1=796957&r2=796958&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_os.c Thu Jul 23 06:11:49 2009
@@ -116,6 +116,7 @@
 {
     pthread_t thread;
     pthread_attr_t attr;
+    pthread_attr_t attr_nosched;
     struct sched_param param;
     thread_start_struct_t* startstr;
     int res;
@@ -140,7 +141,9 @@
         return ENOMEM;
 
     pthread_attr_init(&attr);
+    pthread_attr_init(&attr_nosched);
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+    pthread_attr_setdetachstate(&attr_nosched, PTHREAD_CREATE_DETACHED);
 
     if (stacksize != 0)
     {
@@ -160,9 +163,12 @@
         }
 
         res = pthread_attr_setstacksize(&attr, stacksize);
+        if (res == 0)
+            res = pthread_attr_setstacksize(&attr_nosched, stacksize);
         if (res)
         {
             pthread_attr_destroy(&attr);
+            pthread_attr_destroy(&attr_nosched);
             STD_FREE(startstr);
             return res;
         }
@@ -180,6 +186,7 @@
         if (res != 0)
         {
             pthread_attr_destroy(&attr);
+            pthread_attr_destroy(&attr_nosched);
             STD_FREE(startstr);
             return res;
         }*/
@@ -191,7 +198,11 @@
 
     res = pthread_create(&thread, &attr, (pthread_func_t)thread_start_func, startstr);
 
+    if (res == EPERM) // EPERM relates to scheduling only
+        res = pthread_create(&thread, &attr_nosched, (pthread_func_t)thread_start_func, startstr);
+
     pthread_attr_destroy(&attr);
+    pthread_attr_destroy(&attr_nosched);
 
     if (res == 0)
     {
@@ -323,7 +334,11 @@
         return EINVAL;
 
     // maps unmapped part of the stack
-    ptr = (char*)mmap(tlsdata->stack_addr - tlsdata->stack_size, mapping_size,
+    mapping_addr = (size_t)tlsdata->stack_addr - tlsdata->stack_size;
+    mapping_size =
+        (tlsdata->guard_stack_size + tlsdata->mem_protect_size + 2*PSD->guard_page_size - 1) &
+            ~(PSD->guard_page_size - 1);
+    ptr = (char*)mmap((void*)mapping_addr, mapping_size,
             STACK_MAPPING_ACCESS, STACK_MMAP_ATTRS, -1, 0);
 
     if (ptr == MAP_FAILED)
@@ -375,11 +390,14 @@
         return -1;
 
     err = find_stack_addr_size(&tlsdata->stack_addr, &tlsdata->stack_size);
-    if (err != 0) return err;
+    if (err != 0) {fprintf(stderr, "init_stack:CP#1\n");return err;}
 
-    if (tlsdata->foreign || temp || stack_size == 0)
+    // Workaround for incorrect stack_size returned by pthread_attr_getstack
+    // for main thread, while stack_addr + stack_size gives correct stack top
+    if (tlsdata->foreign)
         tlsdata->stack_size = PSD->foreign_stack_size;
-    else
+
+    if (stack_size != 0 && !tlsdata->foreign)
         tlsdata->stack_size = stack_size;
 
     tlsdata->guard_page_size = PSD->guard_page_size;