1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-12-22 01:57:12 -05:00

signal.semaphore

This commit is contained in:
Darien Raymond 2017-02-13 23:29:34 +01:00
parent 90200fbecb
commit 520e3ea9e6
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
2 changed files with 29 additions and 7 deletions

View File

@ -0,0 +1,23 @@
package signal
type Semaphore struct {
token chan bool
}
func NewSemaphore(n int) *Semaphore {
s := &Semaphore{
token: make(chan bool, n),
}
for i := 0; i < n; i++ {
s.token <- true
}
return s
}
func (s *Semaphore) Wait() <-chan bool {
return s.token
}
func (s *Semaphore) Signal() {
s.token <- true
}

View File

@ -4,6 +4,8 @@ import (
"net"
"sync"
"time"
"v2ray.com/core/common/signal"
)
// ConnectionRecyler is the interface for recycling connections.
@ -31,16 +33,15 @@ func (ec *ExpiringConnection) Expired() bool {
type Pool struct {
sync.Mutex
connsByDest map[ConnectionID][]*ExpiringConnection
cleanupToken chan bool
cleanupToken *signal.Semaphore
}
// NewConnectionPool creates a new Pool.
func NewConnectionPool() *Pool {
p := &Pool{
connsByDest: make(map[ConnectionID][]*ExpiringConnection),
cleanupToken: make(chan bool, 1),
cleanupToken: signal.NewSemaphore(1),
}
p.cleanupToken <- true
return p
}
@ -74,9 +75,7 @@ func (p *Pool) Get(id ConnectionID) net.Conn {
}
func (p *Pool) cleanup() {
defer func() {
p.cleanupToken <- true
}()
defer p.cleanupToken.Signal()
for len(p.connsByDest) > 0 {
time.Sleep(time.Second * 5)
@ -121,7 +120,7 @@ func (p *Pool) Put(id ConnectionID, conn net.Conn) {
p.connsByDest[id] = list
select {
case <-p.cleanupToken:
case <-p.cleanupToken.Wait():
go p.cleanup()
default:
}