summaryrefslogtreecommitdiff
path: root/libitm/retry.cc
diff options
context:
space:
mode:
authorTorvald Riegel <triegel@redhat.com>2012-02-14 13:14:12 +0000
committerTorvald Riegel <torvald@gcc.gnu.org>2012-02-14 13:14:12 +0000
commit5b9cf5d2bf66a36b0716e07044d492b91dd835a2 (patch)
tree0c010bcc192851eb16058d7cb732414acc193075 /libitm/retry.cc
parent7d33bcb73866d5310b4eb190172240bcb71f51f6 (diff)
downloadgcc-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.cc27
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());
+ }
}
}