Removed debugging locks
This commit is contained in:
parent
a0f54cbe5a
commit
9c5083bd19
90
device.go
90
device.go
|
@ -1,7 +1,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/sasha-s/go-deadlock"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -16,31 +15,31 @@ type Device struct {
|
||||||
// synchronized resources (locks acquired in order)
|
// synchronized resources (locks acquired in order)
|
||||||
|
|
||||||
state struct {
|
state struct {
|
||||||
mutex deadlock.Mutex
|
mutex sync.Mutex
|
||||||
changing AtomicBool
|
changing AtomicBool
|
||||||
current bool
|
current bool
|
||||||
}
|
}
|
||||||
|
|
||||||
net struct {
|
net struct {
|
||||||
mutex deadlock.RWMutex
|
mutex sync.RWMutex
|
||||||
bind Bind // bind interface
|
bind Bind // bind interface
|
||||||
port uint16 // listening port
|
port uint16 // listening port
|
||||||
fwmark uint32 // mark value (0 = disabled)
|
fwmark uint32 // mark value (0 = disabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
noise struct {
|
noise struct {
|
||||||
mutex deadlock.RWMutex
|
mutex sync.RWMutex
|
||||||
privateKey NoisePrivateKey
|
privateKey NoisePrivateKey
|
||||||
publicKey NoisePublicKey
|
publicKey NoisePublicKey
|
||||||
}
|
}
|
||||||
|
|
||||||
routing struct {
|
routing struct {
|
||||||
mutex deadlock.RWMutex
|
mutex sync.RWMutex
|
||||||
table RoutingTable
|
table RoutingTable
|
||||||
}
|
}
|
||||||
|
|
||||||
peers struct {
|
peers struct {
|
||||||
mutex deadlock.RWMutex
|
mutex sync.RWMutex
|
||||||
keyMap map[NoisePublicKey]*Peer
|
keyMap map[NoisePublicKey]*Peer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,53 +100,46 @@ func deviceUpdateState(device *Device) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func() {
|
// compare to current state of device
|
||||||
|
|
||||||
// compare to current state of device
|
device.state.mutex.Lock()
|
||||||
|
|
||||||
device.state.mutex.Lock()
|
newIsUp := device.isUp.Get()
|
||||||
defer device.state.mutex.Unlock()
|
|
||||||
|
|
||||||
newIsUp := device.isUp.Get()
|
if newIsUp == device.state.current {
|
||||||
|
|
||||||
if newIsUp == device.state.current {
|
|
||||||
device.state.changing.Set(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// change state of device
|
|
||||||
|
|
||||||
switch newIsUp {
|
|
||||||
case true:
|
|
||||||
if err := device.BindUpdate(); err != nil {
|
|
||||||
device.isUp.Set(false)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
device.peers.mutex.Lock()
|
|
||||||
defer device.peers.mutex.Unlock()
|
|
||||||
|
|
||||||
for _, peer := range device.peers.keyMap {
|
|
||||||
peer.Start()
|
|
||||||
}
|
|
||||||
|
|
||||||
case false:
|
|
||||||
device.BindClose()
|
|
||||||
|
|
||||||
device.peers.mutex.Lock()
|
|
||||||
defer device.peers.mutex.Unlock()
|
|
||||||
|
|
||||||
for _, peer := range device.peers.keyMap {
|
|
||||||
println("stopping peer")
|
|
||||||
peer.Stop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// update state variables
|
|
||||||
|
|
||||||
device.state.current = newIsUp
|
|
||||||
device.state.changing.Set(false)
|
device.state.changing.Set(false)
|
||||||
}()
|
device.state.mutex.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// change state of device
|
||||||
|
|
||||||
|
switch newIsUp {
|
||||||
|
case true:
|
||||||
|
if err := device.BindUpdate(); err != nil {
|
||||||
|
device.isUp.Set(false)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
device.peers.mutex.Lock()
|
||||||
|
for _, peer := range device.peers.keyMap {
|
||||||
|
peer.Start()
|
||||||
|
}
|
||||||
|
device.peers.mutex.Unlock()
|
||||||
|
|
||||||
|
case false:
|
||||||
|
device.BindClose()
|
||||||
|
device.peers.mutex.Lock()
|
||||||
|
for _, peer := range device.peers.keyMap {
|
||||||
|
peer.Stop()
|
||||||
|
}
|
||||||
|
device.peers.mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// update state variables
|
||||||
|
|
||||||
|
device.state.current = newIsUp
|
||||||
|
device.state.changing.Set(false)
|
||||||
|
device.state.mutex.Unlock()
|
||||||
|
|
||||||
// check for state change in the mean time
|
// check for state change in the mean time
|
||||||
|
|
||||||
|
|
7
peer.go
7
peer.go
|
@ -4,7 +4,6 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/sasha-s/go-deadlock"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -15,7 +14,7 @@ const (
|
||||||
|
|
||||||
type Peer struct {
|
type Peer struct {
|
||||||
isRunning AtomicBool
|
isRunning AtomicBool
|
||||||
mutex deadlock.RWMutex
|
mutex sync.RWMutex
|
||||||
persistentKeepaliveInterval uint64
|
persistentKeepaliveInterval uint64
|
||||||
keyPairs KeyPairs
|
keyPairs KeyPairs
|
||||||
handshake Handshake
|
handshake Handshake
|
||||||
|
@ -29,7 +28,7 @@ type Peer struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
time struct {
|
time struct {
|
||||||
mutex deadlock.RWMutex
|
mutex sync.RWMutex
|
||||||
lastSend time.Time // last send message
|
lastSend time.Time // last send message
|
||||||
lastHandshake time.Time // last completed handshake
|
lastHandshake time.Time // last completed handshake
|
||||||
nextKeepalive time.Time
|
nextKeepalive time.Time
|
||||||
|
@ -66,7 +65,7 @@ type Peer struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
routines struct {
|
routines struct {
|
||||||
mutex deadlock.Mutex // held when stopping / starting routines
|
mutex sync.Mutex // held when stopping / starting routines
|
||||||
starting sync.WaitGroup // routines pending start
|
starting sync.WaitGroup // routines pending start
|
||||||
stopping sync.WaitGroup // routines pending stop
|
stopping sync.WaitGroup // routines pending stop
|
||||||
stop Signal // size 0, stop all go-routines in peer
|
stop Signal // size 0, stop all go-routines in peer
|
||||||
|
|
Loading…
Reference in a new issue