mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
28 lines
522 B
28 lines
522 B
4 years ago
|
package semaphore
|
||
|
|
||
|
// Instance is an implementation of semaphore.
|
||
|
type Instance struct {
|
||
|
token chan struct{}
|
||
|
}
|
||
|
|
||
|
// New create a new Semaphore with n permits.
|
||
|
func New(n int) *Instance {
|
||
|
s := &Instance{
|
||
|
token: make(chan struct{}, n),
|
||
|
}
|
||
|
for i := 0; i < n; i++ {
|
||
|
s.token <- struct{}{}
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
// Wait returns a channel for acquiring a permit.
|
||
|
func (s *Instance) Wait() <-chan struct{} {
|
||
|
return s.token
|
||
|
}
|
||
|
|
||
|
// Signal releases a permit into the semaphore.
|
||
|
func (s *Instance) Signal() {
|
||
|
s.token <- struct{}{}
|
||
|
}
|