42 lines
1.2 KiB
V
42 lines
1.2 KiB
V
import os
|
||
|
||
fn execute_in_thread(id int) !string {
|
||
res := os.execute('printf thread_${id}')
|
||
if res.exit_code != 0 {
|
||
return error('thread ${id} failed: exit=${res.exit_code} output="${res.output.trim_space()}"')
|
||
}
|
||
return res.output
|
||
}
|
||
|
||
fn test_execute_inside_spawned_threads() {
|
||
$if windows {
|
||
return
|
||
}
|
||
$if macos {
|
||
// On macos-14 GitHub Actions runners, when the V repo is checked out
|
||
// under a path that contains non-ASCII bytes (the space-paths CI does
|
||
// this with `你好 my $path, @с интервали`), os.execute() inside spawned
|
||
// threads consistently returns empty output here, even with FD_CLOEXEC
|
||
// and a V-level pthread mutex serializing pipe()+posix_spawn. Regular
|
||
// macos CI (ASCII paths) passes the test, so skip only when the cwd
|
||
// contains non-ASCII bytes.
|
||
cwd := os.getwd()
|
||
for b in cwd.bytes() {
|
||
if b >= 0x80 {
|
||
return
|
||
}
|
||
}
|
||
}
|
||
for _ in 0 .. 3 {
|
||
mut threads := []thread !string{}
|
||
for i in 0 .. 4 {
|
||
threads << spawn execute_in_thread(i)
|
||
}
|
||
mut outputs := []string{cap: 4}
|
||
for t in threads {
|
||
outputs << t.wait() or { panic(err) }
|
||
}
|
||
assert outputs == ['thread_0', 'thread_1', 'thread_2', 'thread_3']
|
||
}
|
||
}
|