diff options
author | torvald <torvald@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-06-20 16:40:38 +0000 |
---|---|---|
committer | torvald <torvald@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-06-20 16:40:38 +0000 |
commit | 00b76ca9c06e131110fb83e1de821d7d69f46bd2 (patch) | |
tree | 8928a26da25237053ba123d609fec2b28f64361d /libitm | |
parent | 566da47ba10a0acd6d9cefea53eed4ba1fef6db6 (diff) | |
download | gcc-00b76ca9c06e131110fb83e1de821d7d69f46bd2.tar.gz |
libitm: Fix handling of reentrancy in the HTM fastpath.
PR libitm/57643
* beginend.cc (gtm_thread::begin_transaction): Handle reentrancy in
the HTM fastpath.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@200250 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libitm')
-rw-r--r-- | libitm/ChangeLog | 6 | ||||
-rw-r--r-- | libitm/beginend.cc | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog index ed9114b9147..26001b670bd 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,3 +1,9 @@ +2013-06-20 Torvald Riegel <triegel@redhat.com> + + PR libitm/57643 + * beginend.cc (gtm_thread::begin_transaction): Handle reentrancy in + the HTM fastpath. + 2013-03-31 Gerald Pfeifer <gerald@pfeifer.com> PR bootstrap/56714 diff --git a/libitm/beginend.cc b/libitm/beginend.cc index 93e702efc9e..a3bf5492153 100644 --- a/libitm/beginend.cc +++ b/libitm/beginend.cc @@ -197,6 +197,8 @@ GTM::gtm_thread::begin_transaction (uint32_t prop, const gtm_jmpbuf *jb) // We are executing a transaction now. // Monitor the writer flag in the serial-mode lock, and abort // if there is an active or waiting serial-mode transaction. + // Note that this can also happen due to an enclosing + // serial-mode transaction; we handle this case below. if (unlikely(serial_lock.is_write_locked())) htm_abort(); else @@ -219,6 +221,14 @@ GTM::gtm_thread::begin_transaction (uint32_t prop, const gtm_jmpbuf *jb) tx = new gtm_thread(); set_gtm_thr(tx); } + // Check whether there is an enclosing serial-mode transaction; + // if so, we just continue as a nested transaction and don't + // try to use the HTM fastpath. This case can happen when an + // outermost relaxed transaction calls unsafe code that starts + // a transaction. + if (tx->nesting > 0) + break; + // Another thread is running a serial-mode transaction. Wait. serial_lock.read_lock(tx); serial_lock.read_unlock(tx); // TODO We should probably reset the retry count t here, unless |