1*67226badSAlexandre Ganea //===-------------------------- rpnew.h -----------------*- C -*-=============//
2*67226badSAlexandre Ganea //
3*67226badSAlexandre Ganea // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*67226badSAlexandre Ganea // See https://llvm.org/LICENSE.txt for license information.
5*67226badSAlexandre Ganea // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*67226badSAlexandre Ganea //
7*67226badSAlexandre Ganea //===----------------------------------------------------------------------===//
8*67226badSAlexandre Ganea //
9*67226badSAlexandre Ganea // This library provides a cross-platform lock free thread caching malloc
10*67226badSAlexandre Ganea // implementation in C11.
11*67226badSAlexandre Ganea //
12*67226badSAlexandre Ganea //===----------------------------------------------------------------------===//
13*67226badSAlexandre Ganea
14*67226badSAlexandre Ganea #ifdef __cplusplus
15*67226badSAlexandre Ganea
16*67226badSAlexandre Ganea #include <new>
17*67226badSAlexandre Ganea #include <rpmalloc.h>
18*67226badSAlexandre Ganea
19*67226badSAlexandre Ganea #ifndef __CRTDECL
20*67226badSAlexandre Ganea #define __CRTDECL
21*67226badSAlexandre Ganea #endif
22*67226badSAlexandre Ganea
delete(void * p)23*67226badSAlexandre Ganea extern void __CRTDECL operator delete(void *p) noexcept { rpfree(p); }
24*67226badSAlexandre Ganea
25*67226badSAlexandre Ganea extern void __CRTDECL operator delete[](void *p) noexcept { rpfree(p); }
26*67226badSAlexandre Ganea
new(std::size_t size)27*67226badSAlexandre Ganea extern void *__CRTDECL operator new(std::size_t size) noexcept(false) {
28*67226badSAlexandre Ganea return rpmalloc(size);
29*67226badSAlexandre Ganea }
30*67226badSAlexandre Ganea
noexcept(false)31*67226badSAlexandre Ganea extern void *__CRTDECL operator new[](std::size_t size) noexcept(false) {
32*67226badSAlexandre Ganea return rpmalloc(size);
33*67226badSAlexandre Ganea }
34*67226badSAlexandre Ganea
new(std::size_t size,const std::nothrow_t & tag)35*67226badSAlexandre Ganea extern void *__CRTDECL operator new(std::size_t size,
36*67226badSAlexandre Ganea const std::nothrow_t &tag) noexcept {
37*67226badSAlexandre Ganea (void)sizeof(tag);
38*67226badSAlexandre Ganea return rpmalloc(size);
39*67226badSAlexandre Ganea }
40*67226badSAlexandre Ganea
41*67226badSAlexandre Ganea extern void *__CRTDECL operator new[](std::size_t size,
42*67226badSAlexandre Ganea const std::nothrow_t &tag) noexcept {
43*67226badSAlexandre Ganea (void)sizeof(tag);
44*67226badSAlexandre Ganea return rpmalloc(size);
45*67226badSAlexandre Ganea }
46*67226badSAlexandre Ganea
47*67226badSAlexandre Ganea #if (__cplusplus >= 201402L || _MSC_VER >= 1916)
48*67226badSAlexandre Ganea
delete(void * p,std::size_t size)49*67226badSAlexandre Ganea extern void __CRTDECL operator delete(void *p, std::size_t size) noexcept {
50*67226badSAlexandre Ganea (void)sizeof(size);
51*67226badSAlexandre Ganea rpfree(p);
52*67226badSAlexandre Ganea }
53*67226badSAlexandre Ganea
54*67226badSAlexandre Ganea extern void __CRTDECL operator delete[](void *p, std::size_t size) noexcept {
55*67226badSAlexandre Ganea (void)sizeof(size);
56*67226badSAlexandre Ganea rpfree(p);
57*67226badSAlexandre Ganea }
58*67226badSAlexandre Ganea
59*67226badSAlexandre Ganea #endif
60*67226badSAlexandre Ganea
61*67226badSAlexandre Ganea #if (__cplusplus > 201402L || defined(__cpp_aligned_new))
62*67226badSAlexandre Ganea
delete(void * p,std::align_val_t align)63*67226badSAlexandre Ganea extern void __CRTDECL operator delete(void *p,
64*67226badSAlexandre Ganea std::align_val_t align) noexcept {
65*67226badSAlexandre Ganea (void)sizeof(align);
66*67226badSAlexandre Ganea rpfree(p);
67*67226badSAlexandre Ganea }
68*67226badSAlexandre Ganea
69*67226badSAlexandre Ganea extern void __CRTDECL operator delete[](void *p,
70*67226badSAlexandre Ganea std::align_val_t align) noexcept {
71*67226badSAlexandre Ganea (void)sizeof(align);
72*67226badSAlexandre Ganea rpfree(p);
73*67226badSAlexandre Ganea }
74*67226badSAlexandre Ganea
delete(void * p,std::size_t size,std::align_val_t align)75*67226badSAlexandre Ganea extern void __CRTDECL operator delete(void *p, std::size_t size,
76*67226badSAlexandre Ganea std::align_val_t align) noexcept {
77*67226badSAlexandre Ganea (void)sizeof(size);
78*67226badSAlexandre Ganea (void)sizeof(align);
79*67226badSAlexandre Ganea rpfree(p);
80*67226badSAlexandre Ganea }
81*67226badSAlexandre Ganea
82*67226badSAlexandre Ganea extern void __CRTDECL operator delete[](void *p, std::size_t size,
83*67226badSAlexandre Ganea std::align_val_t align) noexcept {
84*67226badSAlexandre Ganea (void)sizeof(size);
85*67226badSAlexandre Ganea (void)sizeof(align);
86*67226badSAlexandre Ganea rpfree(p);
87*67226badSAlexandre Ganea }
88*67226badSAlexandre Ganea
new(std::size_t size,std::align_val_t align)89*67226badSAlexandre Ganea extern void *__CRTDECL operator new(std::size_t size,
90*67226badSAlexandre Ganea std::align_val_t align) noexcept(false) {
91*67226badSAlexandre Ganea return rpaligned_alloc(static_cast<size_t>(align), size);
92*67226badSAlexandre Ganea }
93*67226badSAlexandre Ganea
94*67226badSAlexandre Ganea extern void *__CRTDECL operator new[](std::size_t size,
noexcept(false)95*67226badSAlexandre Ganea std::align_val_t align) noexcept(false) {
96*67226badSAlexandre Ganea return rpaligned_alloc(static_cast<size_t>(align), size);
97*67226badSAlexandre Ganea }
98*67226badSAlexandre Ganea
new(std::size_t size,std::align_val_t align,const std::nothrow_t & tag)99*67226badSAlexandre Ganea extern void *__CRTDECL operator new(std::size_t size, std::align_val_t align,
100*67226badSAlexandre Ganea const std::nothrow_t &tag) noexcept {
101*67226badSAlexandre Ganea (void)sizeof(tag);
102*67226badSAlexandre Ganea return rpaligned_alloc(static_cast<size_t>(align), size);
103*67226badSAlexandre Ganea }
104*67226badSAlexandre Ganea
105*67226badSAlexandre Ganea extern void *__CRTDECL operator new[](std::size_t size, std::align_val_t align,
106*67226badSAlexandre Ganea const std::nothrow_t &tag) noexcept {
107*67226badSAlexandre Ganea (void)sizeof(tag);
108*67226badSAlexandre Ganea return rpaligned_alloc(static_cast<size_t>(align), size);
109*67226badSAlexandre Ganea }
110*67226badSAlexandre Ganea
111*67226badSAlexandre Ganea #endif
112*67226badSAlexandre Ganea
113*67226badSAlexandre Ganea #endif
114