mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-14 05:11:19 -04:00
Allow other go programs to easily import the snowflake proxy library and start/stop a snowflake proxy.
44 lines
610 B
Go
44 lines
610 B
Go
package snowflake
|
|
|
|
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)
|
|
}
|