os: use atomic.Uintptr for Process.handle

Suggested-by: Michael Knyszek <mknyszek@google.com>
Change-Id: I116731b6c3738aae8ff1d3be227f8f51fa3320c7
Reviewed-on: https://go-review.googlesource.com/c/go/+/544795
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Kirill Kolyshkin <kolyshkin@gmail.com>
Reviewed-by: qiulaidongfeng <2645477756@qq.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Kir Kolyshkin 2023-11-23 11:43:56 -08:00 committed by Michael Pratt
parent b27d02c07b
commit 4cd743e27e
2 changed files with 6 additions and 6 deletions

View file

@ -20,13 +20,14 @@ var ErrProcessDone = errors.New("os: process already finished")
// Process stores the information about a process created by StartProcess.
type Process struct {
Pid int
handle uintptr // handle is accessed atomically on Windows
handle atomic.Uintptr
isdone atomic.Bool // process has been successfully waited on
sigMu sync.RWMutex // avoid race between wait and signal
}
func newProcess(pid int, handle uintptr) *Process {
p := &Process{Pid: pid, handle: handle}
p := &Process{Pid: pid}
p.handle.Store(handle)
runtime.SetFinalizer(p, (*Process).Release)
return p
}

View file

@ -8,13 +8,12 @@ import (
"errors"
"internal/syscall/windows"
"runtime"
"sync/atomic"
"syscall"
"time"
)
func (p *Process) wait() (ps *ProcessState, err error) {
handle := atomic.LoadUintptr(&p.handle)
handle := p.handle.Load()
s, e := syscall.WaitForSingleObject(syscall.Handle(handle), syscall.INFINITE)
switch s {
case syscall.WAIT_OBJECT_0:
@ -40,7 +39,7 @@ func (p *Process) wait() (ps *ProcessState, err error) {
}
func (p *Process) signal(sig Signal) error {
handle := atomic.LoadUintptr(&p.handle)
handle := p.handle.Load()
if handle == uintptr(syscall.InvalidHandle) {
return syscall.EINVAL
}
@ -63,7 +62,7 @@ func (p *Process) signal(sig Signal) error {
}
func (p *Process) release() error {
handle := atomic.SwapUintptr(&p.handle, uintptr(syscall.InvalidHandle))
handle := p.handle.Swap(uintptr(syscall.InvalidHandle))
if handle == uintptr(syscall.InvalidHandle) {
return syscall.EINVAL
}