| ... | ... | @@ -51,9 +51,9 @@ const slab_len: usize = @max(std.heap.page_size_max, 64 * 1024); |
| 51 | 51 | /// Because of storing free list pointers, the minimum size class is 3. |
| 52 | 52 | const min_class = math.log2(@sizeOf(usize)); |
| 53 | 53 | const size_class_count = math.log2(slab_len) - min_class; |
| 54 | | /// When a freelist length exceeds this number, a `free` will rotate up to |
| 55 | | /// `max_free_search` times before pushing. |
| 56 | | const max_freelist_len: u8 = 255; |
| 54 | /// When a freelist length exceeds this number of slabs, a `free` will rotate |
| 55 | /// up to `max_free_search` times before pushing. |
| 56 | const max_freelist_len = 255; |
| 57 | 57 | const max_free_search = 1; |
| 58 | 58 | /// Before mapping a fresh page, `alloc` will rotate this many times. |
| 59 | 59 | const max_alloc_search = 1; |
| ... | ... | @@ -142,7 +142,6 @@ fn alloc(context: *anyopaque, len: usize, alignment: mem.Alignment, ra: usize) ? |
| 142 | 142 | defer t.unlock(); |
| 143 | 143 | const node: *usize = @ptrFromInt(top_free_ptr); |
| 144 | 144 | t.frees[class] = node.*; |
| 145 | | t.freelist_lens[class] -|= 1; |
| 146 | 145 | return @ptrFromInt(top_free_ptr); |
| 147 | 146 | } |
| 148 | 147 | |
| ... | ... | @@ -223,7 +222,7 @@ fn free(context: *anyopaque, memory: []u8, alignment: mem.Alignment, ra: usize) |
| 223 | 222 | if (freelist_len < max_freelist_len) { |
| 224 | 223 | @branchHint(.likely); |
| 225 | 224 | defer t.unlock(); |
| 226 | | t.freelist_lens[class] = freelist_len +| 1; |
| 225 | t.freelist_lens[class] = freelist_len +| @intFromBool((@intFromPtr(node) % slab_len) == 0); |
| 227 | 226 | node.* = t.frees[class]; |
| 228 | 227 | t.frees[class] = @intFromPtr(node); |
| 229 | 228 | return; |
| ... | ... | @@ -231,7 +230,7 @@ fn free(context: *anyopaque, memory: []u8, alignment: mem.Alignment, ra: usize) |
| 231 | 230 | |
| 232 | 231 | if (search_count >= max_free_search) { |
| 233 | 232 | defer t.unlock(); |
| 234 | | t.freelist_lens[class] = freelist_len +| 1; |
| 233 | t.freelist_lens[class] = freelist_len +| @intFromBool((@intFromPtr(node) % slab_len) == 0); |
| 235 | 234 | node.* = t.frees[class]; |
| 236 | 235 | t.frees[class] = @intFromPtr(node); |
| 237 | 236 | return; |