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