aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-02-16 17:04:38 +0100
committerDmitry Vyukov <dvyukov@google.com>2016-02-18 21:41:50 +0100
commit8e0d5c2bd01651bfa775f3cf3df9823e8a8faa31 (patch)
treef85b2b3d7ee058dedcc719c824798ed82e6a5fc0
parent96949534aed13633c1ad9f015a6c7055cb30649c (diff)
manager: properly cleanup on ctrl+C
Don't leave temporal files behind.
-rw-r--r--syz-manager/manager.go29
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 {