40 lines
530 B
Go
40 lines
530 B
Go
|
|
package engine
|
||
|
|
|
||
|
|
import (
|
||
|
|
"log"
|
||
|
|
"os"
|
||
|
|
"os/signal"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Interrupter interface {
|
||
|
|
Running() bool
|
||
|
|
}
|
||
|
|
|
||
|
|
type interrupter struct {
|
||
|
|
running bool
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *interrupter) Running() bool {
|
||
|
|
return r.running
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewInterrupter() Interrupter {
|
||
|
|
sigint := make(chan os.Signal, 1)
|
||
|
|
signal.Notify(sigint, os.Interrupt)
|
||
|
|
r := &interrupter{running: true}
|
||
|
|
|
||
|
|
go func() {
|
||
|
|
for range sigint {
|
||
|
|
if !r.running {
|
||
|
|
log.Println("Kill")
|
||
|
|
os.Exit(1)
|
||
|
|
} else {
|
||
|
|
log.Println("Interrupt")
|
||
|
|
r.running = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}()
|
||
|
|
|
||
|
|
return r
|
||
|
|
}
|