[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Libunwind-devel] libunwind bug
From: |
David Mosberger-Tang |
Subject: |
Re: [Libunwind-devel] libunwind bug |
Date: |
Wed, 11 Mar 2009 20:59:59 -0600 |
Roy,
libunwind is being maintained by volunteers. Specifically, for ia64
that's basically me. I'm very busy with work unrelated to ia64, so I
have not had time to review the bug-report and much less do anything
about it. Also, I don't expect to have time to work on it any time
soon. Sorry, but that's the reality of the situation at the moment.
--david
On Wed, Mar 11, 2009 at 9:13 AM, Roy Krischer <address@hidden> wrote:
>
> Has any work been done on the issue below?
>
> I believe we have demonstrated that there is an issue with regards to
> libunwind and context switching, and that this issue can cause legitimate
> C++ programs to fail on the ia64.
> Also, note that this is not some obscure or unrealistic bug, but one that
> shows up inside our threading framework uC++, and causes its ia64 port to
> fail.
>
> It would be helpful if somebody from the libunwind development team could
> acknowledge (or dispute) this bug. In either case, we would be happy to
> provide additional information (or evidence). As mentioned above, this bug
> prevents our software from working properly, so it would be nice to know
> that somebody is actually working on it.
>
> Thanks
>
> Roy
>
> Roy Krischer wrote:
> [...]
>
>> The only place where swapcontext could realistically be interrupted is
>> inside the sched function. A remote possibility, but a possibility
>> nonetheless. So to rule this out, I went ahead and blocked SIGALRM there
>> (and inside the handler as well, for good measure, though it should be
>> blocked by default), and even in main. The code (see below) still fails as
>> described in the original email.
>> Note that the section in the standard you pointed to defines *all*
>> functions described in the standard (including unsafe ones like swapcontext)
>> to be safely callable inside a signal handler provided the signal it is
>> handling did not interrupt an unsafe function.
>> The only place that can be interrupted by a SIGALRM in the code below is
>> the eh function, which makes no function calls at all. Hence, calling
>> swapcontext from within the signal handler is perfectly valid.
>>
>> The reason why libunwind is implicated is the following:
>>
>> 1. When linking the program with the standalone libunwind 0.98-5, 0.98.6
>> (latest stable I believe) or the latest git-snapshot, it fails quickly and
>> reliably. If linked against the gcc-supplied libunwind, I can run it
>> overnight without failure.
>>
>> 2. The SIGILL, when it happens, occurs inside libunwind, more precisely in
>> _ULia64_install_cursor (). Apparently, the unwind code does not like to be
>> interrupted and context-switched.
>>
>> I managed to insert a conditional break point just before it crashes. My
>> suspicion is that in the last bundle before it returns and installs the new
>> context, pfs is loaded with a nonsensical value (here, a stack address).
>> Now, whether this is the only problem or just the last symptom in a chain of
>> mishaps, I cannot say, but I'm attaching a gdb log to help you with your
>> debugging efforts (libunwind-0.98-5):
>>
>> Roy
>>
>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> (gdb) bt
>> #0 _ULia64_install_cursor () at ../../src/ia64/Ginstall_cursor.S:292
>> #1 0x4000000000001340 in eh () at eh3.cc:15
>> (gdb) x /3i $pc
>> 0x20000000003297e0 <_ULia64_install_cursor+832>: [MIB] mov.m
>> ar.unat=r25
>> 0x20000000003297e1 <_ULia64_install_cursor+833>: mov.i
>> ar.pfs=r14
>> 0x20000000003297e2 <_ULia64_install_cursor+834>: br.ret.sptk.many b0;;
>> (gdb) p /x $r14
>> $45 = 0x600000000001b498
>> (gdb) info reg
>> r0 0x0 0
>> r1 0x6000000000001b58 6917529027641088856
>> r2 0x600000000001f5c0 6917529027641210304
>> r3 0x600000000001f4f8 6917529027641210104
>> r4 0x0 0
>> r5 0x0 0
>> r6 0x0 0
>> r7 0x0 0
>> r8 0x0 0
>> r9 0x600000000001f4f0 6917529027641210096
>> r10 0xf 15
>> r11 0xc 12
>> r12 0x60000000000210a0 6917529027641217184
>> r13 0x20000000002f2260 2305843009216782944
>> r14 0x600000000001b498 6917529027641193624
>> r15 0x6000000000024060 6917529027641229408
>> r16 0x1 1
>> r17 0x0 0
>> r18 0x0 0
>> r19 0x0 0
>> r20 0x0 0
>> r21 0x60000000000207d0 6917529027641214928
>> r22 0x60000000000207e0 6917529027641214944
>> r23 0x60000000000207f0 6917529027641214960
>> r24 0x6000000000020800 6917529027641214976
>> r25 0x0 0
>> r26 0x0 0
>> r27 0x9804c8a70033f 2674341018862399
>> r28 0x0 0
>> r29 0x60000000000210a0 6917529027641217184
>> r30 0x60000000000126a0 6917529027641157280
>> r31 0x5ac141 5947713
>> b0 0x4000000000001340 4611686018427392832
>> b1 0x40000000000012c0 4611686018427392704
>> b2 0x0 0
>> b3 0x0 0
>> b4 0x0 0
>> b5 0x0 0
>> b6 0x20000000003cd640 2305843009217680960
>> b7 0xa00000010000e040 -6917529023346057152
>> vfp 0x0 0
>> vrap 0x0 0
>> pr 0x5ac141 5947713
>> ip 0x20000000003297e0 2305843009217009632
>> psr 0x10 16
>> cfm 0x387 903
>> kr0 0x0 0
>> kr1 0x0 0
>> kr2 0x0 0
>> kr3 0x0 0
>> kr4 0x0 0
>> kr5 0x0 0
>> kr6 0x0 0
>> kr7 0x0 0
>> rsc 0xf 15
>> bsp 0x60000000000126d8 6917529027641157336
>> bspstore 0x60000000000126a0 6917529027641157280
>> rnat 0x0 0
>> fcr 0x0 0
>> eflag 0x0 0
>> csd 0x0 0
>> ssd 0x0 0
>> cflg 0x0 0
>> fsr 0x0 0
>> fir 0x0 0
>> fdr 0x0 0
>> ccv 0x0 0
>> unat 0x0 0
>> fpsr 0x9804c8a70033f 2674341018862399
>> itc 0x0 0
>> pfs 0xc00000000000038e -4611686018427386994
>> lc 0x0 0
>> ec 0x0 0
>> nat0 0x0 0
>> nat1 0x0 0
>> nat2 0x0 0
>> nat3 0x0 0
>> nat4 0x0 0
>> nat5 0x0 0
>> nat6 0x0 0
>> nat7 0x0 0
>> nat8 0x0 0
>> nat9 0x0 0
>> nat10 0x0 0
>> nat11 0x0 0
>> nat12 0x0 0
>> nat13 0x0 0
>> nat14 0x0 0
>> nat15 0x0 0
>> nat16 0x0 0
>> nat17 0x0 0
>> nat18 0x0 0
>> nat19 0x0 0
>> nat20 0x0 0
>> nat21 0x0 0
>> nat22 0x0 0
>> nat23 0x0 0
>> nat24 0x0 0
>> nat25 0x0 0
>> nat26 0x0 0
>> nat27 0x0 0
>> nat28 0x0 0
>> nat29 0x0 0
>> nat30 0x0 0
>> nat31 0x0 0
>> nat32 0x0 0
>> nat33 0x0 0
>> nat34 0x0 0
>> nat35 0x0 0
>> nat36 0x0 0
>> nat37 0x0 0
>> nat38 0x0 0
>> nat39 0x0 0
>> nat40 0x0 0
>> nat41 0x0 0
>> nat42 0x0 0
>> nat43 0x0 0
>> nat44 0x0 0
>> nat45 0x0 0
>> nat46 0x0 0
>> nat47 0x0 0
>> nat48 0x0 0
>> nat49 0x0 0
>> nat50 0x0 0
>> nat51 0x0 0
>> nat52 0x0 0
>> nat53 0x0 0
>> nat54 0x0 0
>> nat55 0x0 0
>> nat56 0x0 0
>> nat57 0x0 0
>> nat58 0x0 0
>> nat59 0x0 0
>> nat60 0x0 0
>> nat61 0x0 0
>> nat62 0x0 0
>> nat63 0x0 0
>> nat64 0x0 0
>> nat65 0x0 0
>> nat66 0x0 0
>> nat67 0x0 0
>> nat68 0x0 0
>> nat69 0x0 0
>> nat70 0x0 0
>> nat71 0x0 0
>> nat72 0x0 0
>> nat73 0x0 0
>> nat74 0x0 0
>> nat75 0x0 0
>> nat76 0x0 0
>> nat77 0x0 0
>> nat78 0x0 0
>> nat79 0x0 0
>> nat80 0x0 0
>> nat81 0x0 0
>> nat82 0x0 0
>> nat83 0x0 0
>> nat84 0x0 0
>> nat85 0x0 0
>> nat86 0x0 0
>> nat87 0x0 0
>> nat88 0x0 0
>> nat89 0x0 0
>> nat90 0x0 0
>> nat91 0x0 0
>> nat92 0x0 0
>> nat93 0x0 0
>> nat94 0x0 0
>> nat95 0x0 0
>> nat96 0x0 0
>> nat97 0x0 0
>> nat98 0x0 0
>> nat99 0x0 0
>> nat100 0x0 0
>> nat101 0x0 0
>> nat102 0x0 0
>> nat103 0x0 0
>> nat104 0x0 0
>> nat105 0x0 0
>> nat106 0x0 0
>> nat107 0x0 0
>> nat108 0x0 0
>> nat109 0x0 0
>> nat110 0x0 0
>> nat111 0x0 0
>> nat112 0x0 0
>> nat113 0x0 0
>> nat114 0x0 0
>> nat115 0x0 0
>> nat116 0x0 0
>> nat117 0x0 0
>> nat118 0x0 0
>> nat119 0x0 0
>> nat120 0x0 0
>> nat121 0x0 0
>> nat122 0x0 0
>> nat123 0x0 0
>> nat124 0x0 0
>> nat125 0x0 0
>> nat126 0x0 0
>> nat127 0x0 0
>> bof 0x60000000000126a0 6917529027641157280
>> r32 0x600000000001f598 6917529027641210264
>> r33 0x0 0
>> r34 0x600000000001f4e0 6917529027641210080
>> r35 0x60000000000126a0 6917529027641157280
>> r36 0x0 0
>> r37 0x600000000001b498 6917529027641193624
>> r38 0x600000000001f598 6917529027641210264
>> r39 0x0 0
>> r40 0x0 0
>> r41 0x0 0
>> r42 0x0 0
>> r43 0x0 0
>> r44 0x0 0
>> r45 0x0 0
>> r46 0x0 0
>> r47 0x0 0
>> r48 0x0 0
>> r49 0x0 0
>> r50 0x0 0
>> r51 0x0 0
>> r52 0x0 0
>> r53 0x0 0
>> r54 0x0 0
>> r55 0x0 0
>> r56 0x0 0
>> r57 0x0 0
>> r58 0x0 0
>> r59 0x0 0
>> r60 0x0 0
>> r61 0x0 0
>> r62 0x0 0
>> r63 0x0 0
>> r64 0x0 0
>> r65 0x0 0
>> r66 0x0 0
>> r67 0x0 0
>> r68 0x0 0
>> r69 0x0 0
>> r70 0x0 0
>> r71 0x0 0
>> r72 0x0 0
>> r73 0x0 0
>> r74 0x0 0
>> r75 0x0 0
>> r76 0x0 0
>> r77 0x0 0
>> r78 0x0 0
>> r79 0x0 0
>> r80 0x0 0
>> r81 0x0 0
>> r82 0x0 0
>> r83 0x0 0
>> r84 0x0 0
>> r85 0x0 0
>> r86 0x0 0
>> r87 0x0 0
>> r88 0x0 0
>> r89 0x0 0
>> r90 0x0 0
>> r91 0x0 0
>> r92 0x0 0
>> r93 0x0 0
>> r94 0x0 0
>> r95 0x0 0
>> r96 0x0 0
>> r97 0x0 0
>> r98 0x0 0
>> r99 0x0 0
>> r100 0x0 0
>> r101 0x0 0
>> r102 0x0 0
>> r103 0x0 0
>> r104 0x0 0
>> r105 0x0 0
>> r106 0x0 0
>> r107 0x0 0
>> r108 0x0 0
>> r109 0x0 0
>> r110 0x0 0
>> r111 0x0 0
>> r112 0x0 0
>> r113 0x0 0
>> r114 0x0 0
>> r115 0x0 0
>> r116 0x0 0
>> r117 0x0 0
>> r118 0x0 0
>> r119 0x0 0
>> r120 0x0 0
>> r121 0x0 0
>> r122 0x0 0
>> r123 0x0 0
>> r124 0x0 0
>> r125 0x0 0
>> r126 0x0 0
>> r127 0x0 0
>> p0 0x1 1
>> p1 0x0 0
>> p2 0x0 0
>> p3 0x0 0
>> p4 0x0 0
>> p5 0x0 0
>> p6 0x1 1
>> p7 0x0 0
>> p8 0x1 1
>> p9 0x0 0
>> p10 0x0 0
>> p11 0x0 0
>> p12 0x0 0
>> p13 0x0 0
>> p14 0x1 1
>> p15 0x1 1
>> p16 0x0 0
>> p17 0x1 1
>> p18 0x0 0
>> p19 0x1 1
>> p20 0x1 1
>> p21 0x0 0
>> p22 0x1 1
>> p23 0x0 0
>> p24 0x0 0
>> p25 0x0 0
>> p26 0x0 0
>> p27 0x0 0
>> p28 0x0 0
>> p29 0x0 0
>> p30 0x0 0
>> p31 0x0 0
>> p32 0x0 0
>> p33 0x0 0
>> p34 0x0 0
>> p35 0x0 0
>> p36 0x0 0
>> p37 0x0 0
>> p38 0x0 0
>> p39 0x0 0
>> p40 0x0 0
>> p41 0x0 0
>> p42 0x0 0
>> p43 0x0 0
>> p44 0x0 0
>> p45 0x0 0
>> p46 0x0 0
>> p47 0x0 0
>> p48 0x0 0
>> p49 0x0 0
>> p50 0x0 0
>> p51 0x0 0
>> p52 0x0 0
>> p53 0x0 0
>> p54 0x0 0
>> p55 0x0 0
>> p56 0x0 0
>> p57 0x0 0
>> p58 0x0 0
>> p59 0x0 0
>> p60 0x0 0
>> p61 0x0 0
>> p62 0x0 0
>> p63 0x0 0
>> (gdb) si
>>
>> Program received signal SIGILL, Illegal instruction.
>> _ULia64_install_cursor () at ../../src/ia64/Ginstall_cursor.S:293
>> 293 mov.i ar.pfs = r14
>> 2: /x $r14 = 0x600000000001b498
>> 1: $r14 = 6917529027641193624
>> (gdb)
>>
>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>
>> #include <signal.h>
>> #include <sys/time.h>
>> #include <ucontext.h>
>> #include <stdlib.h>
>>
>>
>> ucontext_t main_ctx, eh_ctx, sched_ctx;
>>
>> char sched_stack[60000];
>> char eh_stack[60000];
>>
>> void eh (void) { // the eh context
>> for ( ; ; ) { // we loop indefinitely..until we crash
>> try {
>> throw 42;
>> } catch ( int ) { }
>> }
>>
>> }
>>
>> void sched (void) { sigset_t ss; // switch back to
>> the eh context
>> sigemptyset(&ss);
>> sigaddset(&ss, SIGALRM);
>> sigprocmask (SIG_BLOCK, &ss, NULL); // block SIGALRM,
>> for ( ; ; ) {
>> swapcontext(&sched_ctx, &eh_ctx);// re-schedule the eh context
>> }
>> }
>>
>>
>> void alrm ( int signum ) { // just switch (from eh) to sched
>> context
>> sigset_t ss;
>> sigemptyset(&ss);
>> sigaddset(&ss, SIGALRM);
>> sigprocmask (SIG_BLOCK, &ss, NULL); // block SIGALRM, redundant
>> // but still...
>>
>> swapcontext(&eh_ctx, &sched_ctx);
>> }
>>
>> int main() {
>> getcontext(&eh_ctx);
>> eh_ctx.uc_stack.ss_sp = eh_stack;
>> eh_ctx.uc_stack.ss_size = sizeof( eh_stack );
>> eh_ctx.uc_link = &main_ctx;
>> makecontext(&eh_ctx, eh, 0);
>>
>> getcontext(&sched_ctx);
>> sched_ctx.uc_stack.ss_sp = sched_stack;
>> sched_ctx.uc_stack.ss_size = sizeof( sched_stack );
>> sched_ctx.uc_link = NULL;
>> makecontext(&sched_ctx, sched, 0);
>>
>> // interrupt the eh context every 10 ms with a SIGALRM
>> itimerval it;
>> it.it_interval.tv_sec = 0;
>> it.it_interval.tv_usec = 10000;
>> it.it_value.tv_sec = 0; it.it_value.tv_usec = 10000;
>>
>> sigset_t ss;
>> sigemptyset(&ss);
>> sigaddset(&ss, SIGALRM);
>> sigprocmask (SIG_BLOCK, &ss, NULL); // block SIGALRM (just in case)
>>
>> signal (SIGALRM, alrm);
>> setitimer( ITIMER_REAL, &it, NULL );
>>
>> swapcontext(&main_ctx, &eh_ctx); // start the eh context
>>
>> }
>>
>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>>
>>> Peter A. Buhr wrote:
>>>>
>>>> The following appears to be a libunwind bug with respect to context
>>>> switching
>>>> and timeslicing, which occurs in our threading package. The program
>>>> below is
>>>> the simplest example that generates the failure. Here are additional
>>>> environment details. Please contact me if you require additional
>>>> details.
>>>>
>>>> @plg4[1]% uname -a
>>>> Linux plg4.uwaterloo.ca 2.6.25-2-mckinley #2 SMP Fri Jun 27 05:32:44 UTC
>>>> 2008 ia64 GNU/Linux
>>>> @plg4[2]% g++ -v test.cc
>>>> Using built-in specs.
>>>> Target: ia64-linux-gnu
>>>> Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1'
>>>> --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
>>>> --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared
>>>> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
>>>> --enable-threads=posix --enable-nls
>>>> --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3
>>>> --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
>>>> --enable-mpfr
>>>> --disable-libssp --with-system-libunwind --enable-checking=release
>>>> --build=ia64-linux-gnu --host=ia64-linux-gnu --target=ia64-linux-gnu
>>>> Thread model: posix
>>>> gcc version 4.3.2 (Debian 4.3.2-1) COLLECT_GCC_OPTIONS='-v'
>>>> '-shared-libgcc'
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/cc1plus -quiet -v -D_GNU_SOURCE
>>>> test.cc -quiet -dumpbase test.cc -auxbase test -version -o /tmp/ccgGQUbV.s
>>>> ignoring nonexistent directory "/usr/local/include/ia64-linux-gnu"
>>>> ignoring nonexistent directory
>>>> "/usr/lib/gcc/ia64-linux-gnu/4.3.2/../../../../ia64-linux-gnu/include"
>>>> ignoring nonexistent directory "/usr/include/ia64-linux-gnu"
>>>> #include "..." search starts here:
>>>> #include <...> search starts here:
>>>> /usr/include/c++/4.3
>>>> /usr/include/c++/4.3/ia64-linux-gnu
>>>> /usr/include/c++/4.3/backward
>>>> /usr/local/include
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/include
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/include-fixed
>>>> /usr/include
>>>> End of search list.
>>>> GNU C++ (Debian 4.3.2-1) version 4.3.2 (ia64-linux-gnu)
>>>> compiled by GNU C version 4.3.2, GMP version 4.2.2, MPFR version
>>>> 2.3.1.
>>>> GGC heuristics: --param ggc-min-expand=100 --param
>>>> ggc-min-heapsize=131072
>>>> Compiler executable checksum: 95c628cc090dee6f51aeb20e8aa4faf3
>>>> COLLECT_GCC_OPTIONS='-v' '-shared-libgcc'
>>>> as -x -o /tmp/ccWwmhkO.o /tmp/ccgGQUbV.s
>>>>
>>>> COMPILER_PATH=/usr/lib/gcc/ia64-linux-gnu/4.3.2/:/usr/lib/gcc/ia64-linux-gnu/4.3.2/:/usr/lib/gcc/ia64-linux-gnu/:/usr/lib/gcc/ia64-linux-gnu/4.3.2/:/usr/lib/gcc/ia64-linux-gnu/:/usr/lib/gcc/ia64-linux-gnu/4.3.2/:/usr/lib/gcc/ia64-linux-gnu/
>>>>
>>>> LIBRARY_PATH=/usr/lib/gcc/ia64-linux-gnu/4.3.2/:/usr/lib/gcc/ia64-linux-gnu/4.3.2/:/usr/lib/gcc/ia64-linux-gnu/4.3.2/../../../:/lib/:/usr/lib/
>>>> COLLECT_GCC_OPTIONS='-v' '-shared-libgcc'
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/collect2 --hash-style=both
>>>> -dynamic-linker /lib/ld-linux-ia64.so.2
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/../../../crt1.o
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/../../../crti.o
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/crtbegin.o
>>>> -L/usr/lib/gcc/ia64-linux-gnu/4.3.2 -L/usr/lib/gcc/ia64-linux-gnu/4.3.2
>>>> -L/usr/lib/gcc/ia64-linux-gnu/4.3.2/../../.. /tmp/ccWwmhkO.o -lstdc++ -lm
>>>> -lgcc_s -lunwind -lgcc -lc -lgcc_s -lunwind -lgcc
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/crtend.o
>>>> /usr/lib/gcc/ia64-linux-gnu/4.3.2/../../../crtn.o
>>>> @plg4[3]% ldd a.out
>>>> linux-gate.so.1 => (0xa000000000000000)
>>>> libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x2000000000050000)
>>>> libm.so.6.1 => /lib/libm.so.6.1 (0x2000000000224000)
>>>> libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x20000000002f4000)
>>>> libunwind.so.7 => /lib/libunwind.so.7 (0x2000000000318000)
>>>> libc.so.6.1 => /lib/libc.so.6.1 (0x2000000000360000)
>>>> /lib/ld-linux-ia64.so.2 (0x2000000000000000)
>>>> @plg4[4]% a.out
>>>> Illegal instruction (core dumped)
>>>>
>>>> ================================= test.cc
>>>> ================================
>>>>
>>>> #include <signal.h>
>>>> #include <sys/time.h>
>>>> #include <ucontext.h>
>>>> #include <stdlib.h>
>>>>
>>>> ucontext_t main_ctx, eh_ctx, sched_ctx;
>>>>
>>>> char sched_stack[60000];
>>>> char eh_stack[60000];
>>>>
>>>> void eh (void) { // the eh context
>>>> for ( ; ; ) { // yes, we loop indefinitely ...
>>>> until we crash
>>>> try {
>>>> throw 42;
>>>> } catch ( int ) { }
>>>> }
>>>> }
>>>>
>>>> void sched (void) { // the scheduler' context, all it
>>>> does is switch back to the eh context
>>>> for ( ; ; ) {
>>>> swapcontext(&sched_ctx, &eh_ctx); // re-schedule the eh
>>>> context
>>>> }
>>>> }
>>>>
>>>>
>>>> void alrm ( int signum ) { // signal handler just
>>>> switches (from the eh) to the sched context
>>>> swapcontext(&eh_ctx, &sched_ctx);
>>>> }
>>>>
>>>> int main() {
>>>> getcontext(&eh_ctx);
>>>> eh_ctx.uc_stack.ss_sp = eh_stack;
>>>> eh_ctx.uc_stack.ss_size = sizeof( eh_stack );
>>>> eh_ctx.uc_link = &main_ctx;
>>>> makecontext(&eh_ctx, eh, 0);
>>>>
>>>> getcontext(&sched_ctx);
>>>> sched_ctx.uc_stack.ss_sp = sched_stack;
>>>> sched_ctx.uc_stack.ss_size = sizeof( sched_stack );
>>>> sched_ctx.uc_link = NULL;
>>>> makecontext(&sched_ctx, sched, 0);
>>>>
>>>> // interrupt the eh context every 10 ms with a SIGALRM
>>>> itimerval it; it.it_interval.tv_sec = 0;
>>>> it.it_interval.tv_usec = 10000;
>>>> it.it_value.tv_sec = 0; it.it_value.tv_usec = 10000;
>>>>
>>>> signal (SIGALRM, alrm);
>>>> setitimer( ITIMER_REAL, &it, NULL );
>>>>
>>>> swapcontext(&main_ctx, &eh_ctx); // start the eh context
>>>> }
>>>>
>>>>
>>>> _______________________________________________
>>>> Libunwind-devel mailing list
>>>> address@hidden
>>>> http://lists.nongnu.org/mailman/listinfo/libunwind-devel
>>>>
>>>
>>> --
>>> Oracle Email Signature Logo
>>> Tom Honermann | Senior Principal Software Engineer | 503.276.2354
>>> Oracle PeopleTools Development
>>> 1211 SW 5th Ave, Suite 9080, Portland, OR 97204
>>
>
>
> _______________________________________________
> Libunwind-devel mailing list
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/libunwind-devel
>
--
Mosberger Consulting LLC, http://www.mosberger-consulting.com/