aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2025-03-12 22:29:34 +0100
committerDanielGavin <danielgavin5@hotmail.com>2025-03-12 22:29:34 +0100
commitca0450ee28e72c19526fbbfb2f17fc7e086b3258 (patch)
treebf2e2c4fedf6d00923d0ea3b35d7e322b0b4db9b
parent1ed518ae7fc2b1dd96b26901aba16923f55d379a (diff)
Add timeout for `odin check`. There are issues with macos and hanging odin processes.
-rw-r--r--src/common/util.odin14
-rw-r--r--src/common/util_windows.odin14
2 files changed, 27 insertions, 1 deletions
diff --git a/src/common/util.odin b/src/common/util.odin
index 08a846f..10845c4 100644
--- a/src/common/util.odin
+++ b/src/common/util.odin
@@ -8,6 +8,7 @@ import "core:os"
import "core:path/filepath"
import "core:path/slashpath"
import "core:strings"
+import "core:time"
foreign import libc "system:c"
@@ -84,6 +85,8 @@ when ODIN_OS == .Darwin || ODIN_OS == .Linux || ODIN_OS == .NetBSD {
read_buffer: [50]byte
index: int
+ current_time := time.now()
+
for fgets(&read_buffer[0], size_of(read_buffer), fp) != nil {
read := bytes.index_byte(read_buffer[:], 0)
defer index += cast(int)read
@@ -91,6 +94,16 @@ when ODIN_OS == .Darwin || ODIN_OS == .Linux || ODIN_OS == .NetBSD {
if read > 0 && index + cast(int)read <= len(stdout) {
mem.copy(&stdout[index], &read_buffer[0], cast(int)read)
}
+
+ elapsed_time := time.now()
+ duration := time.diff(current_time, elapsed_time)
+
+ if time.duration_seconds(duration) > 20 {
+ log.error("odin check timed out")
+ return 0, false, stdout[0:]
+ }
+
+ current_time = elapsed_time
}
@@ -102,7 +115,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .Linux || ODIN_OS == .NetBSD {
popen :: proc(command: cstring, type: cstring) -> ^FILE ---
pclose :: proc(stream: ^FILE) -> i32 ---
fgets :: proc "cdecl" (s: [^]byte, n: i32, stream: ^FILE) -> [^]u8 ---
- fgetc :: proc "cdecl" (stream: ^FILE) -> i32 ---
}
}
diff --git a/src/common/util_windows.odin b/src/common/util_windows.odin
index db280ad..6f4e0c1 100644
--- a/src/common/util_windows.odin
+++ b/src/common/util_windows.odin
@@ -4,6 +4,7 @@ import "core:fmt"
import "core:log"
import "core:mem"
import "core:strings"
+import "core:time"
import win32 "core:sys/windows"
@@ -126,6 +127,8 @@ run_executable :: proc(command: string, stdout: ^[]byte) -> (u32, bool, []byte)
success: win32.BOOL = true
+ current_time := time.now()
+
for success {
success = win32.ReadFile(stdout_read, &read_buffer[0], len(read_buffer), &read, nil)
@@ -134,6 +137,17 @@ run_executable :: proc(command: string, stdout: ^[]byte) -> (u32, bool, []byte)
}
index += cast(int)read
+
+ elapsed_time := time.now()
+ duration := time.diff(current_time, elapsed_time)
+
+ if time.duration_seconds(duration) > 20 {
+ log.error("odin check timed out")
+ win32.TerminateProcess(process_info.hProcess, 1)
+ return 0, false, stdout[0:]
+ }
+
+ current_time = elapsed_time
}
stdout[index + 1] = 0