aboutsummaryrefslogtreecommitdiff
path: root/core/os
diff options
context:
space:
mode:
authorlaytan <laytanlaats@hotmail.com>2025-05-06 19:42:52 +0200
committerlaytan <laytanlaats@hotmail.com>2025-05-06 19:42:52 +0200
commit9b218a29225cdc1fbe080f2eb900383ca494b1f9 (patch)
tree762512c7a1ea48b029ea36f008f798fa8c7d4221 /core/os
parentbf5206968a0c46cf9472eb8fa84b6d69be5ecad0 (diff)
don't need to hang on to the null handle
Diffstat (limited to 'core/os')
-rw-r--r--core/os/os2/process.odin2
-rw-r--r--core/os/os2/process_linux.odin3
-rw-r--r--core/os/os2/process_posix.odin2
-rw-r--r--core/os/os2/process_wasi.odin2
-rw-r--r--core/os/os2/process_windows.odin30
5 files changed, 12 insertions, 27 deletions
diff --git a/core/os/os2/process.odin b/core/os/os2/process.odin
index 6e5a0a679..3c84f3539 100644
--- a/core/os/os2/process.odin
+++ b/core/os/os2/process.odin
@@ -266,8 +266,6 @@ specific process, even after it has died.
Process :: struct {
pid: int,
handle: uintptr,
- // Implementation specific state/data.
- _impl: _Process,
}
Process_Open_Flags :: bit_set[Process_Open_Flag]
diff --git a/core/os/os2/process_linux.odin b/core/os/os2/process_linux.odin
index 52a75f548..8a23f0619 100644
--- a/core/os/os2/process_linux.odin
+++ b/core/os/os2/process_linux.odin
@@ -363,9 +363,6 @@ _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime
}
@(private="package")
-_Process :: struct {}
-
-@(private="package")
_process_open :: proc(pid: int, _: Process_Open_Flags) -> (process: Process, err: Error) {
process.pid = pid
process.handle = PIDFD_UNASSIGNED
diff --git a/core/os/os2/process_posix.odin b/core/os/os2/process_posix.odin
index ca1a8f211..6070b19d6 100644
--- a/core/os/os2/process_posix.odin
+++ b/core/os/os2/process_posix.odin
@@ -46,8 +46,6 @@ _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime
return _process_info_by_pid(_get_pid(), selection, allocator)
}
-_Process :: struct {}
-
_process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
if len(desc.command) == 0 {
err = .Invalid_Path
diff --git a/core/os/os2/process_wasi.odin b/core/os/os2/process_wasi.odin
index 1641e7766..9f4d61649 100644
--- a/core/os/os2/process_wasi.odin
+++ b/core/os/os2/process_wasi.odin
@@ -44,8 +44,6 @@ _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime
return
}
-_Process :: struct {}
-
_process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
err = .Unsupported
return
diff --git a/core/os/os2/process_windows.odin b/core/os/os2/process_windows.odin
index 3be12c9e9..69764dff7 100644
--- a/core/os/os2/process_windows.odin
+++ b/core/os/os2/process_windows.odin
@@ -418,11 +418,6 @@ _process_open :: proc(pid: int, flags: Process_Open_Flags) -> (process: Process,
}
@(private="package")
-_Process :: struct {
- null_handle: win32.HANDLE,
-}
-
-@(private="package")
_process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
TEMP_ALLOCATOR_GUARD()
command_line := _build_command_line(desc.command, temp_allocator())
@@ -438,8 +433,9 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
stdout_handle: win32.HANDLE
stdin_handle: win32.HANDLE
+ null_handle: win32.HANDLE
if desc.stdout == nil || desc.stderr == nil || desc.stdin == nil {
- process._impl.null_handle = win32.CreateFileW(
+ null_handle = win32.CreateFileW(
win32.L("NUL"),
win32.GENERIC_READ|win32.GENERIC_WRITE,
win32.FILE_SHARE_READ|win32.FILE_SHARE_WRITE,
@@ -451,23 +447,29 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
win32.FILE_ATTRIBUTE_NORMAL,
nil,
)
- assert(process._impl.null_handle != nil)
+ // Opening NUL should always succeed.
+ assert(null_handle != nil)
+ }
+ // NOTE(laytan): I believe it is fine to close this handle right after CreateProcess,
+ // and we don't have to hold onto this until the process exits.
+ defer if null_handle != nil {
+ win32.CloseHandle(null_handle)
}
if desc.stdout == nil {
- stdout_handle = process._impl.null_handle
+ stdout_handle = null_handle
} else {
stdout_handle = win32.HANDLE((^File_Impl)(desc.stdout.impl).fd)
}
if desc.stderr == nil {
- stderr_handle = process._impl.null_handle
+ stderr_handle = null_handle
} else {
stderr_handle = win32.HANDLE((^File_Impl)(desc.stderr.impl).fd)
}
if desc.stdin == nil {
- stdin_handle = process._impl.null_handle
+ stdin_handle = null_handle
} else {
stdin_handle = win32.HANDLE((^File_Impl)(desc.stdin.impl).fd)
}
@@ -507,10 +509,6 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat
switch win32.WaitForSingleObject(handle, timeout_ms) {
case win32.WAIT_OBJECT_0:
- if process._impl.null_handle != nil {
- win32.CloseHandle(process._impl.null_handle)
- }
-
exit_code: u32
if !win32.GetExitCodeProcess(handle, &exit_code) {
err =_get_platform_error()
@@ -537,10 +535,6 @@ _process_wait :: proc(process: Process, timeout: time.Duration) -> (process_stat
err = General_Error.Timeout
return
case:
- if process._impl.null_handle != nil {
- win32.CloseHandle(process._impl.null_handle)
- }
-
err = _get_platform_error()
return
}