17 #ifndef __TBB__x86_rtm_rw_mutex_impl_H    18 #define __TBB__x86_rtm_rw_mutex_impl_H    20 #ifndef __TBB_spin_rw_mutex_H    21 #error Do not #include this internal file directly; use public TBB headers instead.    24 #if __TBB_TSX_AVAILABLE    26 #include "../tbb_stddef.h"    27 #include "../tbb_machine.h"    28 #include "../tbb_profiling.h"    29 #include "../spin_rw_mutex.h"    32 namespace interface8 {
    37     RTM_transacting_reader,
    38     RTM_transacting_writer,
    43 static const unsigned long speculation_granularity = 64;
    49 #if __TBB_USE_X86_RTM_RW_MUTEX || __TBB_GCC_VERSION < 40000    56     friend class interface7::internal::padded_mutex<x86_rtm_rw_mutex,true>;
    58     friend class scoped_lock;
    67     void __TBB_EXPORTED_METHOD internal_acquire_writer(x86_rtm_rw_mutex::scoped_lock&, 
bool only_speculate=
false);
    71     void __TBB_EXPORTED_METHOD internal_acquire_reader(x86_rtm_rw_mutex::scoped_lock&, 
bool only_speculate=
false);
    85     static x86_rtm_rw_mutex* internal_get_mutex( 
const spin_rw_mutex::scoped_lock& 
lock )
    87         return static_cast<x86_rtm_rw_mutex*>( 
lock.mutex );
    89     static void internal_set_mutex( spin_rw_mutex::scoped_lock& 
lock, 
spin_rw_mutex* mtx )
    98 #if TBB_USE_THREADING_TOOLS   104     ~x86_rtm_rw_mutex() {}
   109     static const bool is_rw_mutex = 
true;
   110     static const bool is_recursive_mutex = 
false;
   111     static const bool is_fair_mutex = 
false;
   113 #if __TBB_USE_X86_RTM_RW_MUTEX || __TBB_GCC_VERSION < 40000   129         friend class x86_rtm_rw_mutex;
   130         spin_rw_mutex::scoped_lock my_scoped_lock;
   132         RTM_type transaction_state;
   137         scoped_lock() : my_scoped_lock(), transaction_state(RTM_not_in_mutex) {
   141         scoped_lock( x86_rtm_rw_mutex& m, 
bool write = 
true ) : my_scoped_lock(),
   142             transaction_state(RTM_not_in_mutex) {
   148             if(transaction_state != RTM_not_in_mutex) 
release();
   152         void acquire( x86_rtm_rw_mutex& m, 
bool write = 
true ) {
   153             if( write ) m.internal_acquire_writer(*
this);
   154             else        m.internal_acquire_reader(*
this);
   159             x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
   161             __TBB_ASSERT( transaction_state!=RTM_not_in_mutex, 
"lock is not acquired" );
   162             return mutex->internal_release(*
this);
   167         bool upgrade_to_writer() {
   168             x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
   170             if (transaction_state == RTM_transacting_writer || transaction_state == RTM_real_writer)
   172             return mutex->internal_upgrade(*
this);
   177         bool downgrade_to_reader() {
   178             x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
   180             if (transaction_state == RTM_transacting_reader || transaction_state == RTM_real_reader)
   182             return mutex->internal_downgrade(*
this);
   187         bool try_acquire( x86_rtm_rw_mutex& m, 
bool write = 
true ) {
   189             x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
   194             if(write) 
return m.internal_try_acquire_writer(*
this);
   196             m.internal_acquire_reader(*
this, 
true);
   197             if(transaction_state == RTM_transacting_reader) 
return true;
   198             if( my_scoped_lock.try_acquire(m, 
false)) {
   199                 transaction_state = RTM_real_reader;
   214     tbb::atomic<bool> w_flag;  
 spin_rw_mutex_v3 spin_rw_mutex
 
Base class for types that should not be copied or assigned.
 
#define __TBB_EXPORTED_METHOD
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock