summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@raeburn.org>2009-08-26 23:30:59 +0100
committerNeil Jerram <neil@ossau.uklinux.net>2009-08-26 23:36:19 +0100
commit71a5964c110bea93ac926331547c25bdff67ce23 (patch)
tree3e5286a08863c0136d72553840b0b5b23a4dd52e
parenta66480374ed6dfc2d012c6df39c1382ba87ed9d0 (diff)
downloadguile-71a5964c110bea93ac926331547c25bdff67ce23.tar.gz
Don't leave and reenter guile mode if mutex is available
On Aug 5, 2009, at 10:06, Ken Raeburn wrote: > (1) In scm_pthread_mutex_lock, we leave and re-enter guile mode so > that we don't block the thread while in guile mode. But we could > use pthread_mutex_trylock first, and avoid the costs scm_leave_guile > seems to incur on the Mac. If we can't acquire the lock, it should > return immediately, and then we can do the expensive, blocking > version. A quick, hack version of this changed my run time for > A(3,8) from 17.5s to 14.5s, saving about 17%; sigaltstack and > sigprocmask are still in the picture, because they're called from > scm_catch_with_pre_unwind_handler. I'll work up a nicer patch > later. Ah, we already had scm_i_pthread_mutex_trylock lying around; that made things easy. A second timing test with A(3,9) and this version of the patch (based on 1.9.1) shows the same improvement. * libguile/threads.c (scm_pthread_mutex_lock): Try the mutex before leaving and reentering guile mode.
-rw-r--r--libguile/threads.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/libguile/threads.c b/libguile/threads.c
index 1721e0b28..e468f2fd5 100644
--- a/libguile/threads.c
+++ b/libguile/threads.c
@@ -1826,10 +1826,15 @@ scm_std_select (int nfds,
int
scm_pthread_mutex_lock (scm_i_pthread_mutex_t *mutex)
{
- scm_t_guile_ticket t = scm_leave_guile ();
- int res = scm_i_pthread_mutex_lock (mutex);
- scm_enter_guile (t);
- return res;
+ if (scm_i_pthread_mutex_trylock (mutex) == 0)
+ return 0;
+ else
+ {
+ scm_t_guile_ticket t = scm_leave_guile ();
+ int res = scm_i_pthread_mutex_lock (mutex);
+ scm_enter_guile (t);
+ return res;
+ }
}
static void