| 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
 
- }
 
 
  |