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;