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 }