|
@@ -88,6 +88,8 @@ type Whisper struct {
|
|
|
stats Statistics // Statistics of whisper node
|
|
stats Statistics // Statistics of whisper node
|
|
|
|
|
|
|
|
mailServer MailServer // MailServer interface
|
|
mailServer MailServer // MailServer interface
|
|
|
|
|
+
|
|
|
|
|
+ wg sync.WaitGroup
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// New creates a Whisper client ready to communicate through the Ethereum P2P network.
|
|
// New creates a Whisper client ready to communicate through the Ethereum P2P network.
|
|
@@ -243,8 +245,10 @@ func (whisper *Whisper) SetBloomFilter(bloom []byte) error {
|
|
|
whisper.settings.Store(bloomFilterIdx, b)
|
|
whisper.settings.Store(bloomFilterIdx, b)
|
|
|
whisper.notifyPeersAboutBloomFilterChange(b)
|
|
whisper.notifyPeersAboutBloomFilterChange(b)
|
|
|
|
|
|
|
|
|
|
+ whisper.wg.Add(1)
|
|
|
go func() {
|
|
go func() {
|
|
|
// allow some time before all the peers have processed the notification
|
|
// allow some time before all the peers have processed the notification
|
|
|
|
|
+ defer whisper.wg.Done()
|
|
|
time.Sleep(time.Duration(whisper.syncAllowance) * time.Second)
|
|
time.Sleep(time.Duration(whisper.syncAllowance) * time.Second)
|
|
|
whisper.settings.Store(bloomFilterToleranceIdx, b)
|
|
whisper.settings.Store(bloomFilterToleranceIdx, b)
|
|
|
}()
|
|
}()
|
|
@@ -261,7 +265,9 @@ func (whisper *Whisper) SetMinimumPoW(val float64) error {
|
|
|
whisper.settings.Store(minPowIdx, val)
|
|
whisper.settings.Store(minPowIdx, val)
|
|
|
whisper.notifyPeersAboutPowRequirementChange(val)
|
|
whisper.notifyPeersAboutPowRequirementChange(val)
|
|
|
|
|
|
|
|
|
|
+ whisper.wg.Add(1)
|
|
|
go func() {
|
|
go func() {
|
|
|
|
|
+ defer whisper.wg.Done()
|
|
|
// allow some time before all the peers have processed the notification
|
|
// allow some time before all the peers have processed the notification
|
|
|
time.Sleep(time.Duration(whisper.syncAllowance) * time.Second)
|
|
time.Sleep(time.Duration(whisper.syncAllowance) * time.Second)
|
|
|
whisper.settings.Store(minPowToleranceIdx, val)
|
|
whisper.settings.Store(minPowToleranceIdx, val)
|
|
@@ -626,10 +632,12 @@ func (whisper *Whisper) Send(envelope *Envelope) error {
|
|
|
// of the Whisper protocol.
|
|
// of the Whisper protocol.
|
|
|
func (whisper *Whisper) Start(*p2p.Server) error {
|
|
func (whisper *Whisper) Start(*p2p.Server) error {
|
|
|
log.Info("started whisper v." + ProtocolVersionStr)
|
|
log.Info("started whisper v." + ProtocolVersionStr)
|
|
|
|
|
+ whisper.wg.Add(1)
|
|
|
go whisper.update()
|
|
go whisper.update()
|
|
|
|
|
|
|
|
numCPU := runtime.NumCPU()
|
|
numCPU := runtime.NumCPU()
|
|
|
for i := 0; i < numCPU; i++ {
|
|
for i := 0; i < numCPU; i++ {
|
|
|
|
|
+ whisper.wg.Add(1)
|
|
|
go whisper.processQueue()
|
|
go whisper.processQueue()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -640,6 +648,7 @@ func (whisper *Whisper) Start(*p2p.Server) error {
|
|
|
// of the Whisper protocol.
|
|
// of the Whisper protocol.
|
|
|
func (whisper *Whisper) Stop() error {
|
|
func (whisper *Whisper) Stop() error {
|
|
|
close(whisper.quit)
|
|
close(whisper.quit)
|
|
|
|
|
+ whisper.wg.Wait()
|
|
|
log.Info("whisper stopped")
|
|
log.Info("whisper stopped")
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
@@ -874,6 +883,7 @@ func (whisper *Whisper) checkOverflow() {
|
|
|
|
|
|
|
|
// processQueue delivers the messages to the watchers during the lifetime of the whisper node.
|
|
// processQueue delivers the messages to the watchers during the lifetime of the whisper node.
|
|
|
func (whisper *Whisper) processQueue() {
|
|
func (whisper *Whisper) processQueue() {
|
|
|
|
|
+ defer whisper.wg.Done()
|
|
|
var e *Envelope
|
|
var e *Envelope
|
|
|
for {
|
|
for {
|
|
|
select {
|
|
select {
|
|
@@ -892,6 +902,7 @@ func (whisper *Whisper) processQueue() {
|
|
|
// update loops until the lifetime of the whisper node, updating its internal
|
|
// update loops until the lifetime of the whisper node, updating its internal
|
|
|
// state by expiring stale messages from the pool.
|
|
// state by expiring stale messages from the pool.
|
|
|
func (whisper *Whisper) update() {
|
|
func (whisper *Whisper) update() {
|
|
|
|
|
+ defer whisper.wg.Done()
|
|
|
// Start a ticker to check for expirations
|
|
// Start a ticker to check for expirations
|
|
|
expire := time.NewTicker(expirationCycle)
|
|
expire := time.NewTicker(expirationCycle)
|
|
|
|
|
|