3 #ifndef __CDS_GC_DETAILS_RETIRED_PTR_H
4 #define __CDS_GC_DETAILS_RETIRED_PTR_H
6 #include <cds/details/defs.h>
8 namespace cds { namespace gc {
9 /// Common implementation details for any GC
12 /// Pointer to function to free (destruct and deallocate) retired pointer of specific type
13 typedef void (* free_retired_ptr_func )( void * );
17 Pointer to an object that is ready to delete.
21 typedef void * pointer;
23 pointer m_p ; ///< retired pointer
24 free_retired_ptr_func m_funcFree ; ///< pointer to the destructor function
26 /// Comparison of two retired pointers
27 static bool less( const retired_ptr& p1, const retired_ptr& p2 )
29 return p1.m_p < p2.m_p;
32 /// Default ctor initializes pointer to \p nullptr
35 , m_funcFree( nullptr )
39 retired_ptr( pointer p, free_retired_ptr_func func )
46 retired_ptr( T * p, void (* pFreeFunc)(T *))
47 : m_p( reinterpret_cast<pointer>( p ) )
48 , m_funcFree( reinterpret_cast< free_retired_ptr_func >( pFreeFunc ))
51 /// Assignment operator
52 retired_ptr& operator =( const retired_ptr& s)
55 m_funcFree = s.m_funcFree;
59 /// Invokes destructor function for the pointer
66 CDS_STRICT_DO( m_p = nullptr );
67 CDS_STRICT_DO( m_funcFree = nullptr );
72 static inline bool operator <( const retired_ptr& p1, const retired_ptr& p2 )
74 return retired_ptr::less( p1, p2 );
77 static inline bool operator ==( const retired_ptr& p1, const retired_ptr& p2 )
79 return p1.m_p == p2.m_p;
82 static inline bool operator !=( const retired_ptr& p1, const retired_ptr& p2 )
89 } // namespace details
90 }} // namespace cds::gc
92 #endif // #ifndef __CDS_GC_DETAILS_RETIRED_PTR_H