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 34 const allocator_arg_t allocator_arg = allocator_arg_t(); 35 36 bad_weak_ptr::~bad_weak_ptr() throw() {} 37 38 const char* 39 bad_weak_ptr::what() const throw() 40 { 41 return "bad_weak_ptr"; 42 } 43 44 __shared_count::~__shared_count() 45 { 46 } 47 48 void 49 __shared_count::__add_shared() 50 { 51 increment(__shared_owners_); 52 } 53 54 void 55 __shared_count::__release_shared() 56 { 57 if (decrement(__shared_owners_) == -1) 58 __on_zero_shared(); 59 } 60 61 __shared_weak_count::~__shared_weak_count() 62 { 63 } 64 65 void 66 __shared_weak_count::__add_shared() 67 { 68 __shared_count::__add_shared(); 69 __add_weak(); 70 } 71 72 void 73 __shared_weak_count::__add_weak() 74 { 75 increment(__shared_weak_owners_); 76 } 77 78 void 79 __shared_weak_count::__release_shared() 80 { 81 __shared_count::__release_shared(); 82 __release_weak(); 83 } 84 85 void 86 __shared_weak_count::__release_weak() 87 { 88 if (decrement(__shared_weak_owners_) == -1) 89 __on_zero_shared_weak(); 90 } 91 92 __shared_weak_count* 93 __shared_weak_count::lock() 94 { 95 long object_owners = __shared_owners_; 96 while (object_owners != -1) 97 { 98 if (__sync_bool_compare_and_swap(&__shared_owners_, 99 object_owners, 100 object_owners+1)) 101 { 102 __add_weak(); 103 return this; 104 } 105 object_owners = __shared_owners_; 106 } 107 return 0; 108 } 109 110 const void* 111 __shared_weak_count::__get_deleter(const type_info&) const 112 { 113 return 0; 114 } 115 116 void 117 declare_reachable(void*) 118 { 119 } 120 121 void 122 declare_no_pointers(char*, size_t) 123 { 124 } 125 126 void 127 undeclare_no_pointers(char*, size_t) 128 { 129 } 130 131 pointer_safety 132 get_pointer_safety() 133 { 134 return pointer_safety::relaxed; 135 } 136 137 void* 138 __undeclare_reachable(void* p) 139 { 140 return p; 141 } 142 143 void* 144 align(size_t alignment, size_t size, void*& ptr, size_t& space) 145 { 146 void* r = nullptr; 147 if (size <= space) 148 { 149 char* p1 = static_cast<char*>(ptr); 150 char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment); 151 ptrdiff_t d = p2 - p1; 152 if (d <= space - size) 153 { 154 r = p2; 155 ptr = r; 156 space -= d; 157 } 158 } 159 return r; 160 } 161 162 _LIBCPP_END_NAMESPACE_STD 163