kern/131597: [kernel] c++ exceptions very slow on FreeBSD 7.1/amd64

Kostik Belousov kostikbel at
Fri Apr 23 17:16:13 UTC 2010

The following reply was made to PR kern/131597; it has been noted by GNATS.

From: Kostik Belousov <kostikbel at>
To: John Baldwin <jhb at>
Cc: bug-followup at, guillaume at, kan at,
        davidxu at
Subject: Re: kern/131597: [kernel] c++ exceptions very slow on FreeBSD 7.1/amd64
Date: Fri, 23 Apr 2010 16:47:40 +0300

 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 Content-Transfer-Encoding: quoted-printable
 On Fri, Apr 23, 2010 at 08:43:41AM -0400, John Baldwin wrote:
 > On Friday 23 April 2010 8:25:01 am Kostik Belousov wrote:
 > > On Thu, Apr 22, 2010 at 04:09:34PM -0400, John Baldwin wrote:
 > > > I tracked the sigprocmask() system calls down to the operations to
 > > > acquire a write lock in the runtime linker. The lock was added to fix
 > > > an earlier bug with throwing exceptions in multithreaded C++ apps. The
 > > > relevant commit that added the lock is this:
 > > >
 > > >
 > > >
 > > > Are exceptions permitted during a signal handler? If not, then in
 > > > theory we would not need to invoke sigprocmask() for this particular
 > > > lock perhaps? I'm not sure how easy that would be to achieve given the
 > > > hooks to allow the thread library to overload the locking routines.
 > > > Also, this doesn't explain the lack of sigprocmask() calls under i386.
 > > > FreeBSD/i386 should be using the same locking code and thus invoking
 > > > sigprocmask() for each exception as well.
 > >=20
 > > Throwing an exception during asyncronous signal execution rises undefin=
 > > behaviour, AFAIK. sigprocmask() is there to support libc_r, and cannot
 > > be removed as far as we need to provide FreeBSD 4.x compatibility.
 > Hmmm.  Why does libthr use sigprocmask() for its rtld locks then?  Is tha=
 > just a copy-paste from libc_r that can be removed now?
 Hmmm^2. It seems it is there to prevent recursive entry into rtld from
 signal handler, that may reference yet unresolved symbol, e.g. libc
 syscall wrapper, from PLT. So my patch is wrong.
 Content-Type: application/pgp-signature
 Content-Disposition: inline
 Version: GnuPG v1.4.10 (FreeBSD)

More information about the freebsd-bugs mailing list