Ditching mutexes for a waitgroup
Martin Baillie
6 years ago
14 | 14 | client Client |
15 | 15 | instance *fargo.Instance |
16 | 16 | logger log.Logger |
17 | quit chan bool | |
18 | quitmtx sync.Mutex | |
17 | quit chan struct{} | |
18 | wg sync.WaitGroup | |
19 | 19 | } |
20 | 20 | |
21 | 21 | // NewRegistrar returns an Eureka Registrar acting on behalf of the provided |
38 | 38 | |
39 | 39 | if r.instance.LeaseInfo.RenewalIntervalInSecs > 0 { |
40 | 40 | // User has opted for heartbeat functionality in Eureka. |
41 | r.quitmtx.Lock() | |
42 | defer r.quitmtx.Unlock() | |
43 | 41 | if r.quit == nil { |
44 | r.quit = make(chan bool) | |
42 | r.quit = make(chan struct{}) | |
43 | r.wg.Add(1) | |
45 | 44 | go r.loop() |
46 | 45 | } |
47 | 46 | } |
55 | 54 | r.logger.Log("action", "deregister") |
56 | 55 | } |
57 | 56 | |
58 | r.quitmtx.Lock() | |
59 | defer r.quitmtx.Unlock() | |
60 | 57 | if r.quit != nil { |
61 | r.quit <- true | |
58 | close(r.quit) | |
59 | r.wg.Wait() | |
62 | 60 | r.quit = nil |
63 | 61 | } |
64 | 62 | } |
66 | 64 | func (r *Registrar) loop() { |
67 | 65 | tick := time.NewTicker(time.Duration(r.instance.LeaseInfo.RenewalIntervalInSecs) * time.Second) |
68 | 66 | defer tick.Stop() |
67 | defer r.wg.Done() | |
68 | ||
69 | 69 | for { |
70 | 70 | select { |
71 | 71 | case <-tick.C: |