[PATCH] Only define slow_pthread_self on non-FLOATING_STACKS linuxthreads

Jakub Jelinek jakub@redhat.com
Tue Apr 8 12:15:00 GMT 2003


Hi!

When running libgcj against IA-32, x86_64, powerpc and powerpc64
linuxthreads using FLOATING_STACKS or NPTL there is no point to
cache pthread_self returned values - pthread_self is quite cheap.
The following test should succeed on LT-FS and NPTL and fail on LT-nonFS
(where the ulimit is not honoured and all threads get by default STACK_SIZE
big stacks. Unfortunately, this cannot be tested with
pthread_attr_setstacksize, since LT-nonFS will return what has been set
back, although the area occupied by the thread stack is bigger than that).

2003-04-08  Jakub Jelinek  <jakub@redhat.com>

	* configure.host (*-linux*): Don't set slow_pthread_self if primary
	installed libpthread is either linuxthreads with floating stacks or
	NPTL.

--- libjava/configure.host.jj	2003-02-14 17:21:20.000000000 -0500
+++ libjava/configure.host	2003-04-08 08:03:03.000000000 -0400
@@ -164,6 +164,54 @@ case "${host}" in
   x86_64*-linux* | \
   sh-linux* | sh[34]*-linux*)
   	can_unwind_signal=yes
+	if test x$slow_pthread_self = xyes \
+	   && test x$cross_compiling != xyes; then
+	  cat > conftest.c <<EOF
+#define _GNU_SOURCE 1
+#include <pthread.h>
+#include <stdlib.h>
+#include <sys/resource.h>
+#include <limits.h>
+
+void *
+tf (void *arg __attribute__ ((unused)))
+{
+  pthread_attr_t a;
+  size_t s;
+
+  if (pthread_getattr_np (pthread_self (), &a)
+      || pthread_attr_getstacksize (&a, &s)
+      || s > 2 * PTHREAD_STACK_MIN)
+    exit (1);
+  exit (0);
+}
+
+int
+main (int argc, char **argv)
+{
+  pthread_t p;
+  void *ret;
+  struct rlimit r;
+
+  if (argc == 2)
+    {
+      r.rlim_cur = 2 * PTHREAD_STACK_MIN;
+      r.rlim_max = 2 * PTHREAD_STACK_MIN;
+      if (setrlimit (RLIMIT_STACK, &r))
+	exit (1);
+      execl (argv[1], argv[0], NULL);
+      exit (1);
+    }
+
+  if (pthread_create (&p, NULL, tf, NULL)
+      || pthread_join (p, &ret))
+    exit (1);
+  exit (1);
+}
+	  EOF
+	  $CC -o conftest conftest.c -lpthread > /dev/null 2>&1 && \
+	  ./conftest ./conftest && slow_pthread_self=
+	  rm -f conftest conftest.c
 	;;
   *-*-darwin*)
 	enable_hash_synchronization_default=no

	Jakub



More information about the Gcc-patches mailing list