diff options
| author | laytan <laytanlaats@hotmail.com> | 2025-05-06 19:42:52 +0200 |
|---|---|---|
| committer | laytan <laytanlaats@hotmail.com> | 2025-05-06 19:42:52 +0200 |
| commit | 9b218a29225cdc1fbe080f2eb900383ca494b1f9 (patch) | |
| tree | 762512c7a1ea48b029ea36f008f798fa8c7d4221 | |
| parent | bf5206968a0c46cf9472eb8fa84b6d69be5ecad0 (diff) | |
don't need to hang on to the null handle
| -rw-r--r-- | core/os/os2/process.odin | 2 | ||||
| -rw-r--r-- | core/os/os2/process_linux.odin | 3 | ||||
| -rw-r--r-- | core/os/os2/process_posix.odin | 2 | ||||
| -rw-r--r-- | core/os/os2/process_wasi.odin | 2 | ||||
| -rw-r--r-- | core/os/os2/process_windows.odin | 30 |
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 } |