xref: /llvm-project/libcxx/src/new_handler.cpp (revision aee3a9f5bcdc13de4bb1b3eb04845b172fffb23c)
180e4ccabSLouis Dionne //===----------------------------------------------------------------------===//
280e4ccabSLouis Dionne //
380e4ccabSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
480e4ccabSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
580e4ccabSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
680e4ccabSLouis Dionne //
780e4ccabSLouis Dionne //===----------------------------------------------------------------------===//
880e4ccabSLouis Dionne 
980e4ccabSLouis Dionne #include <new>
1080e4ccabSLouis Dionne 
1180e4ccabSLouis Dionne #include "include/atomic_support.h"
1280e4ccabSLouis Dionne 
1380e4ccabSLouis Dionne #if defined(_LIBCPP_ABI_MICROSOFT)
1480e4ccabSLouis Dionne #  if !defined(_LIBCPP_ABI_VCRUNTIME)
1580e4ccabSLouis Dionne #    define _LIBPCPP_DEFINE_NEW_HANDLER
1680e4ccabSLouis Dionne #  endif
1780e4ccabSLouis Dionne #elif defined(LIBCXX_BUILDING_LIBCXXABI)
1880e4ccabSLouis Dionne // nothing to do, we use the one from libc++abi
1980e4ccabSLouis Dionne #elif defined(LIBCXXRT)
2080e4ccabSLouis Dionne #  define _LIBPCPP_DEFINE_NEW_HANDLER
2180e4ccabSLouis Dionne #elif defined(__GLIBCXX__)
2280e4ccabSLouis Dionne // nothing to do, we use the one from libstdc++/libsupc++
2380e4ccabSLouis Dionne #else
2480e4ccabSLouis Dionne #  define _LIBPCPP_DEFINE_NEW_HANDLER
2580e4ccabSLouis Dionne #endif
2680e4ccabSLouis Dionne 
2780e4ccabSLouis Dionne #if defined(_LIBPCPP_DEFINE_NEW_HANDLER)
2880e4ccabSLouis Dionne 
2980e4ccabSLouis Dionne namespace std { // purposefully not versioned
3080e4ccabSLouis Dionne 
3180e4ccabSLouis Dionne static constinit std::new_handler __new_handler = nullptr;
3280e4ccabSLouis Dionne 
set_new_handler(new_handler handler)33*aee3a9f5SLouis Dionne new_handler set_new_handler(new_handler handler) noexcept { return __libcpp_atomic_exchange(&__new_handler, handler); }
3480e4ccabSLouis Dionne 
get_new_handler()35*aee3a9f5SLouis Dionne new_handler get_new_handler() noexcept { return __libcpp_atomic_load(&__new_handler); }
3680e4ccabSLouis Dionne 
3780e4ccabSLouis Dionne } // namespace std
3880e4ccabSLouis Dionne 
3980e4ccabSLouis Dionne #endif // _LIBPCPP_DEFINE_NEW_HANDLER
40