mirror of
https://github.com/golang/go
synced 2024-11-17 01:04:50 -07:00
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:
parent
b27d02c07b
commit
4cd743e27e
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user