package pcap import ( "log" "sync" "time" omd "git.loafle.net/overflow/model/discovery" ) var instances sync.Map // var instances map[string]PCapScanner func init() { // instances = make(map[string]PCapScanner, 0) } func RetainScanner(zone *omd.Zone) (PCapScanner, error) { var ps PCapScanner // if ps, ok = instances[zone.Network]; !ok { _ps, ok := instances.Load(zone.Network) if !ok { ps = NewPCapScanner(zone) if err := ps.Start(); nil != err { return nil, err } instances.Store(zone.Network, ps) } else { ps = _ps.(PCapScanner) } ps.retain() log.Print("Pcap retain") return ps, nil } func ReleaseScanner(zone *omd.Zone) { go func() { time.Sleep(1 * time.Second) if _ps, ok := instances.Load(zone.Network); ok { ps := _ps.(PCapScanner) log.Print("Pcap release") if ps.release() { ps.Stop() instances.Delete(zone.Network) } } }() } func ReleaseScannerAll() { instances.Range(func(k, v interface{}) bool { ps := v.(PCapScanner) if ps.release() { ps.Stop() instances.Delete(k) return false } return true }) }