21 #ifndef __TBB__x86_rtm_rw_mutex_impl_H 22 #define __TBB__x86_rtm_rw_mutex_impl_H 24 #ifndef __TBB_spin_rw_mutex_H 25 #error Do not #include this internal file directly; use public TBB headers instead. 28 #if __TBB_TSX_AVAILABLE 30 #include "../tbb_stddef.h" 31 #include "../tbb_machine.h" 32 #include "../tbb_profiling.h" 33 #include "../spin_rw_mutex.h" 36 namespace interface8 {
41 RTM_transacting_reader,
42 RTM_transacting_writer,
47 static const unsigned long speculation_granularity = 64;
53 #if __TBB_USE_X86_RTM_RW_MUTEX || __TBB_GCC_VERSION < 40000 60 friend class interface7::internal::padded_mutex<x86_rtm_rw_mutex,true>;
62 friend class scoped_lock;
71 void __TBB_EXPORTED_METHOD internal_acquire_writer(x86_rtm_rw_mutex::scoped_lock&,
bool only_speculate=
false);
75 void __TBB_EXPORTED_METHOD internal_acquire_reader(x86_rtm_rw_mutex::scoped_lock&,
bool only_speculate=
false);
89 static x86_rtm_rw_mutex* internal_get_mutex(
const spin_rw_mutex::scoped_lock&
lock )
91 return static_cast<x86_rtm_rw_mutex*>(
lock.mutex );
93 static void internal_set_mutex( spin_rw_mutex::scoped_lock&
lock,
spin_rw_mutex* mtx )
102 #if TBB_USE_THREADING_TOOLS 103 internal_construct();
108 ~x86_rtm_rw_mutex() {}
113 static const bool is_rw_mutex =
true;
114 static const bool is_recursive_mutex =
false;
115 static const bool is_fair_mutex =
false;
117 #if __TBB_USE_X86_RTM_RW_MUTEX || __TBB_GCC_VERSION < 40000 133 friend class x86_rtm_rw_mutex;
134 spin_rw_mutex::scoped_lock my_scoped_lock;
136 RTM_type transaction_state;
141 scoped_lock() : my_scoped_lock(), transaction_state(RTM_not_in_mutex) {
145 scoped_lock( x86_rtm_rw_mutex& m,
bool write =
true ) : my_scoped_lock(),
146 transaction_state(RTM_not_in_mutex) {
152 if(transaction_state != RTM_not_in_mutex)
release();
156 void acquire( x86_rtm_rw_mutex& m,
bool write =
true ) {
157 if( write ) m.internal_acquire_writer(*
this);
158 else m.internal_acquire_reader(*
this);
163 x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
165 __TBB_ASSERT( transaction_state!=RTM_not_in_mutex,
"lock is not acquired" );
166 return mutex->internal_release(*
this);
171 bool upgrade_to_writer() {
172 x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
174 if (transaction_state == RTM_transacting_writer || transaction_state == RTM_real_writer)
176 return mutex->internal_upgrade(*
this);
181 bool downgrade_to_reader() {
182 x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
184 if (transaction_state == RTM_transacting_reader || transaction_state == RTM_real_reader)
186 return mutex->internal_downgrade(*
this);
191 bool try_acquire( x86_rtm_rw_mutex& m,
bool write =
true ) {
193 x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);
198 if(write)
return m.internal_try_acquire_writer(*
this);
200 m.internal_acquire_reader(*
this,
true);
201 if(transaction_state == RTM_transacting_reader)
return true;
202 if( my_scoped_lock.try_acquire(m,
false)) {
203 transaction_state = RTM_real_reader;
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Base class for types that should not be copied or assigned.
#define __TBB_EXPORTED_METHOD
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
spin_rw_mutex_v3 spin_rw_mutex