p2p: use safe atomic operations when changing connFlags (#17325)

This commit is contained in:
Felföldi Zsolt 2018-08-06 14:46:30 +02:00 committed by Péter Szilágyi
parent c4df67461f
commit eef65b20fc

View File

@ -258,13 +258,18 @@ func (c *conn) is(f connFlag) bool {
} }
func (c *conn) set(f connFlag, val bool) { func (c *conn) set(f connFlag, val bool) {
flags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) for {
oldFlags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))
flags := oldFlags
if val { if val {
flags |= f flags |= f
} else { } else {
flags &= ^f flags &= ^f
} }
atomic.StoreInt32((*int32)(&c.flags), int32(flags)) if atomic.CompareAndSwapInt32((*int32)(&c.flags), int32(oldFlags), int32(flags)) {
return
}
}
} }
// Peers returns all connected peers. // Peers returns all connected peers.