Files
agila_open_tool/tools/v/vlib/os/execute_lock_nix.c.v
T

28 lines
903 B
V

@[has_globals]
module os
// g_v_os_execute_mutex_storage backs a pthread_mutex_t used to serialize
// pipe()+spawn from os.execute(). On macOS arm64 GitHub Actions runners,
// two threads racing through pipe()+posix_spawn produced empty captured
// output even with FD_CLOEXEC on the pipe ends. 128 bytes is comfortably
// larger than sizeof(pthread_mutex_t) on macOS (64) and Linux (40-48),
// so we never need to know the actual layout — only the C functions
// declared in builtin/cfns.c.v which take voidptr.
__global g_v_os_execute_mutex_storage = [128]u8{}
fn v_os_execute_mutex_ptr() voidptr {
return unsafe { voidptr(&g_v_os_execute_mutex_storage[0]) }
}
fn init() {
C.pthread_mutex_init(v_os_execute_mutex_ptr(), unsafe { nil })
}
fn v_os_execute_lock() {
C.pthread_mutex_lock(v_os_execute_mutex_ptr())
}
fn v_os_execute_unlock() {
C.pthread_mutex_unlock(v_os_execute_mutex_ptr())
}