| // Copyright 2018 syzkaller project authors. All rights reserved. |
| // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "sync" |
| "sync/atomic" |
| ) |
| |
| type Stat uint64 |
| |
| type Stats struct { |
| crashes Stat |
| crashTypes Stat |
| crashSuppressed Stat |
| vmRestarts Stat |
| newInputs Stat |
| execTotal Stat |
| hubSendProgAdd Stat |
| hubSendProgDel Stat |
| hubSendRepro Stat |
| hubRecvProg Stat |
| hubRecvProgDrop Stat |
| hubRecvRepro Stat |
| hubRecvReproDrop Stat |
| corpusCover Stat |
| corpusSignal Stat |
| |
| mu sync.Mutex |
| namedStats map[string]uint64 |
| } |
| |
| func (stats *Stats) all() map[string]uint64 { |
| m := map[string]uint64{ |
| "crashes": stats.crashes.get(), |
| "crash types": stats.crashTypes.get(), |
| "suppressed": stats.crashSuppressed.get(), |
| "vm restarts": stats.vmRestarts.get(), |
| "manager new inputs": stats.newInputs.get(), |
| "exec total": stats.execTotal.get(), |
| "hub: send prog add": stats.hubSendProgAdd.get(), |
| "hub: send prog del": stats.hubSendProgDel.get(), |
| "hub: send repro": stats.hubSendRepro.get(), |
| "hub: recv prog": stats.hubRecvProg.get(), |
| "hub: recv prog drop": stats.hubRecvProgDrop.get(), |
| "hub: recv repro": stats.hubRecvRepro.get(), |
| "hub: recv repro drop": stats.hubRecvReproDrop.get(), |
| "cover": stats.corpusCover.get(), |
| "signal": stats.corpusSignal.get(), |
| } |
| stats.mu.Lock() |
| defer stats.mu.Unlock() |
| for k, v := range stats.namedStats { |
| m[k] = v |
| } |
| return m |
| } |
| |
| func (stats *Stats) mergeNamed(named map[string]uint64) { |
| stats.mu.Lock() |
| defer stats.mu.Unlock() |
| if stats.namedStats == nil { |
| stats.namedStats = make(map[string]uint64) |
| } |
| for k, v := range named { |
| switch k { |
| case "exec total": |
| stats.execTotal.add(int(v)) |
| default: |
| stats.namedStats[k] += v |
| } |
| } |
| } |
| |
| func (s *Stat) get() uint64 { |
| return atomic.LoadUint64((*uint64)(s)) |
| } |
| |
| func (s *Stat) inc() { |
| s.add(1) |
| } |
| |
| func (s *Stat) add(v int) { |
| atomic.AddUint64((*uint64)(s), uint64(v)) |
| } |
| |
| func (s *Stat) set(v int) { |
| atomic.StoreUint64((*uint64)(s), uint64(v)) |
| } |