| ... | @@ -51,7 +51,7 @@ threadlocal var thread_index: u32 = 0; | ... | @@ -51,7 +51,7 @@ threadlocal var thread_index: u32 = 0; |
| 51 | const max_thread_count = 128; | 51 | const max_thread_count = 128; |
| 52 | const slab_len: usize = @max(std.heap.page_size_max, 256 * 1024); | 52 | const slab_len: usize = @max(std.heap.page_size_max, 256 * 1024); |
| 53 | /// Because of storing free list pointers, the minimum size class is 3. | 53 | /// Because of storing free list pointers, the minimum size class is 3. |
| 54 | const min_class = math.log2(math.ceilPowerOfTwoAssert(usize, 1 + @sizeOf(usize))); | 54 | const min_class = math.log2(@sizeOf(usize)); |
| 55 | const size_class_count = math.log2(slab_len) - min_class; | 55 | const size_class_count = math.log2(slab_len) - min_class; |
| 56 | | 56 | |
| 57 | const Thread = struct { | 57 | const Thread = struct { |
| ... | @@ -132,7 +132,7 @@ fn alloc(context: *anyopaque, len: usize, alignment: mem.Alignment, ra: usize) ? | ... | @@ -132,7 +132,7 @@ fn alloc(context: *anyopaque, len: usize, alignment: mem.Alignment, ra: usize) ? |
| 132 | if (top_free_ptr != 0) { | 132 | if (top_free_ptr != 0) { |
| 133 | @branchHint(.likely); | 133 | @branchHint(.likely); |
| 134 | defer t.unlock(); | 134 | defer t.unlock(); |
| 135 | const node: *usize = @ptrFromInt(top_free_ptr + (slot_size - @sizeOf(usize))); | 135 | const node: *usize = @ptrFromInt(top_free_ptr); |
| 136 | t.frees[class] = node.*; | 136 | t.frees[class] = node.*; |
| 137 | return @ptrFromInt(top_free_ptr); | 137 | return @ptrFromInt(top_free_ptr); |
| 138 | } | 138 | } |
| ... | @@ -202,22 +202,17 @@ fn free(context: *anyopaque, memory: []u8, alignment: mem.Alignment, ra: usize) | ... | @@ -202,22 +202,17 @@ fn free(context: *anyopaque, memory: []u8, alignment: mem.Alignment, ra: usize) |
| 202 | return PageAllocator.unmap(@alignCast(memory)); | 202 | return PageAllocator.unmap(@alignCast(memory)); |
| 203 | } | 203 | } |
| 204 | | 204 | |
| 205 | const slot_size = slotSize(class); | 205 | const node: *usize = @alignCast(@ptrCast(memory.ptr)); |
| 206 | const addr = @intFromPtr(memory.ptr); | | |
| 207 | const node: *usize = @ptrFromInt(addr + (slot_size - @sizeOf(usize))); | | |
| 208 | | 206 | |
| 209 | const t = Thread.lock(); | 207 | const t = Thread.lock(); |
| 210 | defer t.unlock(); | 208 | defer t.unlock(); |
| 211 | | 209 | |
| 212 | node.* = t.frees[class]; | 210 | node.* = t.frees[class]; |
| 213 | t.frees[class] = addr; | 211 | t.frees[class] = @intFromPtr(node); |
| 214 | } | 212 | } |
| 215 | | 213 | |
| 216 | fn sizeClassIndex(len: usize, alignment: mem.Alignment) usize { | 214 | fn sizeClassIndex(len: usize, alignment: mem.Alignment) usize { |
| 217 | return @max( | 215 | return @max(@bitSizeOf(usize) - @clz(len - 1), @intFromEnum(alignment), min_class) - min_class; |
| 218 | @bitSizeOf(usize) - @clz(len + (@sizeOf(usize) - 1)), | | |
| 219 | @intFromEnum(alignment) + 1, | | |
| 220 | ) - min_class; | | |
| 221 | } | 216 | } |
| 222 | | 217 | |
| 223 | fn slotSize(class: usize) usize { | 218 | fn slotSize(class: usize) usize { |