Register listeners for MainData / MinerData updates

This commit is contained in:
DataHoarder 2023-05-24 12:40:02 +02:00
parent 52b2d617c0
commit a2b701e87b
Signed by: DataHoarder
SSH key fingerprint: SHA256:OLTRf6Fl87G52SiR7sWLGNzlJt4WOX+tfI2yxo0z7xk
2 changed files with 34 additions and 2 deletions

View file

@ -43,6 +43,8 @@ type P2PoolInterface interface {
ClientZMQ() *zmq.Client
Context() context.Context
Started() bool
UpdateMainData(data *sidechain.ChainMain)
UpdateMinerData(data *p2pooltypes.MinerData)
UpdateBlockFound(data *sidechain.ChainMain, block *sidechain.PoolBlock)
}
@ -289,6 +291,8 @@ func (c *MainChain) HandleChainMain(mainData *sidechain.ChainMain, extra []byte)
c.updateMedianTimestamp()
}()
c.p2pool.UpdateMainData(mainData)
var tags transaction.ExtraTags
if err := tags.UnmarshalBinary(extra); err != nil {
return
@ -478,6 +482,8 @@ func (c *MainChain) HandleMinerData(minerData *p2pooltypes.MinerData) {
}
}()
c.p2pool.UpdateMinerData(minerData)
var wg sync.WaitGroup
for _, h := range missingHeights {
wg.Add(1)

View file

@ -32,6 +32,8 @@ type EventListener struct {
Tip func(tip *sidechain.PoolBlock)
Broadcast func(b *sidechain.PoolBlock)
Found func(data *sidechain.ChainMain, b *sidechain.PoolBlock)
MainData func(data *sidechain.ChainMain)
MinerData func(data *p2pooltypes.MinerData)
}
type P2Pool struct {
@ -59,17 +61,21 @@ type P2Pool struct {
closed chan struct{}
}
func (p *P2Pool) AddListener(tip func(tip *sidechain.PoolBlock), broadcast func(b *sidechain.PoolBlock), found func(data *sidechain.ChainMain, b *sidechain.PoolBlock)) uint64 {
// AddListener Registers listener to several events produced centrally.
// Note that you should process events called as fast as possible, or spawn a new goroutine to not block
func (p *P2Pool) AddListener(tip func(tip *sidechain.PoolBlock), broadcast func(b *sidechain.PoolBlock), found func(data *sidechain.ChainMain, b *sidechain.PoolBlock), mainData func(data *sidechain.ChainMain), minerData func(data *p2pooltypes.MinerData)) (listenerId uint64) {
p.listenersLock.Lock()
p.listenersLock.Unlock()
listenerId := p.nextListenerId
listenerId = p.nextListenerId
p.nextListenerId++
p.listeners = append(p.listeners, EventListener{
ListenerId: listenerId,
Tip: tip,
Broadcast: broadcast,
Found: found,
MainData: mainData,
MinerData: minerData,
})
return listenerId
}
@ -485,6 +491,26 @@ func (p *P2Pool) Consensus() *sidechain.Consensus {
return p.consensus
}
func (p *P2Pool) UpdateMainData(data *sidechain.ChainMain) {
p.listenersLock.RLock()
defer p.listenersLock.RUnlock()
for i := range p.listeners {
if p.listeners[i].MainData != nil {
p.listeners[i].MainData(data)
}
}
}
func (p *P2Pool) UpdateMinerData(data *p2pooltypes.MinerData) {
p.listenersLock.RLock()
defer p.listenersLock.RUnlock()
for i := range p.listeners {
if p.listeners[i].MinerData != nil {
p.listeners[i].MinerData(data)
}
}
}
func (p *P2Pool) UpdateBlockFound(data *sidechain.ChainMain, block *sidechain.PoolBlock) {
log.Printf("[P2Pool] BLOCK FOUND: main chain block at height %d, id %s was mined by this p2pool", data.Height, data.Id)