PATCH: Tweak g++.eh/badalloc1.C (for *-*-freebsd* -pthread only)

Loren James Rittle rittle@latour.rsch.comm.mot.com
Tue Dec 16 11:51:00 GMT 2003


FAIL: g++.eh/badalloc1.C  Execution test

This test has failed on FreeBSD with -pthread for about 3 years.  I
think it would be better to run the test in a manner that nominally
works in order to catch a real regression.  Even though this test is
in not threaded, the issue is that merely linking with -pthread on
FreeBSD causes __gthread_active_p() to be true (i.e. why the issue
isn't seen on all platforms when their test suite is run -pthread or
the port's equivalent).  That, in turn, causes a behavior change in EH
support on thread-enabled platforms.  In particular, it needs to
allocate per-thread memory at the time of the first exception is throw
within the thread's context (at least on FreeBSD).  This is a known
design issue; robust threaded EH-C++ would prime every worker thread.

Nathan, as the owner of the test: OK for me to install?  You will note
that the change only affects FreeBSD systems when linked against its
thread library.

Regards,
Loren

Index: gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C,v
retrieving revision 1.9
diff -c -r1.9 badalloc1.C
*** gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C	1 May 2003 02:02:38 -0000	1.9
--- gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C	16 Dec 2003 11:04:18 -0000
***************
*** 1,5 ****
  // { dg-do run { xfail xstormy16-*-* *-*-darwin* } }
! // Copyright (C) 2000, 2002 Free Software Foundation, Inc.
  // Contributed by Nathan Sidwell 6 June 2000 <nathan@codesourcery.com>
  
  // Check we can throw a bad_alloc exception when malloc dies.
--- 1,5 ----
  // { dg-do run { xfail xstormy16-*-* *-*-darwin* } }
! // Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
  // Contributed by Nathan Sidwell 6 June 2000 <nathan@codesourcery.com>
  
  // Check we can throw a bad_alloc exception when malloc dies.
***************
*** 14,21 ****
--- 14,28 ----
  #ifdef STACK_SIZE
  const int arena_size = 256;
  #else
+ #ifdef __FreeBSD__
+ // FreeBSD with threads requires even more space at initialization time.
+ #include "bits/c++config.h"
+ #include "bits/gthr.h"
+ const int arena_size = 131072;
+ #else
  const int arena_size = 32768;
  #endif
+ #endif
  
  struct object
  {
***************
*** 98,103 ****
--- 105,121 ----
  
  int main()
  {
+ #ifdef __FreeBSD__
+ // FreeBSD with threads fails the test unless each thread primes itself.
+   if (__gthread_active_p())
+     {
+       try{fn_throw();}
+       catch(int a){}
+     }
+ // This was added to test with well-known idiom to detect regressions here
+ // rather than always failing with -pthread.
+ #endif
+ 
    fail = 1;
  
    try{fn_throw();}



More information about the Gcc-patches mailing list