// Copyright 2020 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.

#ifndef BASE_ALLOCATOR_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_H_
#define BASE_ALLOCATOR_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_H_

#include "base/allocator/allocator_shim.h"
#include "base/allocator/partition_allocator/partition_alloc.h"
#include "base/base_export.h"

namespace base {
namespace internal {

void PartitionAllocSetCallNewHandlerOnMallocFailure(bool value);

class BASE_EXPORT PartitionAllocMalloc {
 public:
  static ThreadSafePartitionRoot* Allocator();
  // May return |nullptr|, will never return the same pointer as |Allocator()|.
  static ThreadSafePartitionRoot* OriginalAllocator();
  // May return the same pointer as |Allocator()|.
  static ThreadSafePartitionRoot* AlignedAllocator();
};

BASE_EXPORT void* PartitionMalloc(const base::allocator::AllocatorDispatch*,
                                  size_t size,
                                  void* context);

BASE_EXPORT void* PartitionMallocUnchecked(
    const base::allocator::AllocatorDispatch*,
    size_t size,
    void* context);

BASE_EXPORT void* PartitionCalloc(const base::allocator::AllocatorDispatch*,
                                  size_t n,
                                  size_t size,
                                  void* context);

BASE_EXPORT void* PartitionMemalign(const base::allocator::AllocatorDispatch*,
                                    size_t alignment,
                                    size_t size,
                                    void* context);

BASE_EXPORT void* PartitionAlignedAlloc(
    const base::allocator::AllocatorDispatch* dispatch,
    size_t size,
    size_t alignment,
    void* context);

BASE_EXPORT void* PartitionAlignedRealloc(
    const base::allocator::AllocatorDispatch* dispatch,
    void* address,
    size_t size,
    size_t alignment,
    void* context);

BASE_EXPORT void* PartitionRealloc(const base::allocator::AllocatorDispatch*,
                                   void* address,
                                   size_t size,
                                   void* context);

BASE_EXPORT void PartitionFree(const base::allocator::AllocatorDispatch*,
                               void* object,
                               void* context);

BASE_EXPORT size_t
PartitionGetSizeEstimate(const base::allocator::AllocatorDispatch*,
                         void* address,
                         void* context);

}  // namespace internal
}  // namespace base

#endif  // BASE_ALLOCATOR_ALLOCATOR_SHIM_DEFAULT_DISPATCH_TO_PARTITION_ALLOC_H_
