xref: /llvm-project-15.0.7/libcxx/src/memory.cpp (revision 30fdc8d8)
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 
34 const allocator_arg_t allocator_arg = allocator_arg_t();
35 
36 bad_weak_ptr::~bad_weak_ptr() throw() {}
37 
38 const char*
39 bad_weak_ptr::what() const throw()
40 {
41     return "bad_weak_ptr";
42 }
43 
44 __shared_count::~__shared_count()
45 {
46 }
47 
48 void
49 __shared_count::__add_shared()
50 {
51     increment(__shared_owners_);
52 }
53 
54 void
55 __shared_count::__release_shared()
56 {
57     if (decrement(__shared_owners_) == -1)
58         __on_zero_shared();
59 }
60 
61 __shared_weak_count::~__shared_weak_count()
62 {
63 }
64 
65 void
66 __shared_weak_count::__add_shared()
67 {
68     __shared_count::__add_shared();
69     __add_weak();
70 }
71 
72 void
73 __shared_weak_count::__add_weak()
74 {
75     increment(__shared_weak_owners_);
76 }
77 
78 void
79 __shared_weak_count::__release_shared()
80 {
81     __shared_count::__release_shared();
82     __release_weak();
83 }
84 
85 void
86 __shared_weak_count::__release_weak()
87 {
88     if (decrement(__shared_weak_owners_) == -1)
89         __on_zero_shared_weak();
90 }
91 
92 __shared_weak_count*
93 __shared_weak_count::lock()
94 {
95     long object_owners = __shared_owners_;
96     while (object_owners != -1)
97     {
98         if (__sync_bool_compare_and_swap(&__shared_owners_,
99                                          object_owners,
100                                          object_owners+1))
101         {
102             __add_weak();
103             return this;
104         }
105         object_owners = __shared_owners_;
106     }
107     return 0;
108 }
109 
110 const void*
111 __shared_weak_count::__get_deleter(const type_info&) const
112 {
113     return 0;
114 }
115 
116 void
117 declare_reachable(void*)
118 {
119 }
120 
121 void
122 declare_no_pointers(char*, size_t)
123 {
124 }
125 
126 void
127 undeclare_no_pointers(char*, size_t)
128 {
129 }
130 
131 pointer_safety
132 get_pointer_safety()
133 {
134     return pointer_safety::relaxed;
135 }
136 
137 void*
138 __undeclare_reachable(void* p)
139 {
140     return p;
141 }
142 
143 void*
144 align(size_t alignment, size_t size, void*& ptr, size_t& space)
145 {
146     void* r = nullptr;
147     if (size <= space)
148     {
149         char* p1 = static_cast<char*>(ptr);
150         char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment);
151         ptrdiff_t d = p2 - p1;
152         if (d <= space - size)
153         {
154             r = p2;
155             ptr = r;
156             space -= d;
157         }
158     }
159     return r;
160 }
161 
162 _LIBCPP_END_NAMESPACE_STD
163