//===------------------------ memory.cpp ----------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "memory" #include _LIBCPP_BEGIN_NAMESPACE_STD namespace { template inline typename enable_if < sizeof(T) * __CHAR_BIT__ == 32, T >::type increment(T& t) { return OSAtomicIncrement32Barrier((volatile int32_t*)&t); } template inline typename enable_if < sizeof(T) * __CHAR_BIT__ == 32, T >::type decrement(T& t) { return OSAtomicDecrement32Barrier((volatile int32_t*)&t); } #ifndef __ppc__ template inline typename enable_if < sizeof(T) * __CHAR_BIT__ == 64, T >::type increment(T& t) { return OSAtomicIncrement64Barrier((volatile int64_t*)&t); } template inline typename enable_if < sizeof(T) * __CHAR_BIT__ == 64, T >::type decrement(T& t) { return OSAtomicDecrement64Barrier((volatile int64_t*)&t); } #endif } // namespace const allocator_arg_t allocator_arg = allocator_arg_t(); bad_weak_ptr::~bad_weak_ptr() throw() {} const char* bad_weak_ptr::what() const throw() { return "bad_weak_ptr"; } __shared_count::~__shared_count() { } void __shared_count::__add_shared() { increment(__shared_owners_); } void __shared_count::__release_shared() { if (decrement(__shared_owners_) == -1) __on_zero_shared(); } __shared_weak_count::~__shared_weak_count() { } void __shared_weak_count::__add_shared() { __shared_count::__add_shared(); __add_weak(); } void __shared_weak_count::__add_weak() { increment(__shared_weak_owners_); } void __shared_weak_count::__release_shared() { __shared_count::__release_shared(); __release_weak(); } void __shared_weak_count::__release_weak() { if (decrement(__shared_weak_owners_) == -1) __on_zero_shared_weak(); } __shared_weak_count* __shared_weak_count::lock() { long object_owners = __shared_owners_; while (object_owners != -1) { if (OSAtomicCompareAndSwapLongBarrier(object_owners, object_owners+1, &__shared_owners_)) { __add_weak(); return this; } object_owners = __shared_owners_; } return 0; } const void* __shared_weak_count::__get_deleter(const type_info&) const { return 0; } void declare_reachable(void*) { } void declare_no_pointers(char*, size_t) { } void undeclare_no_pointers(char*, size_t) { } pointer_safety get_pointer_safety() { return pointer_safety::relaxed; } void* __undeclare_reachable(void* p) { return p; } void* align(size_t alignment, size_t size, void*& ptr, size_t& space) { void* r = nullptr; if (size <= space) { char* p1 = static_cast(ptr); char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment); ptrdiff_t d = p2 - p1; if (d <= space - size) { r = p2; ptr = r; space -= d; } } return r; } _LIBCPP_END_NAMESPACE_STD