mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Merge pull request #5491 from Feoramund/buddy-2
Fix Linux-specific optimized test failure
This commit is contained in:
@@ -2223,6 +2223,9 @@ Initialize a buddy allocator.
|
|||||||
|
|
||||||
This procedure initializes the buddy allocator `b` with a backing buffer `data`
|
This procedure initializes the buddy allocator `b` with a backing buffer `data`
|
||||||
and block alignment specified by `alignment`.
|
and block alignment specified by `alignment`.
|
||||||
|
|
||||||
|
`alignment` may be any power of two, but the backing buffer must be aligned to
|
||||||
|
at least `size_of(Buddy_Block)`.
|
||||||
*/
|
*/
|
||||||
buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint, loc := #caller_location) {
|
buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint, loc := #caller_location) {
|
||||||
assert(data != nil)
|
assert(data != nil)
|
||||||
@@ -2233,7 +2236,7 @@ buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint,
|
|||||||
alignment = size_of(Buddy_Block)
|
alignment = size_of(Buddy_Block)
|
||||||
}
|
}
|
||||||
ptr := raw_data(data)
|
ptr := raw_data(data)
|
||||||
assert(uintptr(ptr) % uintptr(alignment) == 0, "data is not aligned to minimum alignment", loc)
|
assert(uintptr(ptr) % uintptr(alignment) == 0, "The data is not aligned to the minimum alignment, which must be at least `size_of(Buddy_Block)`.", loc)
|
||||||
b.head = (^Buddy_Block)(ptr)
|
b.head = (^Buddy_Block)(ptr)
|
||||||
b.head.size = len(data)
|
b.head.size = len(data)
|
||||||
b.head.is_free = true
|
b.head.is_free = true
|
||||||
|
|||||||
@@ -282,13 +282,18 @@ test_dynamic_arena :: proc(t: ^testing.T) {
|
|||||||
|
|
||||||
@test
|
@test
|
||||||
test_buddy :: proc(t: ^testing.T) {
|
test_buddy :: proc(t: ^testing.T) {
|
||||||
N :: 4096
|
N :: 8192
|
||||||
buf: [N]u8
|
buf: [N]u8
|
||||||
|
|
||||||
|
base := &buf[0]
|
||||||
|
address := mem.align_forward(base, size_of(mem.Buddy_Block))
|
||||||
|
delta := uintptr(address) - uintptr(base)
|
||||||
|
|
||||||
ba: mem.Buddy_Allocator
|
ba: mem.Buddy_Allocator
|
||||||
mem.buddy_allocator_init(&ba, buf[:], align_of(u8))
|
|
||||||
basic_sanity_test(t, mem.buddy_allocator(&ba), N / 8)
|
mem.buddy_allocator_init(&ba, buf[delta:delta+N/2], size_of(mem.Buddy_Block))
|
||||||
basic_sanity_test(t, mem.buddy_allocator(&ba), N / 8)
|
basic_sanity_test(t, mem.buddy_allocator(&ba), N / 16)
|
||||||
|
basic_sanity_test(t, mem.buddy_allocator(&ba), N / 16)
|
||||||
}
|
}
|
||||||
|
|
||||||
@test
|
@test
|
||||||
|
|||||||
Reference in New Issue
Block a user