14-has-no-threads.patch 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. diff --git a/include/__memory/shared_ptr.h b/include/__memory/shared_ptr.h
  2. index a8ff189..fa25116 100644
  3. --- a/include/__memory/shared_ptr.h
  4. +++ b/include/__memory/shared_ptr.h
  5. @@ -53,7 +53,7 @@
  6. #include <new>
  7. #include <typeinfo>
  8. #if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
  9. -# include <__atomic/memory_order.h>
  10. +# include <atomic>
  11. #endif
  12. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  13. @@ -137,7 +137,12 @@ class _LIBCPP_EXPORTED_FROM_ABI __shared_count {
  14. __shared_count& operator=(const __shared_count&);
  15. protected:
  16. - long __shared_owners_;
  17. +#ifdef _LIBCPP_HAS_NO_THREADS
  18. + typedef long __atomic_count;
  19. +#else
  20. + typedef atomic<long> __atomic_count;
  21. +#endif
  22. + __atomic_count __shared_owners_;
  23. virtual ~__shared_count();
  24. private:
  25. @@ -150,20 +155,41 @@ public:
  26. void __add_shared() noexcept;
  27. bool __release_shared() noexcept;
  28. #else
  29. - _LIBCPP_HIDE_FROM_ABI void __add_shared() _NOEXCEPT { __libcpp_atomic_refcount_increment(__shared_owners_); }
  30. + _LIBCPP_HIDE_FROM_ABI void __add_shared() _NOEXCEPT {
  31. +# ifdef _LIBCPP_HAS_NO_THREADS
  32. + __libcpp_atomic_refcount_increment(__shared_owners_);
  33. +# else
  34. + __shared_owners_++;
  35. +# endif
  36. + }
  37. _LIBCPP_HIDE_FROM_ABI bool __release_shared() _NOEXCEPT {
  38. +# ifdef _LIBCPP_HAS_NO_THREADS
  39. if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) {
  40. +# else
  41. + if (--__shared_owners_ == -1) {
  42. +# endif
  43. __on_zero_shared();
  44. return true;
  45. }
  46. return false;
  47. }
  48. #endif
  49. - _LIBCPP_HIDE_FROM_ABI long use_count() const _NOEXCEPT { return __libcpp_relaxed_load(&__shared_owners_) + 1; }
  50. + _LIBCPP_HIDE_FROM_ABI long use_count() const _NOEXCEPT {
  51. +#ifdef _LIBCPP_HAS_NO_THREADS
  52. + return __libcpp_relaxed_load(&__shared_owners_) + 1;
  53. +#else
  54. + return __shared_owners_.load(memory_order_relaxed) + 1;
  55. +#endif
  56. + }
  57. };
  58. class _LIBCPP_EXPORTED_FROM_ABI __shared_weak_count : private __shared_count {
  59. - long __shared_weak_owners_;
  60. +#ifdef _LIBCPP_HAS_NO_THREADS
  61. + typedef long __atomic_count;
  62. +#else
  63. + typedef atomic<long> __atomic_count;
  64. +#endif
  65. + __atomic_count __shared_weak_owners_;
  66. public:
  67. _LIBCPP_HIDE_FROM_ABI explicit __shared_weak_count(long __refs = 0) _NOEXCEPT
  68. @@ -180,7 +206,13 @@ public:
  69. void __release_shared() noexcept;
  70. #else
  71. _LIBCPP_HIDE_FROM_ABI void __add_shared() _NOEXCEPT { __shared_count::__add_shared(); }
  72. - _LIBCPP_HIDE_FROM_ABI void __add_weak() _NOEXCEPT { __libcpp_atomic_refcount_increment(__shared_weak_owners_); }
  73. + _LIBCPP_HIDE_FROM_ABI void __add_weak() _NOEXCEPT {
  74. +# ifdef _LIBCPP_HAS_NO_THREADS
  75. + __libcpp_atomic_refcount_increment(__shared_weak_owners_);
  76. +# else
  77. + __shared_weak_owners_++;
  78. +# endif
  79. + }
  80. _LIBCPP_HIDE_FROM_ABI void __release_shared() _NOEXCEPT {
  81. if (__shared_count::__release_shared())
  82. __release_weak();