| 62 | unsafe impl GlobalAlloc for Locked<FixedSizeBlockAlloc> |
| 63 | { |
| 64 | unsafe fn alloc(&self, layout: Layout) -> *mut u8 |
| 65 | { |
| 66 | let mut allocator = self.lock(); |
| 67 | match lsidx(&layout) |
| 68 | { |
| 69 | Some(index) => |
| 70 | { |
| 71 | match allocator.listheads[index].take() |
| 72 | { |
| 73 | Some(node) => |
| 74 | { |
| 75 | allocator.listheads[index] = node.next.take(); |
| 76 | node as *mut ListNode as *mut u8 |
| 77 | } |
| 78 | None => |
| 79 | { |
| 80 | // If no block exists in list, allocate a new block. |
| 81 | let blksize = BLKSIZES[index]; |
| 82 | let blkalign = blksize; |
| 83 | let layout = Layout::from_size_align(blksize, blkalign).unwrap(); |
| 84 | allocator.fballoc(layout) |
| 85 | } |
| 86 | } |
| 87 | } |
| 88 | None => allocator.fballoc(layout), |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) |
| 93 | { |