lib/gpalloc/src/large/class.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const size_class = @import("../root.zig").class;
3 const model = @import("model.zig");
4
5 const Alignment = std.mem.Alignment;
6 const Class = model.Class;
7
8 pub fn classFor(len: usize, requested_alignment: Alignment) ?Class {
9 if (requested_alignment.toByteUnits() > size_class.min_alignment) return null;
10 if (len > size_class.max_small_size and len <= model.max_small_cached_size) {
11 const class_size = std.mem.alignForward(usize, len, model.class_step);
12 if (class_size < model.min_cached_size or class_size > model.max_small_cached_size) return null;
13 return .{
14 .index = (class_size - model.min_cached_size) / model.class_step,
15 .size = class_size,
16 };
17 }
18 if (len >= model.min_huge_cached_size and len <= model.max_cached_size) {
19 const class_size = std.mem.alignForward(usize, len, model.huge_class_step);
20 if (class_size < model.min_huge_cached_size or class_size > model.max_cached_size) return null;
21 return .{
22 .index = model.small_class_count + (class_size - model.min_huge_cached_size) / model.huge_class_step,
23 .size = class_size,
24 };
25 }
26 return null;
27 }
28
29 pub fn classForIndex(index: usize) Class {
30 return .{
31 .index = index,
32 .size = sizeForIndex(index),
33 };
34 }
35
36 pub fn backingSize(class: Class) usize {
37 return backingSizeForClassSize(class.size);
38 }
39
40 pub fn sizeForIndex(index: usize) usize {
41 if (index >= model.small_class_count) {
42 return model.min_huge_cached_size + (index - model.small_class_count) * model.huge_class_step;
43 }
44 return model.min_cached_size + index * model.class_step;
45 }
46
47 pub fn backingSizeForClassSize(class_size: usize) usize {
48 return class_size + model.header_size;
49 }
50
51 test "large cache leaves medium page-run sizes to medium policy" {
52 try std.testing.expect(classFor(model.max_small_cached_size, .@"1") != null);
53 try std.testing.expect(classFor(model.max_small_cached_size + 1, .@"1") == null);
54 try std.testing.expect(classFor(400 * 1024, .@"1") == null);
55 try std.testing.expect(classFor(model.max_medium_cached_size, .@"1") == null);
56 }