Fix thread stack initialization on BSD platforms.
authorJack Pappas <jackp@server.fake>
Fri, 8 Feb 2013 13:16:35 +0000 (08:16 -0500)
committerJack Pappas <jackp@server.fake>
Fri, 8 Feb 2013 13:16:35 +0000 (08:16 -0500)
configure.in
mono/metadata/sgen-gc.c

index 0c4f080b754bcd56cb3e162a09a42888946e7ee8..c6f3f3c010aa2442ee8dbd8b3c8dbf12188d2b4d 100644 (file)
@@ -173,10 +173,6 @@ case "$host" in
                libgc_threads=pthreads
                # This doesn't seem to work as of 7.0 on amd64
                with_sigaltstack=no
-# TLS is only partially implemented on -CURRENT (compiler support
-# but NOT library support)
-#
-               with_tls=pthread
                use_sigposix=yes
                ;;
        *-*-*openbsd*)
@@ -1444,6 +1440,7 @@ if test x$target_win32 = xno; then
                ;;
        esac
        AC_CHECK_HEADERS(pthread.h)
+       AC_CHECK_HEADERS(pthread_np.h)
        AC_CHECK_FUNCS(pthread_mutex_timedlock)
        AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np)
        AC_CHECK_FUNCS(pthread_kill)
index f5a4c25f3db2dc71b974f7ffc989dd20cc31156f..b8dcc744a120e1e52556aae40e81f164b43dc417 100644 (file)
 #ifdef HAVE_PTHREAD_H
 #include <pthread.h>
 #endif
+#ifdef HAVE_PTHREAD_NP_H
+#include <pthread_np.h>
+#endif
 #ifdef HAVE_SEMAPHORE_H
 #include <semaphore.h>
 #endif
@@ -4124,17 +4127,28 @@ sgen_thread_register (SgenThreadInfo* info, void *addr)
 #endif
 
        /* try to get it with attributes first */
-#if defined(HAVE_PTHREAD_GETATTR_NP) && defined(HAVE_PTHREAD_ATTR_GETSTACK)
-       {
-               size_t size;
-               void *sstart;
-               pthread_attr_t attr;
-               pthread_getattr_np (pthread_self (), &attr);
-               pthread_attr_getstack (&attr, &sstart, &size);
-               info->stack_start_limit = sstart;
-               info->stack_end = (char*)sstart + size;
-               pthread_attr_destroy (&attr);
-       }
+#if (defined(HAVE_PTHREAD_GETATTR_NP) || defined(HAVE_PTHREAD_ATTR_GET_NP)) && defined(HAVE_PTHREAD_ATTR_GETSTACK)
+  {
+     size_t size;
+     void *sstart;
+     pthread_attr_t attr;
+
+#if defined(HAVE_PTHREAD_GETATTR_NP)
+    /* Linux */
+    pthread_getattr_np (pthread_self (), &attr);
+#elif defined(HAVE_PTHREAD_ATTR_GET_NP)
+    /* BSD */
+    pthread_attr_init (&attr);
+    pthread_attr_get_np (pthread_self (), &attr);
+#else
+#error Cannot determine which API is needed to retrieve pthread attributes.
+#endif
+
+     pthread_attr_getstack (&attr, &sstart, &size);
+     info->stack_start_limit = sstart;
+     info->stack_end = (char*)sstart + size;
+     pthread_attr_destroy (&attr);
+  }
 #elif defined(HAVE_PTHREAD_GET_STACKSIZE_NP) && defined(HAVE_PTHREAD_GET_STACKADDR_NP)
                 info->stack_end = (char*)pthread_get_stackaddr_np (pthread_self ());
                 info->stack_start_limit = (char*)info->stack_end - pthread_get_stacksize_np (pthread_self ());