pthread_cancel と c++ exception
この間の sys-libs/glibc-2.3.6-r3 が契機だと思うんだけど、pthread_cancel で強制終了させたスレッドでは、例外が発生するようだ。
いきなり throw が発生しているように見えてびっくりな感じ。
さらに、スレッド関数(staticなメンバ関数)では c++ 例外を外に出さないように
catch (...)
としていたら、
FATAL: exception not rethrown
といわれて、abort する始末。やれやれ。スタックトレースはこんな感じ。
Program received signal SIGABRT, Aborted. [Switching to Thread -1210803280 (zombie)] 0xffffe410 in __kernel_vsyscall () (gdb) bt #0 0xffffe410 in __kernel_vsyscall () #1 0xb7d73261 in raise () from /lib/libc.so.6 #2 0xb7d749f9 in abort () from /lib/libc.so.6 #3 0xb7f780cd in unwind_cleanup () from /lib/libpthread.so.0 #4 0xb7e6b91f in _Unwind_DeleteException () from /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/libgcc_s.so.1 #5 0xb7f36e81 in __cxa_end_catch () from /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/libstdc++.so.6 #6 0xb7f67fc3 in Thread::ThreadFunction (io_Param=0xbfaa02a0) at Thread.cpp:1240 #7 0xb7f73420 in start_thread () from /lib/libpthread.so.0 #8 0xb7e0439e in clone () from /lib/libc.so.6
とりあえず、catch (...) を抜くと、上記のメッセージは収まって、cleanup ハンドラも動いて、良い感じ。
libstd++ の中で始まった throw がどういう経路でおさまっているのかがよくわからないが、自分のケースでは cleanup ハンドラが効いているので大丈夫そう(かな?)。
カーネルはこんな感じで
Linux version 2.6.15-gentoo-r4 (root@allegro) (gcc version 3.4.5 (Gentoo 3.4.5, ssp-3.4.5-1.0, pie-8.7.9)) #2 Thu Feb 9 01:38:15 JST 2006
glibc は NTPL(only)で emerge している。gentoo 固有の問題ではないと思うんだけど。
誰か、詳細キボヌ...