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