Author: pluto
Date: Tue Sep 23 01:05:26 2008
New Revision: 9871

Modified:
   backtracexx/backtracexx.cpp
Log:
- rework glibc workaround.


Modified: backtracexx/backtracexx.cpp
==============================================================================
--- backtracexx/backtracexx.cpp (original)
+++ backtracexx/backtracexx.cpp Tue Sep 23 01:05:26 2008
@@ -70,7 +70,14 @@
 
        namespace
        {
-               _Unwind_Reason_Code helper( struct _Unwind_Context* ctx, Trace* 
trace )
+               struct TraceHelper
+               {
+                       _Unwind_Ptr prevIp;
+                       unsigned recursionDepth;
+                       Trace trace;
+               };
+
+               _Unwind_Reason_Code helper( struct _Unwind_Context* ctx, 
TraceHelper* th )
                {
                        _Unwind_Ptr ip;
 
@@ -86,23 +93,21 @@
                        Frame frame( ip );
 #endif
                        lookupSymbol( frame );
-                       trace->push_back( frame );
+                       th->trace.push_back( frame );
                        //
                        // temporary workaround for glibc bug:
                        // 
http://sources.redhat.com/bugzilla/show_bug.cgi?id=6693
                        //
-                       static __thread _Unwind_Ptr prevIp = 0;
-                       static __thread unsigned recursionDepth = 0;
                        unsigned const RecursionLimit = 8;
-                       if ( prevIp == ip )
+                       if ( th->prevIp == ip )
                        {
-                               if ( ++recursionDepth > RecursionLimit )
+                               if ( ++th->recursionDepth > RecursionLimit )
                                        return _URC_END_OF_STACK;
                        }
                        else
                        {
-                               prevIp = ip;
-                               recursionDepth = 0;
+                               th->prevIp = ip;
+                               th->recursionDepth = 0;
                        }
                        return _URC_NO_REASON;
                }
@@ -159,17 +164,19 @@
 
        Trace scan( ::PCONTEXT ctx )
        {
-               Trace trace;
-
 #if defined( __GNUC__ )
 
+               TraceHelper th;
                //
                //      libgcc takes care about proper stack walking.
                //
-               _Unwind_Backtrace( reinterpret_cast< _Unwind_Trace_Fn >( helper 
), &trace );
+               _Unwind_Backtrace( reinterpret_cast< _Unwind_Trace_Fn >( helper 
), &th );
+               return th.trace;
 
 #elif defined( _MSC_VER ) && defined( WIN32 )
 
+               Trace trace;
+
                ::HANDLE process = ::GetCurrentProcess();
                ::SymInitialize( process, 0, FALSE );
                ::SymSetOptions( ::SymGetOptions() | SYMOPT_UNDNAME | 
SYMOPT_LOAD_LINES );
@@ -213,10 +220,9 @@
                                trace.push_back( frame );
                }
                ::SymCleanup( process );
+               return trace;
 
 #endif
-
-               return trace;
        }
 
        std::ostream& operator << ( std::ostream& os, Trace const& t )
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to