mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
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.
This commit is contained in:
parent
a66480374e
commit
71a5964c11
1 changed files with 9 additions and 4 deletions
|
@ -1825,12 +1825,17 @@ scm_std_select (int nfds,
|
||||||
|
|
||||||
int
|
int
|
||||||
scm_pthread_mutex_lock (scm_i_pthread_mutex_t *mutex)
|
scm_pthread_mutex_lock (scm_i_pthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (scm_i_pthread_mutex_trylock (mutex) == 0)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
scm_t_guile_ticket t = scm_leave_guile ();
|
scm_t_guile_ticket t = scm_leave_guile ();
|
||||||
int res = scm_i_pthread_mutex_lock (mutex);
|
int res = scm_i_pthread_mutex_lock (mutex);
|
||||||
scm_enter_guile (t);
|
scm_enter_guile (t);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_unlock (void *data)
|
do_unlock (void *data)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue