On Sun, Jan 13, 2013 at 02:32:00PM +0100, Jilles Tjoelker wrote: > On Sat, Jan 12, 2013 at 05:25:47PM +0100, Jilles Tjoelker wrote: > > This suggests a different rather simpler change. Libthr can always use > > its rtld lock implementation instead of only when multiple threads > > exist. This avoids the sigprocmask() syscalls and should not be much > > slower than the default implementation in rtld because that also > > contains atomic operations (both the unpatched and the patched version). > > People that care about performance of exceptions can then link in libthr > > (in many cases, it is already linked in to allow for (the possibility > > of) threading). > > > I have tested this and exceptions were indeed more than twice as fast in > > my test program if I created an extra thread doing nothing than in the > > fully single-threaded version (with or without libthr). > > Here is a patch. It is lightly tested. > > The function _thr_rtld_fini() can be removed afterwards because it is no > longer used. > > Index: lib/libthr/thread/thr_init.c > =================================================================== > --- lib/libthr/thread/thr_init.c (revision 244639) > +++ lib/libthr/thread/thr_init.c (working copy) > @@ -363,6 +363,7 @@ > _thr_signal_init(); > if (_thread_event_mask & TD_CREATE) > _thr_report_creation(curthread, curthread); > + _thr_rtld_init(); Please add a comment there, describing the reason for initializing threaded rtld locks.
> }
> }
>
> Index: lib/libthr/thread/thr_kern.c
> ===================================================================
> --- lib/libthr/thread/thr_kern.c (revision 244639)
> +++ lib/libthr/thread/thr_kern.c (working copy)
> @@ -57,11 +57,6 @@
> return (0);
>
> __isthreaded = threaded;
> - if (threaded != 0) {
> - _thr_rtld_init();
> - } else {
> - _thr_rtld_fini();
> - }
> return (0);
> }
I do not object.
pgpgZdGDX6FzP.pgp
Description: PGP signature
