Skip to content

Commit 8935b05

Browse files
authored
Merge pull request #8 from richardchien/fix-dealloc
fix buddy `dealloc` bug
2 parents 07f8363 + 6a89f48 commit 8935b05

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

src/frame.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,6 @@ impl FrameAllocator {
111111
let size = count.next_power_of_two();
112112
let class = size.trailing_zeros() as usize;
113113

114-
// Put back into free list
115-
self.free_list[class].insert(frame);
116-
117114
// Merge free buddy lists
118115
let mut current_ptr = frame;
119116
let mut current_class = class;
@@ -123,8 +120,8 @@ impl FrameAllocator {
123120
// Free buddy found
124121
current_ptr = min(current_ptr, buddy);
125122
current_class += 1;
126-
self.free_list[current_class].insert(current_ptr);
127123
} else {
124+
self.free_list[current_class].insert(current_ptr);
128125
break;
129126
}
130127
}

src/test.rs

+13
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,16 @@ fn test_frame_allocator_alloc_and_free() {
132132
frame.dealloc(addr, 512);
133133
}
134134
}
135+
136+
#[test]
137+
fn test_frame_allocator_alloc_and_free_complex() {
138+
let mut frame = FrameAllocator::new();
139+
frame.add_frame(100, 1024);
140+
for _ in 0..10 {
141+
let addr = frame.alloc(1).unwrap();
142+
frame.dealloc(addr, 1);
143+
}
144+
let addr1 = frame.alloc(1).unwrap();
145+
let addr2 = frame.alloc(1).unwrap();
146+
assert_ne!(addr1, addr2);
147+
}

0 commit comments

Comments
 (0)