mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 12:12:45 +00:00 
			
		
		
		
	AK: Declare operators new and delete as global functions
				
					
				
			This fixes a build issue introduced in 23d66fe, where the compiler
statically detected that that mismatching new and delete operators were
used.
Clang generates a warning for this, for the reasons described in the
comment in `AK/kmalloc.cpp`, but GCC does not.
Besides moving the allocator functions into a `.cpp` file, declarations
in `AK/kmalloc.cpp` were reordered to have imports at the top, in order
to make the code more readable.
			
			
This commit is contained in:
		
							parent
							
								
									27fecf57bd
								
							
						
					
					
						commit
						a482a3e609
					
				
					 2 changed files with 77 additions and 65 deletions
				
			
		
							
								
								
									
										62
									
								
								AK/kmalloc.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								AK/kmalloc.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,62 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | ||||
|  * Copyright (c) 2021, Daniel Bertalan <dani@danielbertalan.dev> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #if defined(__serenity__) && !defined(KERNEL) | ||||
| 
 | ||||
| #    include <AK/Assertions.h> | ||||
| #    include <AK/kmalloc.h> | ||||
| 
 | ||||
| // 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 | ||||
							
								
								
									
										80
									
								
								AK/kmalloc.h
									
										
									
									
									
								
							
							
						
						
									
										80
									
								
								AK/kmalloc.h
									
										
									
									
									
								
							|  | @ -1,13 +1,27 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | ||||
|  * Copyright (c) 2021, Daniel Bertalan <dani@danielbertalan.dev> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #ifndef __serenity__ | ||||
| #if defined(KERNEL) | ||||
| #    include <Kernel/Heap/kmalloc.h> | ||||
| #else | ||||
| #    include <new> | ||||
| #    include <stdlib.h> | ||||
| 
 | ||||
| #    define kcalloc calloc | ||||
| #    define kmalloc malloc | ||||
| #    define kmalloc_good_size malloc_good_size | ||||
| #    define kfree free | ||||
| #    define krealloc realloc | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __serenity__ | ||||
| #    include <AK/Types.h> | ||||
| 
 | ||||
| #    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 <Kernel/Heap/kmalloc.h> | ||||
| #else | ||||
| #    include <stdlib.h> | ||||
| 
 | ||||
| #    define kcalloc calloc | ||||
| #    define kmalloc malloc | ||||
| #    define kmalloc_good_size malloc_good_size | ||||
| #    define kfree free | ||||
| #    define krealloc realloc | ||||
| 
 | ||||
| #    ifdef __serenity__ | ||||
| 
 | ||||
| #        include <AK/Assertions.h> | ||||
| #        include <new> | ||||
| 
 | ||||
| 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; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Daniel Bertalan
						Daniel Bertalan