1 //===------------------------ memory.cpp ----------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #define _LIBCPP_BUILDING_MEMORY 11 #include "memory" 12 13 _LIBCPP_BEGIN_NAMESPACE_STD 14 15 namespace 16 { 17 18 template <class T> 19 inline T 20 increment(T& t) _NOEXCEPT 21 { 22 return __sync_add_and_fetch(&t, 1); 23 } 24 25 template <class T> 26 inline T 27 decrement(T& t) _NOEXCEPT 28 { 29 return __sync_add_and_fetch(&t, -1); 30 } 31 32 } // namespace 33 34 const allocator_arg_t allocator_arg = allocator_arg_t(); 35 36 bad_weak_ptr::~bad_weak_ptr() _NOEXCEPT {} 37 38 const char* 39 bad_weak_ptr::what() const _NOEXCEPT 40 { 41 return "bad_weak_ptr"; 42 } 43 44 __shared_count::~__shared_count() 45 { 46 } 47 48 void 49 __shared_count::__add_shared() _NOEXCEPT 50 { 51 increment(__shared_owners_); 52 } 53 54 bool 55 __shared_count::__release_shared() _NOEXCEPT 56 { 57 if (decrement(__shared_owners_) == -1) 58 { 59 __on_zero_shared(); 60 return true; 61 } 62 return false; 63 } 64 65 __shared_weak_count::~__shared_weak_count() 66 { 67 } 68 69 void 70 __shared_weak_count::__add_shared() _NOEXCEPT 71 { 72 __shared_count::__add_shared(); 73 } 74 75 void 76 __shared_weak_count::__add_weak() _NOEXCEPT 77 { 78 increment(__shared_weak_owners_); 79 } 80 81 void 82 __shared_weak_count::__release_shared() _NOEXCEPT 83 { 84 if (__shared_count::__release_shared()) 85 __release_weak(); 86 } 87 88 void 89 __shared_weak_count::__release_weak() _NOEXCEPT 90 { 91 if (decrement(__shared_weak_owners_) == -1) 92 __on_zero_shared_weak(); 93 } 94 95 __shared_weak_count* 96 __shared_weak_count::lock() _NOEXCEPT 97 { 98 long object_owners = __shared_owners_; 99 while (object_owners != -1) 100 { 101 if (__sync_bool_compare_and_swap(&__shared_owners_, 102 object_owners, 103 object_owners+1)) 104 return this; 105 object_owners = __shared_owners_; 106 } 107 return 0; 108 } 109 110 #ifndef _LIBCPP_NO_RTTI 111 112 const void* 113 __shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT 114 { 115 return 0; 116 } 117 118 #endif // _LIBCPP_NO_RTTI 119 120 void 121 declare_reachable(void*) 122 { 123 } 124 125 void 126 declare_no_pointers(char*, size_t) 127 { 128 } 129 130 void 131 undeclare_no_pointers(char*, size_t) 132 { 133 } 134 135 pointer_safety 136 get_pointer_safety() _NOEXCEPT 137 { 138 return pointer_safety::relaxed; 139 } 140 141 void* 142 __undeclare_reachable(void* p) 143 { 144 return p; 145 } 146 147 void* 148 align(size_t alignment, size_t size, void*& ptr, size_t& space) 149 { 150 void* r = nullptr; 151 if (size <= space) 152 { 153 char* p1 = static_cast<char*>(ptr); 154 char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment); 155 size_t d = static_cast<size_t>(p2 - p1); 156 if (d <= space - size) 157 { 158 r = p2; 159 ptr = r; 160 space -= d; 161 } 162 } 163 return r; 164 } 165 166 _LIBCPP_END_NAMESPACE_STD 167