blob: 1970598c6f79dee02993cd728e3548e2bee779e2 [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:161//===------------------------ 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#include <libkern/OSAtomic.h>
12
13_LIBCPP_BEGIN_NAMESPACE_STD
14
15namespace
16{
17
18template <class T>
19inline
20typename enable_if
21<
22 sizeof(T) * __CHAR_BIT__ == 32,
23 T
24>::type
25increment(T& t)
26{
27 return OSAtomicIncrement32Barrier((volatile int32_t*)&t);
28}
29
30template <class T>
31inline
32typename enable_if
33<
34 sizeof(T) * __CHAR_BIT__ == 32,
35 T
36>::type
37decrement(T& t)
38{
39 return OSAtomicDecrement32Barrier((volatile int32_t*)&t);
40}
41
42#ifndef __ppc__
43
44template <class T>
45inline
46typename enable_if
47<
48 sizeof(T) * __CHAR_BIT__ == 64,
49 T
50>::type
51increment(T& t)
52{
53 return OSAtomicIncrement64Barrier((volatile int64_t*)&t);
54}
55
56template <class T>
57inline
58typename enable_if
59<
60 sizeof(T) * __CHAR_BIT__ == 64,
61 T
62>::type
63decrement(T& t)
64{
65 return OSAtomicDecrement64Barrier((volatile int64_t*)&t);
66}
67
68#endif
69
70} // namespace
71
72
73const allocator_arg_t allocator_arg = allocator_arg_t();
74
75bad_weak_ptr::~bad_weak_ptr() throw() {}
76
77const char*
78bad_weak_ptr::what() const throw()
79{
80 return "bad_weak_ptr";
81}
82
83__shared_count::~__shared_count()
84{
85}
86
87void
88__shared_count::__add_shared()
89{
90 increment(__shared_owners_);
91}
92
93void
94__shared_count::__release_shared()
95{
96 if (decrement(__shared_owners_) == -1)
97 __on_zero_shared();
98}
99
100__shared_weak_count::~__shared_weak_count()
101{
102}
103
104void
105__shared_weak_count::__add_shared()
106{
107 __shared_count::__add_shared();
108 __add_weak();
109}
110
111void
112__shared_weak_count::__add_weak()
113{
114 increment(__shared_weak_owners_);
115}
116
117void
118__shared_weak_count::__release_shared()
119{
120 __shared_count::__release_shared();
121 __release_weak();
122}
123
124void
125__shared_weak_count::__release_weak()
126{
127 if (decrement(__shared_weak_owners_) == -1)
128 __on_zero_shared_weak();
129}
130
131__shared_weak_count*
132__shared_weak_count::lock()
133{
134 long object_owners = __shared_owners_;
135 while (object_owners != -1)
136 {
137 if (OSAtomicCompareAndSwapLongBarrier(object_owners,
138 object_owners+1,
139 &__shared_owners_))
140 {
141 __add_weak();
142 return this;
143 }
144 object_owners = __shared_owners_;
145 }
146 return 0;
147}
148
149const void*
150__shared_weak_count::__get_deleter(const type_info&) const
151{
152 return 0;
153}
154
155void
156declare_reachable(void*)
157{
158}
159
160void
161declare_no_pointers(char*, size_t)
162{
163}
164
165void
166undeclare_no_pointers(char*, size_t)
167{
168}
169
170pointer_safety
171get_pointer_safety()
172{
173 return pointer_safety::relaxed;
174}
175
176void*
177__undeclare_reachable(void* p)
178{
179 return p;
180}
181
182void*
183align(size_t alignment, size_t size, void*& ptr, size_t& space)
184{
185 void* r = nullptr;
186 if (size <= space)
187 {
188 char* p1 = static_cast<char*>(ptr);
189 char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment);
190 ptrdiff_t d = p2 - p1;
191 if (d <= space - size)
192 {
193 r = p2;
194 ptr = r;
195 space -= d;
196 }
197 }
198 return r;
199}
200
201_LIBCPP_END_NAMESPACE_STD