blob: cbaaabad8902b3ece0bdbdc8f3afeaa8aca6b5a8 [file] [log] [blame]
/* new.cc - Memory allocator - Public Domain - 2017 Mattias Jansson / Rampant Pixels
*
* This library provides a cross-platform lock free thread caching malloc implementation in C11.
* The latest source code is always available at
*
* https://github.com/rampantpixels/rpmalloc
*
* This library is put in the public domain; you can redistribute it and/or modify it without any restrictions.
*
*/
#include <new>
#include <cstdint>
#include <cstdlib>
#include "rpmalloc.h"
using namespace std;
#ifdef __clang__
#pragma clang diagnostic ignored "-Wc++98-compat"
#endif
extern void*
operator new(size_t size);
extern void*
operator new[](size_t size);
extern void
operator delete(void* ptr) noexcept;
extern void
operator delete[](void* ptr) noexcept;
extern void*
operator new(size_t size, const std::nothrow_t&) noexcept;
extern void*
operator new[](size_t size, const std::nothrow_t&) noexcept;
extern void
operator delete(void* ptr, const std::nothrow_t&) noexcept;
extern void
operator delete[](void* ptr, const std::nothrow_t&) noexcept;
extern void
operator delete(void* ptr, size_t) noexcept;
extern void
operator delete[](void* ptr, size_t) noexcept;
static int is_initialized;
static void
initializer(void) {
if (!is_initialized) {
is_initialized = 1;
rpmalloc_initialize();
}
rpmalloc_thread_initialize();
}
void*
operator new(size_t size) {
initializer();
return rpmalloc(size);
}
void
operator delete(void* ptr) noexcept {
if (rpmalloc_is_thread_initialized())
rpfree(ptr);
}
void*
operator new[](size_t size) {
initializer();
return rpmalloc(size);
}
void
operator delete[](void* ptr) noexcept {
if (rpmalloc_is_thread_initialized())
rpfree(ptr);
}
void*
operator new(size_t size, const std::nothrow_t&) noexcept {
initializer();
return rpmalloc(size);
}
void*
operator new[](size_t size, const std::nothrow_t&) noexcept {
initializer();
return rpmalloc(size);
}
void
operator delete(void* ptr, const std::nothrow_t&) noexcept {
if (rpmalloc_is_thread_initialized())
rpfree(ptr);
}
void
operator delete[](void* ptr, const std::nothrow_t&) noexcept {
if (rpmalloc_is_thread_initialized())
rpfree(ptr);
}
void
operator delete(void* ptr, size_t) noexcept {
if (rpmalloc_is_thread_initialized())
rpfree(ptr);
}
void
operator delete[](void* ptr, size_t) noexcept {
if (rpmalloc_is_thread_initialized())
rpfree(ptr);
}