github.com/mysteriumnetwork/node@v0.0.0-20240516044423-365054f76801/session/pingpong/consumer_balance_syncer.go (about) 1 /* 2 * Copyright (C) 2021 The "MysteriumNetwork/node" Authors. 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 package pingpong 19 20 import ( 21 "sync" 22 "time" 23 ) 24 25 type balanceSyncer struct { 26 jobs map[string]*job 27 lock sync.Mutex 28 } 29 30 func newBalanceSyncer() *balanceSyncer { 31 return &balanceSyncer{ 32 jobs: make(map[string]*job), 33 } 34 } 35 36 // PeriodiclySyncBalance takes in the given job key, check if the job is already running. If so, it restarts the job to extend its lifetime. Otherwise it creates a new job and starts it. 37 func (bs *balanceSyncer) PeriodiclySyncBalance(jobKey string, toRun func(stop <-chan struct{}), timeout time.Duration) (*job, bool) { 38 bs.lock.Lock() 39 defer bs.lock.Unlock() 40 41 if v, ok := bs.jobs[jobKey]; ok { 42 v = v.Restart() 43 bs.jobs[jobKey] = v 44 return v, true 45 } 46 47 j := newJob(toRun, timeout).Start() 48 bs.jobs[jobKey] = j 49 return j, false 50 }