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