Allow larger thread poly data

The poly data currently has the restriction of being less than a
pointer's size, but there is much more space in the `Thread.user_args`
array which can be utilized, this commit allows you to pass types that are
larger than pointer length as long as the total size of the poly data is
less than that of the `Thread.user_args`.
This commit is contained in:
Laytan Laats
2023-11-09 12:12:01 +01:00
parent 8028033513
commit 9078ddaf5a
4 changed files with 144 additions and 39 deletions
+80
View File
@@ -0,0 +1,80 @@
package test_core_thread
import "core:testing"
import "core:thread"
import "core:fmt"
import "core:os"
TEST_count := 0
TEST_fail := 0
t := &testing.T{}
when ODIN_TEST {
expect :: testing.expect
log :: testing.log
} else {
expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) {
TEST_count += 1
if !condition {
TEST_fail += 1
fmt.printf("[%v] %v\n", loc, message)
return
}
}
log :: proc(t: ^testing.T, v: any, loc := #caller_location) {
fmt.printf("[%v] ", loc)
fmt.printf("log: %v\n", v)
}
}
main :: proc() {
poly_data_test(t)
if TEST_fail > 0 {
os.exit(1)
}
}
@(test)
poly_data_test :: proc(_t: ^testing.T) {
MAX :: size_of(rawptr) * thread.MAX_USER_ARGUMENTS
@static t: ^testing.T
t = _t
b: [MAX]byte = 8
t1 := thread.create_and_start_with_poly_data(b, proc(b: [MAX]byte) {
b_expect: [MAX]byte = 8
expect(t, b == b_expect, "thread poly data not correct")
}, self_cleanup = true)
b1: [3]uintptr = 1
b2: [MAX / 2]byte = 3
t2 := thread.create_and_start_with_poly_data2(b1, b2, proc(b: [3]uintptr, b2: [MAX / 2]byte) {
b_expect: [3]uintptr = 1
b2_expect: [MAX / 2]byte = 3
expect(t, b == b_expect, "thread poly data not correct")
expect(t, b2 == b2_expect, "thread poly data not correct")
}, self_cleanup = true)
t3 := thread.create_and_start_with_poly_data3(b1, b2, uintptr(333), proc(b: [3]uintptr, b2: [MAX / 2]byte, b3: uintptr) {
b_expect: [3]uintptr = 1
b2_expect: [MAX / 2]byte = 3
expect(t, b == b_expect, "thread poly data not correct")
expect(t, b2 == b2_expect, "thread poly data not correct")
expect(t, b3 == 333, "thread poly data not correct")
}, self_cleanup = true)
t4 := thread.create_and_start_with_poly_data4(uintptr(111), b1, uintptr(333), u8(5), proc(n: uintptr, b: [3]uintptr, n2: uintptr, n4: u8) {
b_expect: [3]uintptr = 1
expect(t, n == 111, "thread poly data not correct")
expect(t, b == b_expect, "thread poly data not correct")
expect(t, n2 == 333, "thread poly data not correct")
expect(t, n4 == 5, "thread poly data not correct")
}, self_cleanup = true)
thread.join_multiple(t1, t2, t3, t4)
}