Fast sigblock (AKA rtld speedup)
Jilles Tjoelker
jilles at stack.nl
Sun Jan 13 13:32:02 UTC 2013
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();
}
}
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);
}
--
Jilles Tjoelker
More information about the freebsd-toolchain
mailing list