xref: /aosp_15_r20/external/libchrome/base/process/memory.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/debug/alias.h"
6*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
7*635a8641SAndroid Build Coastguard Worker #include "base/process/memory.h"
8*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker namespace base {
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker // Defined in memory_win.cc for Windows.
13*635a8641SAndroid Build Coastguard Worker #if !defined(OS_WIN)
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace {
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker // Breakpad server classifies base::`anonymous namespace'::OnNoMemory as
18*635a8641SAndroid Build Coastguard Worker // out-of-memory crash.
OnNoMemory(size_t size)19*635a8641SAndroid Build Coastguard Worker NOINLINE void OnNoMemory(size_t size) {
20*635a8641SAndroid Build Coastguard Worker   size_t tmp_size = size;
21*635a8641SAndroid Build Coastguard Worker   base::debug::Alias(&tmp_size);
22*635a8641SAndroid Build Coastguard Worker   LOG(FATAL) << "Out of memory. size=" << tmp_size;
23*635a8641SAndroid Build Coastguard Worker }
24*635a8641SAndroid Build Coastguard Worker 
25*635a8641SAndroid Build Coastguard Worker }  // namespace
26*635a8641SAndroid Build Coastguard Worker 
TerminateBecauseOutOfMemory(size_t size)27*635a8641SAndroid Build Coastguard Worker void TerminateBecauseOutOfMemory(size_t size) {
28*635a8641SAndroid Build Coastguard Worker   OnNoMemory(size);
29*635a8641SAndroid Build Coastguard Worker }
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker #endif
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker // Defined in memory_mac.mm for Mac.
34*635a8641SAndroid Build Coastguard Worker #if !defined(OS_MACOSX)
35*635a8641SAndroid Build Coastguard Worker 
UncheckedCalloc(size_t num_items,size_t size,void ** result)36*635a8641SAndroid Build Coastguard Worker bool UncheckedCalloc(size_t num_items, size_t size, void** result) {
37*635a8641SAndroid Build Coastguard Worker   const size_t alloc_size = num_items * size;
38*635a8641SAndroid Build Coastguard Worker 
39*635a8641SAndroid Build Coastguard Worker   // Overflow check
40*635a8641SAndroid Build Coastguard Worker   if (size && ((alloc_size / size) != num_items)) {
41*635a8641SAndroid Build Coastguard Worker     *result = nullptr;
42*635a8641SAndroid Build Coastguard Worker     return false;
43*635a8641SAndroid Build Coastguard Worker   }
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker   if (!UncheckedMalloc(alloc_size, result))
46*635a8641SAndroid Build Coastguard Worker     return false;
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker   memset(*result, 0, alloc_size);
49*635a8641SAndroid Build Coastguard Worker   return true;
50*635a8641SAndroid Build Coastguard Worker }
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker #endif
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker }  // namespace base
55