blob: 5bbf48e442cc11d2c180610f763e433a2caf62c5 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===------------------------ memory.cpp ----------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
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"
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000011
12_LIBCPP_BEGIN_NAMESPACE_STD
13
14namespace
15{
16
17template <class T>
Howard Hinnantadff4892010-05-24 17:49:41 +000018inline T
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000019increment(T& t)
20{
Howard Hinnantadff4892010-05-24 17:49:41 +000021 return __sync_add_and_fetch(&t, 1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000022}
23
24template <class T>
Howard Hinnantadff4892010-05-24 17:49:41 +000025inline T
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000026decrement(T& t)
27{
Howard Hinnantadff4892010-05-24 17:49:41 +000028 return __sync_add_and_fetch(&t, -1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000029}
30
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000031} // namespace
32
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000033const allocator_arg_t allocator_arg = allocator_arg_t();
34
35bad_weak_ptr::~bad_weak_ptr() throw() {}
36
37const char*
38bad_weak_ptr::what() const throw()
39{
40 return "bad_weak_ptr";
41}
42
43__shared_count::~__shared_count()
44{
45}
46
47void
48__shared_count::__add_shared()
49{
50 increment(__shared_owners_);
51}
52
Howard Hinnant28dbbe02010-11-16 21:33:17 +000053bool
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000054__shared_count::__release_shared()
55{
56 if (decrement(__shared_owners_) == -1)
Howard Hinnant28dbbe02010-11-16 21:33:17 +000057 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000058 __on_zero_shared();
Howard Hinnant28dbbe02010-11-16 21:33:17 +000059 return true;
60 }
61 return false;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000062}
63
64__shared_weak_count::~__shared_weak_count()
65{
66}
67
68void
69__shared_weak_count::__add_shared()
70{
71 __shared_count::__add_shared();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000072}
73
74void
75__shared_weak_count::__add_weak()
76{
77 increment(__shared_weak_owners_);
78}
79
80void
81__shared_weak_count::__release_shared()
82{
Howard Hinnant28dbbe02010-11-16 21:33:17 +000083 if (__shared_count::__release_shared())
84 __release_weak();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000085}
86
87void
88__shared_weak_count::__release_weak()
89{
90 if (decrement(__shared_weak_owners_) == -1)
91 __on_zero_shared_weak();
92}
93
94__shared_weak_count*
95__shared_weak_count::lock()
96{
97 long object_owners = __shared_owners_;
98 while (object_owners != -1)
99 {
Howard Hinnantadff4892010-05-24 17:49:41 +0000100 if (__sync_bool_compare_and_swap(&__shared_owners_,
101 object_owners,
102 object_owners+1))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000103 {
104 __add_weak();
105 return this;
106 }
107 object_owners = __shared_owners_;
108 }
109 return 0;
110}
111
Howard Hinnantd4444702010-08-11 17:04:31 +0000112#ifndef _LIBCPP_NO_RTTI
113
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000114const void*
115__shared_weak_count::__get_deleter(const type_info&) const
116{
117 return 0;
118}
119
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000120#endif // _LIBCPP_NO_RTTI
Howard Hinnantd4444702010-08-11 17:04:31 +0000121
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000122void
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()
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