| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- // Copyright (C) 2015 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package nat
- import (
- "sync"
- "time"
- )
- type DiscoverFunc func(renewal, timeout time.Duration) []Device
- var providers []DiscoverFunc
- func Register(provider DiscoverFunc) {
- providers = append(providers, provider)
- }
- func discoverAll(renewal, timeout time.Duration) map[string]Device {
- wg := &sync.WaitGroup{}
- wg.Add(len(providers))
- c := make(chan Device)
- done := make(chan struct{})
- for _, discoverFunc := range providers {
- go func(f DiscoverFunc) {
- for _, dev := range f(renewal, timeout) {
- c <- dev
- }
- wg.Done()
- }(discoverFunc)
- }
- nats := make(map[string]Device)
- go func() {
- for dev := range c {
- nats[dev.ID()] = dev
- }
- close(done)
- }()
- wg.Wait()
- close(c)
- <-done
- return nats
- }
|