5
5
"time"
6
6
7
7
"github.com/libp2p/go-libp2p-core/network"
8
+ "github.com/libp2p/go-libp2p-core/transport"
8
9
9
10
ma "github.com/multiformats/go-multiaddr"
10
11
)
@@ -35,6 +36,27 @@ func (s *Swarm) Listen(addrs ...ma.Multiaddr) error {
35
36
return nil
36
37
}
37
38
39
+ // ListenClose stop and delete listeners for all of the given addresses.
40
+ func (s * Swarm ) ListenClose (addrs ... ma.Multiaddr ) {
41
+ var listenersToClose []transport.Listener
42
+
43
+ s .listeners .Lock ()
44
+ for l := range s .listeners .m {
45
+ if ! containsMultiaddr (addrs , l .Multiaddr ()) {
46
+ continue
47
+ }
48
+
49
+ delete (s .listeners .m , l )
50
+ listenersToClose = append (listenersToClose , l )
51
+ }
52
+ s .listeners .cacheEOL = time.Time {}
53
+ s .listeners .Unlock ()
54
+
55
+ for _ , l := range listenersToClose {
56
+ l .Close ()
57
+ }
58
+ }
59
+
38
60
// AddListenAddr tells the swarm to listen on a single address. Unlike Listen,
39
61
// this method does not attempt to filter out bad addresses.
40
62
func (s * Swarm ) AddListenAddr (a ma.Multiaddr ) error {
@@ -78,12 +100,19 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
78
100
79
101
go func () {
80
102
defer func () {
81
- list .Close ()
82
103
s .listeners .Lock ()
83
- delete (s .listeners .m , list )
84
- s .listeners .cacheEOL = time.Time {}
104
+ _ , ok := s .listeners .m [list ]
105
+ if ok {
106
+ delete (s .listeners .m , list )
107
+ s .listeners .cacheEOL = time.Time {}
108
+ }
85
109
s .listeners .Unlock ()
86
110
111
+ if ok {
112
+ list .Close ()
113
+ log .Errorf ("swarm listener unintentionally closed" )
114
+ }
115
+
87
116
// signal to our notifiees on listen close.
88
117
s .notifyAll (func (n network.Notifiee ) {
89
118
n .ListenClose (s , maddr )
@@ -93,10 +122,6 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
93
122
for {
94
123
c , err := list .Accept ()
95
124
if err != nil {
96
- if s .ctx .Err () == nil {
97
- // only log if the swarm is still running.
98
- log .Errorf ("swarm listener accept error: %s" , err )
99
- }
100
125
return
101
126
}
102
127
@@ -119,3 +144,12 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
119
144
}()
120
145
return nil
121
146
}
147
+
148
+ func containsMultiaddr (addrs []ma.Multiaddr , addr ma.Multiaddr ) bool {
149
+ for _ , a := range addrs {
150
+ if addr == a {
151
+ return true
152
+ }
153
+ }
154
+ return false
155
+ }
0 commit comments