]> Sergey Matveev's repositories - btrtrc.git/blob - dial-pool.go
Drop support for go 1.20
[btrtrc.git] / dial-pool.go
1 package torrent
2
3 import (
4         "context"
5 )
6
7 type dialPool struct {
8         resCh chan DialResult
9         addr  string
10         left  int
11 }
12
13 func (me *dialPool) getFirst() (res DialResult) {
14         for me.left > 0 && res.Conn == nil {
15                 res = <-me.resCh
16                 me.left--
17         }
18         return
19 }
20
21 func (me *dialPool) add(ctx context.Context, dialer Dialer) {
22         me.left++
23         go func() {
24                 me.resCh <- DialResult{
25                         dialFromSocket(ctx, dialer, me.addr),
26                         dialer,
27                 }
28         }()
29 }
30
31 func (me *dialPool) startDrainer() {
32         go me.drainAndCloseRemainingDials()
33 }
34
35 func (me *dialPool) drainAndCloseRemainingDials() {
36         for me.left > 0 {
37                 conn := (<-me.resCh).Conn
38                 me.left--
39                 if conn != nil {
40                         conn.Close()
41                 }
42         }
43 }