avoid blocked by channel (#229)

Co-authored-by: David <david@taiko.xyz>
This commit is contained in:
maskpp 2024-05-09 10:04:39 +08:00 committed by GitHub
parent 02c6ee9672
commit ce49aa43bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -76,7 +76,8 @@ type Payload struct {
stop chan struct{} stop chan struct{}
lock sync.Mutex lock sync.Mutex
cond *sync.Cond cond *sync.Cond
done chan struct{} // CHANGE(taiko): done channel to communicate we shouldnt write to `stop` channel. // CHANGE(taiko): done channel to communicate we shouldnt write to `stop` channel.
done chan struct{}
} }
// newPayload initializes the payload object. // newPayload initializes the payload object.
@ -85,7 +86,8 @@ func newPayload(empty *types.Block, id engine.PayloadID) *Payload {
id: id, id: id,
empty: empty, empty: empty,
stop: make(chan struct{}), stop: make(chan struct{}),
done: make(chan struct{}, 1), // CHANGE(taiko): buffered channel to communicate done to taiko payload builder // CHANGE(taiko): buffered channel to communicate done to taiko payload builder
done: make(chan struct{}, 1),
} }
log.Info("Starting work on payload", "id", payload.id) log.Info("Starting work on payload", "id", payload.id)
payload.cond = sync.NewCond(&payload.lock) payload.cond = sync.NewCond(&payload.lock)
@ -135,7 +137,11 @@ func (payload *Payload) Resolve() *engine.ExecutionPayloadEnvelope {
select { select {
case <-payload.stop: case <-payload.stop:
default: default:
payload.done <- struct{}{} // CHANGE(taiko): signal to taiko payload builder to not write to `payload.stop` channel // CHANGE(taiko): signal to taiko payload builder to not write to `payload.stop` channel
select {
case payload.done <- struct{}{}:
default:
}
close(payload.stop) close(payload.stop)
} }
if payload.full != nil { if payload.full != nil {
@ -174,7 +180,11 @@ func (payload *Payload) ResolveFull() *engine.ExecutionPayloadEnvelope {
select { select {
case <-payload.stop: case <-payload.stop:
default: default:
payload.done <- struct{}{} // CHANGE(taiko): signal to taiko payload builder to not write to `payload.stop` channel // CHANGE(taiko): signal to taiko payload builder to not write to `payload.stop` channel
select {
case payload.done <- struct{}{}:
default:
}
close(payload.stop) close(payload.stop)
} }
return engine.BlockToExecutableData(payload.full, payload.fullFees, payload.sidecars) return engine.BlockToExecutableData(payload.full, payload.fullFees, payload.sidecars)