//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <__config>
#if !defined(_LIBCPP_OBJECT_FORMAT_COFF) && !defined(_LIBCPP_OBJECT_FORMAT_XCOFF) &&                                   \
    _LIBCPP_AVAILABILITY_MINIMUM_HEADER_VERSION < 5
#  define _LIBCPP_SHARED_PTR_DEFINE_LEGACY_INLINE_FUNCTIONS
#endif

#include <__functional/hash.h>
#include <memory>
#include <typeinfo>

#if _LIBCPP_HAS_THREADS
#  include <mutex>
#  include <thread>
#  if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
#    pragma comment(lib, "pthread")
#  endif
#endif

#include "include/atomic_support.h"

_LIBCPP_BEGIN_NAMESPACE_STD

bad_weak_ptr::~bad_weak_ptr() noexcept {}

const char* bad_weak_ptr::what() const noexcept { return "bad_weak_ptr"; }

__shared_count::~__shared_count() {}

__shared_weak_count::~__shared_weak_count() {}

#if defined(_LIBCPP_SHARED_PTR_DEFINE_LEGACY_INLINE_FUNCTIONS)
void __shared_count::__add_shared() noexcept { __libcpp_atomic_refcount_increment(__shared_owners_); }

bool __shared_count::__release_shared() noexcept {
  if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) {
    __on_zero_shared();
    return true;
  }
  return false;
}

void __shared_weak_count::__add_shared() noexcept { __shared_count::__add_shared(); }

void __shared_weak_count::__add_weak() noexcept { __libcpp_atomic_refcount_increment(__shared_weak_owners_); }

void __shared_weak_count::__release_shared() noexcept {
  if (__shared_count::__release_shared())
    __release_weak();
}
#endif // _LIBCPP_SHARED_PTR_DEFINE_LEGACY_INLINE_FUNCTIONS

void __shared_weak_count::__release_weak() noexcept {
  // NOTE: The acquire load here is an optimization of the very
  // common case where a shared pointer is being destructed while
  // having no other contended references.
  //
  // BENEFIT: We avoid expensive atomic stores like XADD and STREX
  // in a common case.  Those instructions are slow and do nasty
  // things to caches.
  //
  // IS THIS SAFE?  Yes.  During weak destruction, if we see that we
  // are the last reference, we know that no-one else is accessing
  // us. If someone were accessing us, then they would be doing so
  // while the last shared / weak_ptr was being destructed, and
  // that's undefined anyway.
  //
  // If we see anything other than a 0, then we have possible
  // contention, and need to use an atomicrmw primitive.
  // The same arguments don't apply for increment, where it is legal
  // (though inadvisable) to share shared_ptr references between
  // threads, and have them all get copied at once.  The argument
  // also doesn't apply for __release_shared, because an outstanding
  // weak_ptr::lock() could read / modify the shared count.
  if (__libcpp_atomic_load(&__shared_weak_owners_, _AO_Acquire) == 0) {
    // no need to do this store, because we are about
    // to destroy everything.
    //__libcpp_atomic_store(&__shared_weak_owners_, -1, _AO_Release);
    __on_zero_shared_weak();
  } else if (__libcpp_atomic_refcount_decrement(__shared_weak_owners_) == -1)
    __on_zero_shared_weak();
}

__shared_weak_count* __shared_weak_count::lock() noexcept {
  long object_owners = __libcpp_atomic_load(&__shared_owners_);
  while (object_owners != -1) {
    if (__libcpp_atomic_compare_exchange(&__shared_owners_, &object_owners, object_owners + 1))
      return this;
  }
  return nullptr;
}

const void* __shared_weak_count::__get_deleter(const type_info&) const noexcept { return nullptr; }

#if _LIBCPP_HAS_THREADS

static constexpr std::size_t __sp_mut_count                = 32;
static constinit __libcpp_mutex_t mut_back[__sp_mut_count] = {
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER,
    _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER, _LIBCPP_MUTEX_INITIALIZER};

constexpr __sp_mut::__sp_mut(void* p) noexcept : __lx_(p) {}

void __sp_mut::lock() noexcept {
  auto m = static_cast<__libcpp_mutex_t*>(__lx_);
  __libcpp_mutex_lock(m);
}

void __sp_mut::unlock() noexcept { __libcpp_mutex_unlock(static_cast<__libcpp_mutex_t*>(__lx_)); }

__sp_mut& __get_sp_mut(const void* p) {
  static constinit __sp_mut muts[__sp_mut_count] = {
      &mut_back[0],  &mut_back[1],  &mut_back[2],  &mut_back[3],  &mut_back[4],  &mut_back[5],  &mut_back[6],
      &mut_back[7],  &mut_back[8],  &mut_back[9],  &mut_back[10], &mut_back[11], &mut_back[12], &mut_back[13],
      &mut_back[14], &mut_back[15], &mut_back[16], &mut_back[17], &mut_back[18], &mut_back[19], &mut_back[20],
      &mut_back[21], &mut_back[22], &mut_back[23], &mut_back[24], &mut_back[25], &mut_back[26], &mut_back[27],
      &mut_back[28], &mut_back[29], &mut_back[30], &mut_back[31]};
  return muts[hash<const void*>()(p) & (__sp_mut_count - 1)];
}

#endif // _LIBCPP_HAS_THREADS

#if _LIBCPP_AVAILABILITY_MINIMUM_HEADER_VERSION < 21

_LIBCPP_DIAGNOSTIC_PUSH
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wmissing-prototypes")
// This function only exists for ABI compatibility and we therefore don't provide a declaration in the headers
_LIBCPP_EXPORTED_FROM_ABI void* align(size_t alignment, size_t size, void*& ptr, size_t& space) {
  return __align_inline::align(alignment, size, ptr, space);
}
_LIBCPP_DIAGNOSTIC_POP

#endif

_LIBCPP_END_NAMESPACE_STD
