| // +build windows |
| |
| package windows |
| |
| import ( |
| "fmt" |
| "syscall" |
| |
| "github.com/Sirupsen/logrus" |
| "github.com/docker/docker/daemon/execdriver" |
| "github.com/microsoft/hcsshim" |
| ) |
| |
| // Terminate implements the exec driver Driver interface. |
| func (d *Driver) Terminate(p *execdriver.Command) error { |
| return kill(p.ID, p.ContainerPid, syscall.SIGTERM) |
| } |
| |
| // Kill implements the exec driver Driver interface. |
| func (d *Driver) Kill(p *execdriver.Command, sig int) error { |
| return kill(p.ID, p.ContainerPid, syscall.Signal(sig)) |
| } |
| |
| func kill(id string, pid int, sig syscall.Signal) error { |
| logrus.Debugf("WindowsExec: kill() id=%s pid=%d sig=%d", id, pid, sig) |
| var err error |
| context := fmt.Sprintf("kill: sig=%d pid=%d", sig, pid) |
| |
| if sig == syscall.SIGKILL || forceKill { |
| // Terminate the compute system |
| if errno, err := hcsshim.TerminateComputeSystem(id, hcsshim.TimeoutInfinite, context); err != nil { |
| logrus.Errorf("Failed to terminate %s - 0x%X %q", id, errno, err) |
| } |
| |
| } else { |
| // Terminate Process |
| if err = hcsshim.TerminateProcessInComputeSystem(id, uint32(pid)); err != nil { |
| logrus.Warnf("Failed to terminate pid %d in %s: %q", pid, id, err) |
| // Ignore errors |
| err = nil |
| } |
| |
| // Shutdown the compute system |
| if errno, err := hcsshim.ShutdownComputeSystem(id, hcsshim.TimeoutInfinite, context); err != nil { |
| logrus.Errorf("Failed to shutdown %s - 0x%X %q", id, errno, err) |
| } |
| } |
| return err |
| } |