libitm: Handle HTM fastpath in status query functions.
* query.cc (_ITM_inTransaction): Abort when using the HTM fastpath. (_ITM_getTransactionId): Same. * config/x86/target.h (htm_transaction_active): New. From-SVN: r200251
This commit is contained in:
parent
b1db457bf9
commit
480c696bb0
3 changed files with 27 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2013-06-20 Torvald Riegel <triegel@redhat.com>
|
||||
|
||||
* query.cc (_ITM_inTransaction): Abort when using the HTM fastpath.
|
||||
(_ITM_getTransactionId): Same.
|
||||
* config/x86/target.h (htm_transaction_active): New.
|
||||
|
||||
2013-06-20 Torvald Riegel <triegel@redhat.com>
|
||||
|
||||
PR libitm/57643
|
||||
|
|
|
@ -125,6 +125,13 @@ htm_abort_should_retry (uint32_t begin_ret)
|
|||
{
|
||||
return begin_ret & _XABORT_RETRY;
|
||||
}
|
||||
|
||||
/* Returns true iff a hardware transaction is currently being executed. */
|
||||
static inline bool
|
||||
htm_transaction_active ()
|
||||
{
|
||||
return _xtest() != 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -43,6 +43,15 @@ _ITM_libraryVersion (void)
|
|||
_ITM_howExecuting ITM_REGPARM
|
||||
_ITM_inTransaction (void)
|
||||
{
|
||||
#if defined(USE_HTM_FASTPATH)
|
||||
// If we use the HTM fastpath, we cannot reliably detect whether we are
|
||||
// in a transaction because this function can be called outside of
|
||||
// a transaction and thus we can't deduce this by looking at just the serial
|
||||
// lock. This function isn't used in practice currently, so the easiest
|
||||
// way to handle it is to just abort.
|
||||
if (htm_fastpath && htm_transaction_active())
|
||||
htm_abort();
|
||||
#endif
|
||||
struct gtm_thread *tx = gtm_thr();
|
||||
if (tx && (tx->nesting > 0))
|
||||
{
|
||||
|
@ -58,6 +67,11 @@ _ITM_inTransaction (void)
|
|||
_ITM_transactionId_t ITM_REGPARM
|
||||
_ITM_getTransactionId (void)
|
||||
{
|
||||
#if defined(USE_HTM_FASTPATH)
|
||||
// See ITM_inTransaction.
|
||||
if (htm_fastpath && htm_transaction_active())
|
||||
htm_abort();
|
||||
#endif
|
||||
struct gtm_thread *tx = gtm_thr();
|
||||
return (tx && (tx->nesting > 0)) ? tx->id : _ITM_noTransactionId;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue