blob: df5ed04932ffae50e3766903e26168befc88aeea [file] [log] [blame]
/*
* Copyright (c) 2018-2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PAS_INTERNAL_CONFIG_H
#define PAS_INTERNAL_CONFIG_H
#include "pas_config.h"
#define PAS_SUBPAGE_SIZE 4096
#define PAS_USE_SMALL_SEGREGATED_OVERRIDE true
#define PAS_USE_MEDIUM_SEGREGATED_OVERRIDE true
#define PAS_USE_SMALL_BITFIT_OVERRIDE true
#define PAS_USE_MEDIUM_BITFIT_OVERRIDE true
#define PAS_USE_MARGE_BITFIT_OVERRIDE true
/* The OS may have a smaller page size. That's OK. */
#define PAS_SMALL_PAGE_DEFAULT_SHIFT 14
#define PAS_SMALL_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_SMALL_PAGE_DEFAULT_SHIFT)
#define PAS_SMALL_BITFIT_PAGE_DEFAULT_SHIFT 14
#define PAS_SMALL_BITFIT_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_SMALL_BITFIT_PAGE_DEFAULT_SHIFT)
#define PAS_MEDIUM_PAGE_DEFAULT_SHIFT 17
#define PAS_MEDIUM_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_MEDIUM_PAGE_DEFAULT_SHIFT)
#define PAS_MARGE_PAGE_DEFAULT_SHIFT 22
#define PAS_MARGE_PAGE_DEFAULT_SIZE ((size_t)1 << PAS_MARGE_PAGE_DEFAULT_SHIFT)
#if PAS_ARM64
#define PAS_GRANULE_DEFAULT_SHIFT 14
#else
#define PAS_GRANULE_DEFAULT_SHIFT 12
#endif
#define PAS_GRANULE_DEFAULT_SIZE ((size_t)1 << PAS_GRANULE_DEFAULT_SHIFT)
#define PAS_FAST_MEGAPAGE_SHIFT 24
#define PAS_FAST_MEGAPAGE_SIZE ((size_t)1 << PAS_FAST_MEGAPAGE_SHIFT)
#define PAS_MEDIUM_MEGAPAGE_SHIFT 24
#define PAS_MEDIUM_MEGAPAGE_SIZE ((size_t)1 << PAS_MEDIUM_MEGAPAGE_SHIFT)
#define PAS_MIN_ALIGN_SHIFT 4
#define PAS_MIN_ALIGN ((size_t)1 << PAS_MIN_ALIGN_SHIFT)
/* This is the same as PAS_BITVECTOR_WORD_SHIFT, which is a nice performance optimization but
isn't necessary. It's a performance optimization because there are specialized fast code
paths for sharing_shift == PAS_BITVECTOR_WORD_SHIFT. */
#define PAS_SMALL_SHARING_SHIFT 5
#define PAS_APPROXIMATE_LARGE_SIZE_SHIFT 10
#define PAS_APPROXIMATE_LARGE_SIZE ((size_t)1 << PAS_APPROXIMATE_LARGE_SIZE_SHIFT)
/* This is the minimum object size in small allocators and we rely on this to lay out alloc
bits. */
#define PAS_MIN_OBJECT_SIZE_SHIFT 4
#define PAS_MIN_OBJECT_SIZE ((size_t)1 << PAS_MIN_OBJECT_SIZE_SHIFT)
#define PAS_MIN_MEDIUM_ALIGN_SHIFT 9
#define PAS_MIN_MEDIUM_ALIGN ((size_t)1 << PAS_MIN_MEDIUM_ALIGN_SHIFT)
#define PAS_MIN_MARGE_ALIGN_SHIFT 12
#define PAS_MIN_MARGE_ALIGN ((size_t)1 << PAS_MIN_MARGE_ALIGN_SHIFT)
#define PAS_MEDIUM_SHARING_SHIFT 3
#define PAS_SMALL_SIZE_AWARE_LOGGING false
#define PAS_MEDIUM_SIZE_AWARE_LOGGING true
#define PAS_MIN_OBJECTS_PER_PAGE 6
/* Expresses the probability using integers in the range 0..UINT_MAX (inclusive) */
#define PAS_PROBABILITY_OF_SHARED_PAGE_INELIGIBILITY 0x1fffffff
#ifdef PAS_LIBMALLOC
#define PAS_DEALLOCATION_LOG_SIZE 10
#define PAS_DEALLOCATION_LOG_MAX_BYTES 1000
#else
#define PAS_DEALLOCATION_LOG_SIZE 1000
#define PAS_DEALLOCATION_LOG_MAX_BYTES 50000
#endif
#define PAS_NUM_STATIC_FAST_MEGAPAGE_TABLES 0
#define PAS_USE_DYNAMIC_FAST_MEGAPAGE_TABLE 1
#define PAS_NUM_FAST_FAST_MEGAPAGE_BITS 524288
#define PAS_MAX_OBJECT_SIZE(payload_size) ((size_t)(payload_size) / (size_t)PAS_MIN_OBJECTS_PER_PAGE)
#define PAS_INTRINSIC_SMALL_LOOKUP_SIZE_UPPER_BOUND 10000
#define PAS_SMALL_LOOKUP_SIZE_UPPER_BOUND 500
#define PAS_UTILITY_LOOKUP_SIZE_UPPER_BOUND 1400
#define PAS_NUM_INTRINSIC_SIZE_CLASSES \
((PAS_INTRINSIC_SMALL_LOOKUP_SIZE_UPPER_BOUND >> PAS_MIN_ALIGN_SHIFT) + 1)
#define PAS_NUM_UTILITY_SIZE_CLASSES \
((PAS_UTILITY_LOOKUP_SIZE_UPPER_BOUND >> PAS_INTERNAL_MIN_ALIGN_SHIFT) + 1)
#define PAS_SIZE_CLASS_PROGRESSION 1.3
#define PAS_SMALL_PAGE_HANDICAP 1.
#define PAS_MEDIUM_PAGE_HANDICAP 1.05
#define PAS_SMALL_BITFIT_PAGE_HANDICAP 1.
#define PAS_MEDIUM_BITFIT_PAGE_HANDICAP 1.05
#define PAS_MAX_LARGE_ALIGNMENT_WASTEAGE 1.3
#define PAS_BITS_TTL 16
#define PAS_NUM_BASELINE_ALLOCATORS 32u
#define PAS_MAX_OBJECTS_PER_PAGE 2048
#define PAS_MADVISE_SYMMETRIC 0
#ifdef PAS_LIBMALLOC
#define PAS_PAGE_BALANCING_ENABLED true
#else
#define PAS_PAGE_BALANCING_ENABLED false
#endif
#define PAS_SMALL_SHARED_PAGE_LOG_SHIFT 0
#define PAS_MEDIUM_SHARED_PAGE_LOG_SHIFT 1
#define PAS_UTILITY_BOUND_FOR_PARTIAL_VIEWS 0
#define PAS_UTILITY_BOUND_FOR_BASELINE_ALLOCATORS 0
#define PAS_UTILITY_BOUND_FOR_NO_VIEW_CACHE UINT_MAX
#define PAS_UTILITY_MAX_SEGREGATED_OBJECT_SIZE UINT_MAX
#define PAS_UTILITY_MAX_BITFIT_OBJECT_SIZE 0
/* Intrinsic heaps are for global, singleton, process-wide heaps -- so the "not isoheaped" heap, the
thing you get from regular malloc. */
#define PAS_INTRINSIC_BOUND_FOR_PARTIAL_VIEWS 0
#define PAS_INTRINSIC_BOUND_FOR_BASELINE_ALLOCATORS 0
#define PAS_INTRINSIC_BOUND_FOR_NO_VIEW_CACHE 0
#define PAS_INTRINSIC_MAX_SEGREGATED_OBJECT_SIZE UINT_MAX
#define PAS_INTRINSIC_MAX_BITFIT_OBJECT_SIZE UINT_MAX
/* This is for heaps that hold primitives but should be kept separate from the main heap. So, the
tuning has to be such that we are efficient for lots of small heaps. But, there's no restriction
on whether the data in the heap is reused in any particular way -- we run this with a type size
of 1. */
#define PAS_PRIMITIVE_BOUND_FOR_PARTIAL_VIEWS 0
#define PAS_PRIMITIVE_BOUND_FOR_BASELINE_ALLOCATORS 0
#define PAS_PRIMITIVE_BOUND_FOR_NO_VIEW_CACHE UINT_MAX
#define PAS_PRIMITIVE_MAX_SEGREGATED_OBJECT_SIZE UINT_MAX
#define PAS_PRIMITIVE_MAX_BITFIT_OBJECT_SIZE UINT_MAX
/* This is for heaps that hold typed objects. These objects have a certain size. We may allocate
arrays of these objects. The type may tell us an alignment requirement in addition to a size.
The alignment requirement is taken together with the minalign argument (the allocator uses
whichever is bigger), but it's a bit more optimal to convey alignment using the alignment part
of the type than by passing it to minalign. */
#define PAS_TYPED_BOUND_FOR_PARTIAL_VIEWS 10
#define PAS_TYPED_BOUND_FOR_BASELINE_ALLOCATORS 0
#define PAS_TYPED_BOUND_FOR_NO_VIEW_CACHE UINT_MAX
#define PAS_TYPED_MAX_SEGREGATED_OBJECT_SIZE UINT_MAX
#define PAS_TYPED_MAX_BITFIT_OBJECT_SIZE 0
/* This is for heaps of flexible array member objects. These are variable-sized objects of a certain
type. We should assume that different-sized instances can only be overlapped at the header.
Implementing these as segregated heaps is valid since sizes get segregated and different-sized
objects will only overlap at the header. However, FIXME: we need flex heaps to use a large heap
that won't overlap objects in these heaps as if they were arrays. */
#define PAS_FLEX_BOUND_FOR_PARTIAL_VIEWS 10
#define PAS_FLEX_BOUND_FOR_BASELINE_ALLOCATORS 10
#define PAS_FLEX_BOUND_FOR_NO_VIEW_CACHE UINT_MAX
#define PAS_FLEX_MAX_SEGREGATED_OBJECT_SIZE UINT_MAX
#define PAS_FLEX_MAX_BITFIT_OBJECT_SIZE 0
#endif /* PAS_INTERNAL_CONFIG_H */