xref: /aosp_15_r20/external/cronet/base/process/memory_win.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/process/memory.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/partition_alloc_buildflags.h"
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM)
10*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/shim/allocator_shim.h"
11*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <windows.h>  // Must be in front of other Windows header files.
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include <new.h>
16*6777b538SAndroid Build Coastguard Worker #include <psapi.h>
17*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
18*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace base {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker // Return a non-0 value to retry the allocation.
ReleaseReservationOrTerminate(size_t size)25*6777b538SAndroid Build Coastguard Worker int ReleaseReservationOrTerminate(size_t size) {
26*6777b538SAndroid Build Coastguard Worker   constexpr int kRetryAllocation = 1;
27*6777b538SAndroid Build Coastguard Worker   if (internal::ReleaseAddressSpaceReservation())
28*6777b538SAndroid Build Coastguard Worker     return kRetryAllocation;
29*6777b538SAndroid Build Coastguard Worker   TerminateBecauseOutOfMemory(size);
30*6777b538SAndroid Build Coastguard Worker   return 0;
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker }  // namespace
34*6777b538SAndroid Build Coastguard Worker 
EnableTerminationOnHeapCorruption()35*6777b538SAndroid Build Coastguard Worker void EnableTerminationOnHeapCorruption() {
36*6777b538SAndroid Build Coastguard Worker   // Ignore the result code. Supported on XP SP3 and Vista.
37*6777b538SAndroid Build Coastguard Worker   HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker 
EnableTerminationOnOutOfMemory()40*6777b538SAndroid Build Coastguard Worker void EnableTerminationOnOutOfMemory() {
41*6777b538SAndroid Build Coastguard Worker   constexpr int kCallNewHandlerOnAllocationFailure = 1;
42*6777b538SAndroid Build Coastguard Worker   _set_new_handler(&ReleaseReservationOrTerminate);
43*6777b538SAndroid Build Coastguard Worker   _set_new_mode(kCallNewHandlerOnAllocationFailure);
44*6777b538SAndroid Build Coastguard Worker }
45*6777b538SAndroid Build Coastguard Worker 
UncheckedMalloc(size_t size,void ** result)46*6777b538SAndroid Build Coastguard Worker bool UncheckedMalloc(size_t size, void** result) {
47*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM)
48*6777b538SAndroid Build Coastguard Worker   *result = allocator_shim::UncheckedAlloc(size);
49*6777b538SAndroid Build Coastguard Worker #else
50*6777b538SAndroid Build Coastguard Worker   // malloc_unchecked is required to implement UncheckedMalloc properly.
51*6777b538SAndroid Build Coastguard Worker   // It's provided by allocator_shim_win.cc but since that's not always present,
52*6777b538SAndroid Build Coastguard Worker   // In the case, use regular malloc instead.
53*6777b538SAndroid Build Coastguard Worker   *result = malloc(size);
54*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)
55*6777b538SAndroid Build Coastguard Worker   return *result != NULL;
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
UncheckedFree(void * ptr)58*6777b538SAndroid Build Coastguard Worker void UncheckedFree(void* ptr) {
59*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM)
60*6777b538SAndroid Build Coastguard Worker   allocator_shim::UncheckedFree(ptr);
61*6777b538SAndroid Build Coastguard Worker #else
62*6777b538SAndroid Build Coastguard Worker   free(ptr);
63*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker }  // namespace base
67