// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/process/memory.h"

#include <stdlib.h>

#include "starboard/memory.h"
#include "starboard/types.h"

namespace base {

void EnableTerminationOnOutOfMemory() {
}

void EnableTerminationOnHeapCorruption() {
}

bool AdjustOOMScore(ProcessId process, int score) {
  return false;
}

void TerminateBecauseOutOfMemory(size_t size) {
  abort();
}

// UncheckedMalloc and Calloc exist so that platforms making use of
// EnableTerminationOnOutOfMemory have a way to allocate memory without
// crashing. This _stubs.cc file is for platforms that do not support
// EnableTerminationOnOutOfMemory (note the empty implementation above). As
// such, these two Unchecked.alloc functions need only trivially pass-through to
// their respective stdlib function since those functions will return null on a
// failure to allocate.

bool UncheckedMalloc(size_t size, void** result) {
  *result = SbMemoryAllocate(size);
  return *result != nullptr;
}

bool UncheckedCalloc(size_t num_items, size_t size, void** result) {
  *result = calloc(num_items, size);
  return *result != nullptr;
}

}  // namespace base
