kern/131597: [kernel] c++ exceptions very slow on FreeBSD
7.1/amd64
David Xu
davidxu at freebsd.org
Tue Sep 14 06:10:04 UTC 2010
The following reply was made to PR kern/131597; it has been noted by GNATS.
From: David Xu <davidxu at freebsd.org>
To: John Baldwin <jhb at freebsd.org>
Cc: Kostik Belousov <kostikbel at gmail.com>, bug-followup at freebsd.org,
guillaume at morinfr.org, kan at freebsd.org
Subject: Re: kern/131597: [kernel] c++ exceptions very slow on FreeBSD 7.1/amd64
Date: Tue, 14 Sep 2010 14:00:13 +0000
John Baldwin wrote:
> Do we know of any use cases where libunwind would be used from a signal
> handler? Could we instead simply declare it to be an unsafe API in a signal
> context? longjmp(3) isn't safe in a signal context and throwing exceptions
> in a signal handler is undefined, so declaring libunwind to similarly be
> unsafe may be fine.
>
It is true that libunwind would be used from a signal handler.
In fact, when I was working on stack unwinding support for libthr, I
found it.
The reason I was trying to do it is that I want to let C++'s on-stack
object to be destructed when thread is exited, otherwise, C++ program
can not use pthread cancellation feature, the pthread cancellation
calls pthread_exit(), and the function should unwind the thread's stack
for C++ like language, otherwise the programs leak resource.
In head branch, things are improved, for defer-mod, thread cancellation
is called from in-place context, but for asynchronous mode, thread
cancellation is called from a signal handler, the SIGCANCEL hanlder, so
the libunwind needs to dig out the saved context and unwind the
interrupted stack.
A very bad news is libunwind only did unwind-through-signal-stack for
linux, nothing has been done for FreeBSD and others, code has been
found here:
/usr/src/contrib/gcc/config/i386/linux-unwind.h
I even have a patch for FreeBSD x86 to support the
unwind-through-signal-stack, but I have not fully tested it.
http://people.freebsd.org/~davidxu/patch/unwind.patch
You can say this is a crazy idea, but they did it.
>>> OTOH, I'm not sure why libthr needs to use non-standard lock hooks at
>>> this point as they don't seem to be markedly different from the ones
>>> rtld uses.
>> libthr locks provide exclusion both for other kernel-executed threads
>> and signal handlers, while the rtld-default locks only protect against
>> signal handlers and thus libc_r-style threads.
>
> Oh, bah. The rtld locks do use atomic operations that are thread safe,
> but I missed that the 'oldsigmask' global needs to be per-thread.
>
In head branch, when program is linked with libthr, and created a
thread, the libthr's rtld lock implementation is activated,
performance should be improved, but otherwise, it is still slow for
non-threaded C++ program.
More information about the freebsd-bugs
mailing list