memory.cpp revision 46e9493c687004357f757d08335c3ec411a361fd
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------ memory.cpp ----------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1046e9493c687004357f757d08335c3ec411a361fdHoward Hinnant#define _LIBCPP_BUILDING_MEMORY
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "memory"
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T>
19adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnantinline T
201694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantincrement(T& t) _NOEXCEPT
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
22adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    return __sync_add_and_fetch(&t, 1);
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T>
26adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnantinline T
271694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantdecrement(T& t) _NOEXCEPT
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
29adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    return __sync_add_and_fetch(&t, -1);
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}  // namespace
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst allocator_arg_t allocator_arg = allocator_arg_t();
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
361694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantbad_weak_ptr::~bad_weak_ptr() _NOEXCEPT {}
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
391694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantbad_weak_ptr::what() const _NOEXCEPT
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return "bad_weak_ptr";
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__shared_count::~__shared_count()
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
491694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_count::__add_shared() _NOEXCEPT
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    increment(__shared_owners_);
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5428dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnantbool
551694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_count::__release_shared() _NOEXCEPT
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (decrement(__shared_owners_) == -1)
5828dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant    {
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __on_zero_shared();
6028dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant        return true;
6128dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant    }
6228dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant    return false;
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__shared_weak_count::~__shared_weak_count()
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
701694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__add_shared() _NOEXCEPT
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __shared_count::__add_shared();
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
761694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__add_weak() _NOEXCEPT
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    increment(__shared_weak_owners_);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
821694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__release_shared() _NOEXCEPT
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
8428dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant    if (__shared_count::__release_shared())
8528dbbe0596878c12e13507aad6b40d33e5a8fa20Howard Hinnant        __release_weak();
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
891694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__release_weak() _NOEXCEPT
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (decrement(__shared_weak_owners_) == -1)
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __on_zero_shared_weak();
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__shared_weak_count*
961694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::lock() _NOEXCEPT
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long object_owners = __shared_owners_;
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while (object_owners != -1)
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
101adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant        if (__sync_bool_compare_and_swap(&__shared_owners_,
102adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant                                         object_owners,
103adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant                                         object_owners+1))
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return this;
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        object_owners = __shared_owners_;
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 0;
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
110d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_RTTI
111d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst void*
1131694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 0;
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11816e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_RTTI
119d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantdeclare_reachable(void*)
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantdeclare_no_pointers(char*, size_t)
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantundeclare_no_pointers(char*, size_t)
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpointer_safety
1361694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantget_pointer_safety() _NOEXCEPT
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return pointer_safety::relaxed;
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid*
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__undeclare_reachable(void* p)
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return p;
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid*
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantalign(size_t alignment, size_t size, void*& ptr, size_t& space)
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void* r = nullptr;
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (size <= space)
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* p1 = static_cast<char*>(ptr);
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment);
155ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t d = static_cast<size_t>(p2 - p1);
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (d <= space - size)
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            r = p2;
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ptr = r;
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            space -= d;
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
167