diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-02-16 17:04:38 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2016-02-18 21:41:50 +0100 |
| commit | 8e0d5c2bd01651bfa775f3cf3df9823e8a8faa31 (patch) | |
| tree | f85b2b3d7ee058dedcc719c824798ed82e6a5fc0 | |
| parent | 96949534aed13633c1ad9f015a6c7055cb30649c (diff) | |
manager: properly cleanup on ctrl+C
Don't leave temporal files behind.
| -rw-r--r-- | syz-manager/manager.go | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 075b3127a..e87f6c72f 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -14,9 +14,12 @@ import ( "net/rpc" "net/rpc/jsonrpc" "os" + "os/signal" "path/filepath" "regexp" "sync" + "sync/atomic" + "syscall" "time" "github.com/google/syzkaller/config" @@ -156,21 +159,43 @@ func RunManager(cfg *config.Config, syscalls map[int]bool, suppressions []*regex } }() + var shutdown uint32 + var wg sync.WaitGroup + wg.Add(cfg.Count) for i := 0; i < cfg.Count; i++ { first := i == 0 go func() { + defer wg.Done() for { vmCfg, err := config.CreateVMConfig(cfg) + if atomic.LoadUint32(&shutdown) != 0 { + break + } if err != nil { fatalf("failed to create VM config: %v", err) } - if !mgr.runInstance(vmCfg, first) { + ok := mgr.runInstance(vmCfg, first) + if atomic.LoadUint32(&shutdown) != 0 { + break + } + if !ok { time.Sleep(10 * time.Second) } } }() } - select {} + + go func() { + c := make(chan os.Signal, 2) + signal.Notify(c, syscall.SIGINT) + <-c + *flagV = -1 // VMs will fail + logf(-1, "shutting down...") + atomic.StoreUint32(&shutdown, 1) + <-c + log.Fatalf("terminating") + }() + wg.Wait() } func (mgr *Manager) runInstance(vmCfg *vm.Config, first bool) bool { |
