package transport import ( "ripple/config" "ripple/types" ) const ( highCh = 0 lowCh = 1 ) type doubleSenderWorker struct { channels [2]chan types.Transaction stopCh chan struct{} closeCh chan struct{} t *AccountTransport } func newDoubleSenderWorker(t *AccountTransport) *doubleSenderWorker { w := &doubleSenderWorker{ channels: [2]chan types.Transaction{ make(chan types.Transaction, config.BufferSize), make(chan types.Transaction, config.BufferSize), }, stopCh: make(chan struct{}), closeCh: make(chan struct{}), t: t, } go w.run() return w } func (w *doubleSenderWorker) run() { defer close(w.closeCh) for { select { case <-w.stopCh: return default: } select { case tx := <-w.channels[highCh]: w.t.send(tx) continue default: } select { case tx := <-w.channels[highCh]: w.t.send(tx) case tx := <-w.channels[lowCh]: w.t.send(tx) case <-w.stopCh: return } } } func (w *doubleSenderWorker) enqueueWithIndex(idx int, tx types.Transaction) { select { case w.channels[idx] <- tx: default: } } func (w *doubleSenderWorker) stop() { close(w.stopCh) <-w.closeCh }