Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 1 | //===------------------------ memory.cpp ----------------------------------===// |
2 | // | ||||
Howard Hinnant | c566dc3 | 2010-05-11 21:36:01 +0000 | [diff] [blame] | 3 | // The LLVM Compiler Infrastructure |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 4 | // |
Howard Hinnant | ee11c31 | 2010-11-16 22:09:02 +0000 | [diff] [blame] | 5 | // This file is dual licensed under the MIT and the University of Illinois Open |
6 | // Source Licenses. See LICENSE.TXT for details. | ||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 7 | // |
8 | //===----------------------------------------------------------------------===// | ||||
9 | |||||
10 | #include "memory" | ||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 11 | |
12 | _LIBCPP_BEGIN_NAMESPACE_STD | ||||
13 | |||||
14 | namespace | ||||
15 | { | ||||
16 | |||||
17 | template <class T> | ||||
Howard Hinnant | 155c2af | 2010-05-24 17:49:41 +0000 | [diff] [blame] | 18 | inline T |
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 19 | increment(T& t) _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 20 | { |
Howard Hinnant | 155c2af | 2010-05-24 17:49:41 +0000 | [diff] [blame] | 21 | return __sync_add_and_fetch(&t, 1); |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 22 | } |
23 | |||||
24 | template <class T> | ||||
Howard Hinnant | 155c2af | 2010-05-24 17:49:41 +0000 | [diff] [blame] | 25 | inline T |
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 26 | decrement(T& t) _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 27 | { |
Howard Hinnant | 155c2af | 2010-05-24 17:49:41 +0000 | [diff] [blame] | 28 | return __sync_add_and_fetch(&t, -1); |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 29 | } |
30 | |||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 31 | } // namespace |
32 | |||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 33 | const allocator_arg_t allocator_arg = allocator_arg_t(); |
34 | |||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 35 | bad_weak_ptr::~bad_weak_ptr() _NOEXCEPT {} |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 36 | |
37 | const char* | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 38 | bad_weak_ptr::what() const _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 39 | { |
40 | return "bad_weak_ptr"; | ||||
41 | } | ||||
42 | |||||
43 | __shared_count::~__shared_count() | ||||
44 | { | ||||
45 | } | ||||
46 | |||||
47 | void | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 48 | __shared_count::__add_shared() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 49 | { |
50 | increment(__shared_owners_); | ||||
51 | } | ||||
52 | |||||
Howard Hinnant | ca3b32a | 2010-11-16 21:33:17 +0000 | [diff] [blame] | 53 | bool |
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 54 | __shared_count::__release_shared() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 55 | { |
56 | if (decrement(__shared_owners_) == -1) | ||||
Howard Hinnant | ca3b32a | 2010-11-16 21:33:17 +0000 | [diff] [blame] | 57 | { |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 58 | __on_zero_shared(); |
Howard Hinnant | ca3b32a | 2010-11-16 21:33:17 +0000 | [diff] [blame] | 59 | return true; |
60 | } | ||||
61 | return false; | ||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 62 | } |
63 | |||||
64 | __shared_weak_count::~__shared_weak_count() | ||||
65 | { | ||||
66 | } | ||||
67 | |||||
68 | void | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 69 | __shared_weak_count::__add_shared() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 70 | { |
71 | __shared_count::__add_shared(); | ||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 72 | } |
73 | |||||
74 | void | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 75 | __shared_weak_count::__add_weak() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 76 | { |
77 | increment(__shared_weak_owners_); | ||||
78 | } | ||||
79 | |||||
80 | void | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 81 | __shared_weak_count::__release_shared() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 82 | { |
Howard Hinnant | ca3b32a | 2010-11-16 21:33:17 +0000 | [diff] [blame] | 83 | if (__shared_count::__release_shared()) |
84 | __release_weak(); | ||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 85 | } |
86 | |||||
87 | void | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 88 | __shared_weak_count::__release_weak() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 89 | { |
90 | if (decrement(__shared_weak_owners_) == -1) | ||||
91 | __on_zero_shared_weak(); | ||||
92 | } | ||||
93 | |||||
94 | __shared_weak_count* | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 95 | __shared_weak_count::lock() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 96 | { |
97 | long object_owners = __shared_owners_; | ||||
98 | while (object_owners != -1) | ||||
99 | { | ||||
Howard Hinnant | 155c2af | 2010-05-24 17:49:41 +0000 | [diff] [blame] | 100 | if (__sync_bool_compare_and_swap(&__shared_owners_, |
101 | object_owners, | ||||
102 | object_owners+1)) | ||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 103 | return this; |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 104 | object_owners = __shared_owners_; |
105 | } | ||||
106 | return 0; | ||||
107 | } | ||||
108 | |||||
Howard Hinnant | 72f7358 | 2010-08-11 17:04:31 +0000 | [diff] [blame] | 109 | #ifndef _LIBCPP_NO_RTTI |
110 | |||||
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 111 | const void* |
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 112 | __shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 113 | { |
114 | return 0; | ||||
115 | } | ||||
116 | |||||
Howard Hinnant | ffb308e | 2010-08-22 00:03:27 +0000 | [diff] [blame] | 117 | #endif // _LIBCPP_NO_RTTI |
Howard Hinnant | 72f7358 | 2010-08-11 17:04:31 +0000 | [diff] [blame] | 118 | |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 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 | ||||
Howard Hinnant | 719bda3 | 2011-05-28 14:41:13 +0000 | [diff] [blame] | 135 | get_pointer_safety() _NOEXCEPT |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 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); | ||||
Howard Hinnant | 28b2488 | 2011-12-01 20:21:04 +0000 | [diff] [blame] | 154 | size_t d = static_cast<size_t>(p2 - p1); |
Howard Hinnant | c51e102 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 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 |