mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-14 14:11:23 -04:00
So the assignment of proxies is based on the load. The number of clients is ronded down to 8. Existing proxies that doesn't report the number of clients will be distributed equaly to new proxies until they get 8 clients, that is okish as the existing proxies do have a maximum capacity of 10. Fixes #40048
44 lines
605 B
Go
44 lines
605 B
Go
package main
|
|
|
|
import (
|
|
"sync/atomic"
|
|
)
|
|
|
|
type tokens_t struct {
|
|
ch chan struct{}
|
|
capacity uint
|
|
clients int64
|
|
}
|
|
|
|
func newTokens(capacity uint) *tokens_t {
|
|
var ch chan struct{}
|
|
if capacity != 0 {
|
|
ch = make(chan struct{}, capacity)
|
|
}
|
|
|
|
return &tokens_t{
|
|
ch: ch,
|
|
capacity: capacity,
|
|
clients: 0,
|
|
}
|
|
}
|
|
|
|
func (t *tokens_t) get() {
|
|
atomic.AddInt64(&t.clients, 1)
|
|
|
|
if t.capacity != 0 {
|
|
t.ch <- struct{}{}
|
|
}
|
|
}
|
|
|
|
func (t *tokens_t) ret() {
|
|
atomic.AddInt64(&t.clients, -1)
|
|
|
|
if t.capacity != 0 {
|
|
<-t.ch
|
|
}
|
|
}
|
|
|
|
func (t tokens_t) count() int64 {
|
|
return atomic.LoadInt64(&t.clients)
|
|
}
|