]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/cmd/govpn-server/tcp.go
Use convenient simpler Go 1.9's sync.Map
[govpn.git] / src / cypherpunks.ru / govpn / cmd / govpn-server / tcp.go
index 61eb1e07395fcc8b10ddf690d43b706b0f28300b..aab59b723c57986d5520e64e6251f45c5f3e812e 100644 (file)
@@ -60,6 +60,9 @@ func handleTCP(conn net.Conn) {
        var peer *govpn.Peer
        var tap *govpn.TAP
        var conf *govpn.PeerConf
+       var addrPrev string
+       var peerPrevI interface{}
+       var peerPrev *PeerState
        for {
                if prev == len(buf) {
                        break
@@ -96,16 +99,13 @@ func handleTCP(conn net.Conn) {
                        `[handshake-completed bind="%s" addr="%s" peer="%s"]`,
                        *bindAddr, addr, peerID.String(),
                )
-               peersByIDLock.RLock()
-               addrPrev, exists := peersByID[*peer.ID]
-               peersByIDLock.RUnlock()
-               var peerPrev *PeerState
+               addrPrevI, exists := peersByID.Load(*peer.ID)
                if exists {
-                       peersLock.Lock()
-                       peerPrev = peers[addrPrev]
-                       if peerPrev == nil {
-                               exists = false
-                               peersLock.Unlock()
+                       addrPrev = addrPrevI.(string)
+                       peerPrevI, exists = peers.Load(addrPrev)
+                       if exists {
+                               peerPrev = peerPrevI.(*PeerState)
+                               exists = peerPrev == nil
                        }
                }
                if exists {
@@ -117,16 +117,11 @@ func handleTCP(conn net.Conn) {
                                terminator: make(chan struct{}),
                        }
                        go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator)
-                       peersByIDLock.Lock()
-                       kpLock.Lock()
-                       delete(peers, addrPrev)
-                       delete(knownPeers, addrPrev)
-                       peers[addr] = ps
-                       knownPeers[addr] = &peer
-                       peersByID[*peer.ID] = addr
-                       peersLock.Unlock()
-                       peersByIDLock.Unlock()
-                       kpLock.Unlock()
+                       peers.Delete(addrPrev)
+                       peers.Store(addr, ps)
+                       knownPeers.Delete(addrPrev)
+                       knownPeers.Store(addr, &peer)
+                       peersByID.Store(*peer.ID, addr)
                        govpn.Printf(
                                `[rehandshake-completed bind="%s" peer="%s"]`,
                                *bindAddr, peerID.String(),
@@ -152,15 +147,9 @@ func handleTCP(conn net.Conn) {
                                terminator: make(chan struct{}, 1),
                        }
                        go govpn.PeerTapProcessor(ps.peer, ps.tap, ps.terminator)
-                       peersLock.Lock()
-                       peersByIDLock.Lock()
-                       kpLock.Lock()
-                       peers[addr] = ps
-                       peersByID[*peer.ID] = addr
-                       knownPeers[addr] = &peer
-                       peersLock.Unlock()
-                       peersByIDLock.Unlock()
-                       kpLock.Unlock()
+                       peers.Store(addr, ps)
+                       peersByID.Store(*peer.ID, addr)
+                       knownPeers.Store(addr, &peer)
                        govpn.Printf(`[peer-created bind="%s" peer="%s"]`, *bindAddr, peerID.String())
                }
                break