xref: /reactos/sdk/lib/ucrt/heap/heap_handle.cpp (revision ffd69754)
1 //
2 // heap_handle.cpp
3 //
4 //      Copyright (c) Microsoft Corporation. All rights reserved.
5 //
6 // Defines the global CRT heap handle and initialization/termination functions.
7 //
8 #include <corecrt_internal.h>
9 #include <malloc.h>
10 
11 
12 
13 // The CRT heap handle.  This global variable is modified only during CRT
14 // startup and CRT shutdown.
15 extern "C" { HANDLE __acrt_heap = nullptr; }
16 
17 
18 
19 // Initializes the heap.  This function must be called during CRT startup, and
20 // must be called before any user code that might use the heap is executed.
__acrt_initialize_heap()21 extern "C" bool __cdecl __acrt_initialize_heap()
22 {
23     __acrt_heap = GetProcessHeap();
24     if (__acrt_heap == nullptr)
25         return false;
26 
27     return true;
28 }
29 
30 // Uninitializes the heap.  This function should be called during CRT shutdown,
31 // after any user code that might use the heap has stopped running.
__acrt_uninitialize_heap(bool const)32 extern "C" bool __cdecl __acrt_uninitialize_heap(bool const /* terminating */)
33 {
34     __acrt_heap = nullptr;
35     return true;
36 }
37 
38 // Gets the HANDLE of the CRT heap.  Because the CRT always uses the process
39 // heap, this function always returns the same thing as GetProcessHeap().
_get_heap_handle()40 extern "C" intptr_t __cdecl _get_heap_handle()
41 {
42     _ASSERTE(__acrt_heap != nullptr);
43     return reinterpret_cast<intptr_t>(__acrt_heap);
44 }
45 
46 // Internal CRT function to get the HANDLE of the CRT heap, that returns a
47 // HANDLE instead of an intptr_t.
__acrt_getheap()48 extern "C" HANDLE __acrt_getheap()
49 {
50     _ASSERTE(__acrt_heap != nullptr);
51     return __acrt_heap;
52 }
53