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 WorkerNOINLINE 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 Workervoid 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 Workerbool 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