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