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