package pcap import ( "sync" "time" ocdm "git.loafle.net/overflow/commons-go/discovery/model" ) var mtx sync.Mutex var instances map[string]PCapScanner func init() { instances = make(map[string]PCapScanner, 0) } func RetainScanner(zone *ocdm.Zone) (PCapScanner, error) { mtx.Lock() defer mtx.Unlock() var ps PCapScanner var ok bool if ps, ok = instances[zone.Network]; !ok { ps = newPCapScanner(zone) if err := ps.start(); nil != err { return nil, err } instances[zone.Network] = ps } ps.retain() return ps, nil } func ReleaseScanner(zone *ocdm.Zone) { go func() { time.Sleep(2 * time.Second) mtx.Lock() defer mtx.Unlock() if ps, ok := instances[zone.Network]; ok { if ps.release() { ps.stop() delete(instances, zone.Network) } } }() } func ReleaseScannerAll() { mtx.Lock() defer mtx.Unlock() for k, ps := range instances { ps.stop() delete(instances, k) } }