diff --git a/AK/kmalloc.cpp b/AK/kmalloc.cpp new file mode 100644 index 0000000000..d6635f9ee2 --- /dev/null +++ b/AK/kmalloc.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Daniel Bertalan + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#if defined(__serenity__) && !defined(KERNEL) + +# include +# include + +// However deceptively simple these functions look, they must not be inlined. +// Memory allocated in one translation unit has to be deallocatable in another +// translation unit, so these functions must be the same everywhere. +// By making these functions global, this invariant is enforced. + +void* operator new(size_t size) +{ + void* ptr = malloc(size); + VERIFY(ptr); + return ptr; +} + +void* operator new(size_t size, const std::nothrow_t&) noexcept +{ + return malloc(size); +} + +void operator delete(void* ptr) noexcept +{ + return free(ptr); +} + +void operator delete(void* ptr, size_t) noexcept +{ + return free(ptr); +} + +void* operator new[](size_t size) +{ + void* ptr = malloc(size); + VERIFY(ptr); + return ptr; +} + +void* operator new[](size_t size, const std::nothrow_t&) noexcept +{ + return malloc(size); +} + +void operator delete[](void* ptr) noexcept +{ + return free(ptr); +} + +void operator delete[](void* ptr, size_t) noexcept +{ + return free(ptr); +} + +#endif diff --git a/AK/kmalloc.h b/AK/kmalloc.h index 5807828980..03484a7280 100644 --- a/AK/kmalloc.h +++ b/AK/kmalloc.h @@ -1,13 +1,27 @@ /* * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Daniel Bertalan * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#ifndef __serenity__ +#if defined(KERNEL) +# include +#else # include +# include + +# define kcalloc calloc +# define kmalloc malloc +# define kmalloc_good_size malloc_good_size +# define kfree free +# define krealloc realloc +#endif + +#ifndef __serenity__ +# include # ifndef AK_OS_MACOS extern "C" { @@ -28,68 +42,4 @@ inline size_t malloc_good_size(size_t size) { return size; } # define AK_MAKE_ETERNAL #endif -#if defined(KERNEL) -# include -#else -# include - -# define kcalloc calloc -# define kmalloc malloc -# define kmalloc_good_size malloc_good_size -# define kfree free -# define krealloc realloc - -# ifdef __serenity__ - -# include -# include - -inline void* operator new(size_t size) -{ - void* ptr = kmalloc(size); - VERIFY(ptr); - return ptr; -} - -inline void* operator new(size_t size, const std::nothrow_t&) noexcept -{ - return kmalloc(size); -} - -inline void operator delete(void* ptr) noexcept -{ - return kfree(ptr); -} - -inline void operator delete(void* ptr, size_t) noexcept -{ - return kfree(ptr); -} - -inline void* operator new[](size_t size) -{ - void* ptr = kmalloc(size); - VERIFY(ptr); - return ptr; -} - -inline void* operator new[](size_t size, const std::nothrow_t&) noexcept -{ - return kmalloc(size); -} - -inline void operator delete[](void* ptr) noexcept -{ - return kfree(ptr); -} - -inline void operator delete[](void* ptr, size_t) noexcept -{ - return kfree(ptr); -} - -# endif - -#endif - using std::nothrow;