]> Cypherpunks repositories - gostls13.git/commitdiff
os: relax the way we kill processes on Plan 9
authorAnthony Martin <ality@pbrane.org>
Thu, 13 Mar 2014 01:12:56 +0000 (18:12 -0700)
committerAnthony Martin <ality@pbrane.org>
Thu, 13 Mar 2014 01:12:56 +0000 (18:12 -0700)
Previously, we wrote "kill" to the process control file
to kill a program. This is problematic because it doesn't
let the program gracefully exit.

This matters especially if the process we're killing is a
Go program. On Unix, sending SIGKILL to a Go program will
automatically kill all runtime threads. On Plan 9, there
are no threads so when the program wants to exit it has to
somehow signal all of the runtime processes. It can't do
this if we mercilessly kill it by writing to it's control
file.

Instead, we now send it a note to invoke it's note handler
and let it perform any cleanup before exiting.

LGTM=rsc
R=rsc, 0intro
CC=golang-codereviews
https://golang.org/cl/74440044

src/pkg/os/exec_plan9.go

index 2bd5b6888d98b07a0ec2acef6336e9c9ab638fa8..676be36ac775e10b269d6164a1dbe87fde26f701 100644 (file)
@@ -52,10 +52,6 @@ func (p *Process) signal(sig Signal) error {
        if p.done() {
                return errors.New("os: process already finished")
        }
-       if sig == Kill {
-               // Special-case the kill signal since it doesn't use /proc/$pid/note.
-               return p.Kill()
-       }
        if e := p.writeProcFile("note", sig.String()); e != nil {
                return NewSyscallError("signal", e)
        }
@@ -63,10 +59,7 @@ func (p *Process) signal(sig Signal) error {
 }
 
 func (p *Process) kill() error {
-       if e := p.writeProcFile("ctl", "kill"); e != nil {
-               return NewSyscallError("kill", e)
-       }
-       return nil
+       return p.signal(Kill)
 }
 
 func (p *Process) wait() (ps *ProcessState, err error) {