model.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Copyright (c) 2006-2018 Maxim Khizhinsky
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef CDSLIB_THREADING_MODEL_H
  6. #define CDSLIB_THREADING_MODEL_H
  7. #include <cds/threading/details/_common.h>
  8. #include <cds/user_setup/threading.h>
  9. #include <cds/threading/details/auto_detect.h>
  10. namespace cds { namespace threading {
  11. /// Returns thread specific data of \p GC garbage collector
  12. template <class GC> typename GC::thread_gc_impl& getGC();
  13. /// Returns RCU thread specific data (thread GC) for current thread
  14. /**
  15. Template argument \p RCUtag is one of \ref cds_urcu_tags "RCU tags"
  16. */
  17. template <typename RCUtag> cds::urcu::details::thread_data<RCUtag> * getRCU();
  18. //@cond
  19. template<>
  20. inline cds::urcu::details::thread_data<cds::urcu::general_instant_tag> * getRCU<cds::urcu::general_instant_tag>()
  21. {
  22. return Manager::thread_data()->m_pGPIRCU;
  23. }
  24. template<>
  25. inline cds::urcu::details::thread_data<cds::urcu::general_buffered_tag> * getRCU<cds::urcu::general_buffered_tag>()
  26. {
  27. return Manager::thread_data()->m_pGPBRCU;
  28. }
  29. template<>
  30. inline cds::urcu::details::thread_data<cds::urcu::general_threaded_tag> * getRCU<cds::urcu::general_threaded_tag>()
  31. {
  32. return Manager::thread_data()->m_pGPTRCU;
  33. }
  34. #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
  35. template<>
  36. inline cds::urcu::details::thread_data<cds::urcu::signal_buffered_tag> * getRCU<cds::urcu::signal_buffered_tag>()
  37. {
  38. ThreadData * p = Manager::thread_data();
  39. return p ? p->m_pSHBRCU : nullptr;
  40. }
  41. #endif
  42. static inline cds::algo::elimination::record& elimination_record()
  43. {
  44. return Manager::thread_data()->m_EliminationRec;
  45. }
  46. //@endcond
  47. }} // namespace cds::threading
  48. #endif // #ifndef CDSLIB_THREADING_MODEL_H