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:
Torvald Riegel 2013-06-20 16:40:54 +00:00 committed by Torvald Riegel
parent b1db457bf9
commit 480c696bb0
3 changed files with 27 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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;
}