| ... | ... | @@ -104,7 +104,7 @@ const StackTrace = std.builtin.StackTrace; |
| 104 | 104 | const page_size: usize = @max(std.heap.page_size_max, switch (builtin.os.tag) { |
| 105 | 105 | .windows => 64 * 1024, // Makes `std.heap.PageAllocator` take the happy path. |
| 106 | 106 | .wasi => 64 * 1024, // Max alignment supported by `std.heap.WasmAllocator`. |
| 107 | | else => 512 * 1024, // Avoids too many active mappings when `page_size_max` is low. |
| 107 | else => 128 * 1024, // Avoids too many active mappings when `page_size_max` is low. |
| 108 | 108 | }); |
| 109 | 109 | const page_align: mem.Alignment = .fromByteUnits(page_size); |
| 110 | 110 | |
| ... | ... | @@ -112,8 +112,7 @@ const page_align: mem.Alignment = .fromByteUnits(page_size); |
| 112 | 112 | const SlotIndex = std.meta.Int(.unsigned, math.log2(page_size) + 1); |
| 113 | 113 | const Log2USize = std.math.Log2Int(usize); |
| 114 | 114 | |
| 115 | | const default_test_stack_trace_frames: usize = if (builtin.is_test) 10 else 6; |
| 116 | | const default_sys_stack_trace_frames: usize = if (std.debug.sys_can_stack_trace) default_test_stack_trace_frames else 0; |
| 115 | const default_sys_stack_trace_frames: usize = if (std.debug.sys_can_stack_trace) 6 else 0; |
| 117 | 116 | const default_stack_trace_frames: usize = switch (builtin.mode) { |
| 118 | 117 | .Debug => default_sys_stack_trace_frames, |
| 119 | 118 | else => 0, |
| ... | ... | @@ -219,7 +218,10 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { |
| 219 | 218 | |
| 220 | 219 | pub const Error = mem.Allocator.Error; |
| 221 | 220 | |
| 222 | | const small_bucket_count = math.log2(page_size); |
| 221 | /// Avoids creating buckets that would only be able to store a small |
| 222 | /// number of slots. Value of 1 means 2 is the minimum slot count. |
| 223 | const minimum_slots_per_bucket_log2 = 1; |
| 224 | const small_bucket_count = math.log2(page_size) - minimum_slots_per_bucket_log2; |
| 223 | 225 | const largest_bucket_object_size = 1 << (small_bucket_count - 1); |
| 224 | 226 | const LargestSizeClassInt = std.math.IntFittingRange(0, largest_bucket_object_size); |
| 225 | 227 | |
| ... | ... | @@ -385,21 +387,24 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { |
| 385 | 387 | /// This is executed only at compile-time to prepopulate a lookup table. |
| 386 | 388 | fn calculateSlotCount(size_class_index: usize) SlotIndex { |
| 387 | 389 | const size_class = @as(usize, 1) << @as(Log2USize, @intCast(size_class_index)); |
| 388 | | var lower: usize = 8; |
| 390 | var lower: usize = 1 << minimum_slots_per_bucket_log2; |
| 389 | 391 | var upper: usize = (page_size - bucketSize(lower)) / size_class; |
| 390 | 392 | while (upper > lower) { |
| 391 | 393 | const proposed: usize = lower + (upper - lower) / 2; |
| 392 | 394 | if (proposed == lower) return lower; |
| 393 | 395 | const slots_end = proposed * size_class; |
| 394 | 396 | const header_begin = mem.alignForward(usize, slots_end, @alignOf(BucketHeader)); |
| 395 | | const bucket_size = bucketSize(proposed); |
| 396 | | const end = header_begin + bucket_size; |
| 397 | const end = header_begin + bucketSize(proposed); |
| 397 | 398 | if (end > page_size) { |
| 398 | 399 | upper = proposed - 1; |
| 399 | 400 | } else { |
| 400 | 401 | lower = proposed; |
| 401 | 402 | } |
| 402 | 403 | } |
| 404 | const slots_end = lower * size_class; |
| 405 | const header_begin = mem.alignForward(usize, slots_end, @alignOf(BucketHeader)); |
| 406 | const end = header_begin + bucketSize(lower); |
| 407 | assert(end <= page_size); |
| 403 | 408 | return lower; |
| 404 | 409 | } |
| 405 | 410 | |