xref: /llvm-project-15.0.7/libcxx/src/memory.cpp (revision e63d087b)
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 const allocator_arg_t allocator_arg = allocator_arg_t();
34 
35 bad_weak_ptr::~bad_weak_ptr() throw() {}
36 
37 const char*
38 bad_weak_ptr::what() const throw()
39 {
40     return "bad_weak_ptr";
41 }
42 
43 __shared_count::~__shared_count()
44 {
45 }
46 
47 void
48 __shared_count::__add_shared()
49 {
50     increment(__shared_owners_);
51 }
52 
53 void
54 __shared_count::__release_shared()
55 {
56     if (decrement(__shared_owners_) == -1)
57         __on_zero_shared();
58 }
59 
60 __shared_weak_count::~__shared_weak_count()
61 {
62 }
63 
64 void
65 __shared_weak_count::__add_shared()
66 {
67     __shared_count::__add_shared();
68     __add_weak();
69 }
70 
71 void
72 __shared_weak_count::__add_weak()
73 {
74     increment(__shared_weak_owners_);
75 }
76 
77 void
78 __shared_weak_count::__release_shared()
79 {
80     __shared_count::__release_shared();
81     __release_weak();
82 }
83 
84 void
85 __shared_weak_count::__release_weak()
86 {
87     if (decrement(__shared_weak_owners_) == -1)
88         __on_zero_shared_weak();
89 }
90 
91 __shared_weak_count*
92 __shared_weak_count::lock()
93 {
94     long object_owners = __shared_owners_;
95     while (object_owners != -1)
96     {
97         if (__sync_bool_compare_and_swap(&__shared_owners_,
98                                          object_owners,
99                                          object_owners+1))
100         {
101             __add_weak();
102             return this;
103         }
104         object_owners = __shared_owners_;
105     }
106     return 0;
107 }
108 
109 #ifndef _LIBCPP_NO_RTTI
110 
111 const void*
112 __shared_weak_count::__get_deleter(const type_info&) const
113 {
114     return 0;
115 }
116 
117 #endif  // _LIBCPP_NO_RTTI
118 
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
135 get_pointer_safety()
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);
154         ptrdiff_t d = p2 - p1;
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
166