{
return pthread_self();
}
-
- /// Checks if thread \p id is alive
- static inline bool is_thread_alive( ThreadId id )
- {
- // if sig is zero, error checking is performed but no signal is actually sent.
- // ESRCH - No thread could be found corresponding to that specified by the given thread ID
- // Unresolved problem: Linux may crash on dead thread_id. Workaround unknown (except signal handler...)
- return pthread_kill( id, 0 ) != ESRCH;
- }
} // namespace posix
//@cond
{
return ::GetCurrentThreadId();
}
-
- /// Tests whether the thread is alive
- static inline bool is_thread_alive( ThreadId id )
- {
- HANDLE h = ::OpenThread( SYNCHRONIZE, FALSE, id );
- if ( h == nullptr )
- return false;
- ::CloseHandle( h );
- return true;
- }
} // namespace Win32
//@cond
#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
using Win32::ThreadId;
using Win32::get_current_thread_id;
- using Win32::is_thread_alive;
#endif
//@endcond
assert( p->m_list.m_idOwner.load( atomics::memory_order_relaxed ) == nullThreadId
|| p->m_list.m_idOwner.load( atomics::memory_order_relaxed ) == mainThreadId
- || !cds::OS::is_thread_alive( p->m_list.m_idOwner.load( atomics::memory_order_relaxed ))
);
al.Delete( p );
for ( thread_record* hprec = pHead; hprec; hprec = pNext )
{
assert( hprec->m_idOwner.load( atomics::memory_order_relaxed ) == nullThreadId
- || hprec->m_idOwner.load( atomics::memory_order_relaxed ) == mainThreadId
- || !cds::OS::is_thread_alive( hprec->m_idOwner.load( atomics::memory_order_relaxed ) )
+ || hprec->m_idOwner.load( atomics::memory_order_relaxed ) == mainThreadId )
);
retired_array& retired = hprec->retired_;
const cds::OS::ThreadId curThreadId = cds::OS::get_current_thread_id();
for ( thread_record* hprec = thread_list_.load( atomics::memory_order_acquire ); hprec; hprec = hprec->m_pNextNode.load( atomics::memory_order_relaxed ) )
{
+ if ( hprec == static_cast<thread_record*>( pThis ))
+ continue;
+
// If m_bFree == true then hprec->retired_ is empty - we don't need to see it
if ( hprec->m_bFree.load( atomics::memory_order_acquire ) ) {
assert( hprec->retired_.empty() );
// Several threads may work concurrently so we use atomic technique
{
cds::OS::ThreadId curOwner = hprec->m_idOwner.load( atomics::memory_order_relaxed );
- if ( curOwner == nullThreadId || !cds::OS::is_thread_alive( curOwner ) ) {
+ if ( curOwner == nullThreadId ) {
if ( !hprec->m_idOwner.compare_exchange_strong( curOwner, curThreadId, atomics::memory_order_acquire, atomics::memory_order_relaxed ) )
continue;
}
}
// We own the thread record successfully. Now, we can see whether it has retired pointers.
- // If it has ones then we move to pThis that is private for current thread.
+ // If it has ones then we move them to pThis that is private for current thread.
retired_array& src = hprec->retired_;
retired_array& dest = pThis->retired_;
for ( thread_record* hprec = pHead; hprec; hprec = pNext )
{
assert( hprec->m_idOwner.load( atomics::memory_order_relaxed ) == nullThreadId
- || hprec->m_idOwner.load( atomics::memory_order_relaxed ) == mainThreadId
- || !cds::OS::is_thread_alive( hprec->m_idOwner.load( atomics::memory_order_relaxed ) )
+ || hprec->m_idOwner.load( atomics::memory_order_relaxed ) == mainThreadId )
);
retired_array& arr = hprec->retired_;
CDS_EXPORT_API void smr::free_thread_data( smr::thread_record* pRec )
{
assert( pRec != nullptr );
- //CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_RetireHPRec )
pRec->hazards_.clear();
scan( pRec );
const cds::OS::ThreadId curThreadId = cds::OS::get_current_thread_id();
for ( thread_record* hprec = thread_list_.load( atomics::memory_order_acquire ); hprec; hprec = hprec->m_pNextNode.load( atomics::memory_order_relaxed ))
{
+ if ( hprec == static_cast<thread_record*>( pThis ))
+ continue;
+
// If m_bFree == true then hprec->retired_ is empty - we don't need to see it
if ( hprec->m_bFree.load( atomics::memory_order_acquire ))
continue;
// Several threads may work concurrently so we use atomic technique only.
{
cds::OS::ThreadId curOwner = hprec->m_idOwner.load( atomics::memory_order_relaxed );
- if ( curOwner == nullThreadId || !cds::OS::is_thread_alive( curOwner ) ) {
+ if ( curOwner == nullThreadId ) {
if ( !hprec->m_idOwner.compare_exchange_strong( curOwner, curThreadId, atomics::memory_order_acquire, atomics::memory_order_relaxed ) )
continue;
}
}
// We own the thread record successfully. Now, we can see whether it has retired pointers.
- // If it has ones then we move to pThis that is private for current thread.
+ // If it has ones then we move them to pThis that is private for current thread.
retired_array& src = hprec->retired_;
retired_array& dest = pThis->retired_;
assert( !dest.full() );