Selaa lähdekoodia

Merge pull request #5491 from Feoramund/buddy-2

Fix Linux-specific optimized test failure
Jeroen van Rijn 4 päivää sitten
vanhempi
commit
315cd51f76
2 muutettua tiedostoa jossa 13 lisäystä ja 5 poistoa
  1. 4 1
      core/mem/allocators.odin
  2. 9 4
      tests/core/mem/test_core_mem.odin

+ 4 - 1
core/mem/allocators.odin

@@ -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

+ 9 - 4
tests/core/mem/test_core_mem.odin

@@ -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)
-	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 / 16)
+	basic_sanity_test(t, mem.buddy_allocator(&ba), N / 16)
 }
 }
 
 
 @test
 @test