diff options
author | Torvald Riegel <triegel@redhat.com> | 2012-02-14 13:14:12 +0000 |
---|---|---|
committer | Torvald Riegel <torvald@gcc.gnu.org> | 2012-02-14 13:14:12 +0000 |
commit | 5b9cf5d2bf66a36b0716e07044d492b91dd835a2 (patch) | |
tree | 0c010bcc192851eb16058d7cb732414acc193075 /libitm/retry.cc | |
parent | 7d33bcb73866d5310b4eb190172240bcb71f51f6 (diff) | |
download | gcc-5b9cf5d2bf66a36b0716e07044d492b91dd835a2.tar.gz |
libitm: Improve method reinit and choice.
libitm/
* dispatch.h (GTM::abi_dispatch::supports): New.
(GTM::method_group::reinit): New.
* retry.cc (GTM::gtm_thread::decide_retry_strategy): Use reinit().
(GTM::gtm_thread::number_of_threads_changed): Check that the method
supports the current situation.
From-SVN: r184211
Diffstat (limited to 'libitm/retry.cc')
-rw-r--r-- | libitm/retry.cc | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/libitm/retry.cc b/libitm/retry.cc index decd7731b46..761a066e834 100644 --- a/libitm/retry.cc +++ b/libitm/retry.cc @@ -58,11 +58,8 @@ GTM::gtm_thread::decide_retry_strategy (gtm_restart_reason r) serial_lock.read_unlock(this); serial_lock.write_lock(); if (disp->get_method_group() == default_dispatch->get_method_group()) - { - // Still the same method group. - disp->get_method_group()->fini(); - disp->get_method_group()->init(); - } + // Still the same method group. + disp->get_method_group()->reinit(); serial_lock.write_unlock(); serial_lock.read_lock(this); if (disp->get_method_group() != default_dispatch->get_method_group()) @@ -72,11 +69,8 @@ GTM::gtm_thread::decide_retry_strategy (gtm_restart_reason r) } } else - { - // We are a serial transaction already, which makes things simple. - disp->get_method_group()->fini(); - disp->get_method_group()->init(); - } + // We are a serial transaction already, which makes things simple. + disp->get_method_group()->reinit(); } bool retry_irr = (r == RESTART_SERIAL_IRR); @@ -249,7 +243,7 @@ GTM::gtm_thread::number_of_threads_changed(unsigned previous, unsigned now) // Only one thread, so use a serializing method. // ??? If we don't have a fast serial mode implementation, it might be // better to use the global lock method set here. - if (default_dispatch_user) + if (default_dispatch_user && default_dispatch_user->supports(now)) set_default_dispatch(default_dispatch_user); else set_default_dispatch(dispatch_serialirr()); @@ -257,9 +251,16 @@ GTM::gtm_thread::number_of_threads_changed(unsigned previous, unsigned now) else if (now > 1 && previous <= 1) { // More than one thread, use the default method. - if (default_dispatch_user) + if (default_dispatch_user && default_dispatch_user->supports(now)) set_default_dispatch(default_dispatch_user); else - set_default_dispatch(dispatch_serialirr_onwrite()); + { + abi_dispatch* a = dispatch_serialirr_onwrite(); + if (a->supports(now)) + set_default_dispatch(a); + else + // Serial-irrevocable mode always works. + set_default_dispatch(dispatch_serialirr()); + } } } |