MCPcopy
hub / github.com/lni/dragonboat / workerPoolMain

Method workerPoolMain

engine.go:819–853  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

817}
818
819func (p *closeWorkerPool) workerPoolMain() {
820 cases := make([]reflect.SelectCase, len(p.workers)+2)
821 for {
822 // 0 - pool stopper stopc
823 // 1 - node ready for destroy
824 cases[0] = reflect.SelectCase{
825 Dir: reflect.SelectRecv,
826 Chan: reflect.ValueOf(p.poolStopper.ShouldStop()),
827 }
828 cases[1] = reflect.SelectCase{
829 Dir: reflect.SelectRecv,
830 Chan: reflect.ValueOf(p.ready),
831 }
832 for idx, w := range p.workers {
833 cases[2+idx] = reflect.SelectCase{
834 Dir: reflect.SelectRecv,
835 Chan: reflect.ValueOf(w.completedC),
836 }
837 }
838 chosen, v, _ := reflect.Select(cases)
839 if chosen == 0 {
840 p.timedWait()
841 return
842 } else if chosen == 1 {
843 node := v.Interface().(closeReq).node
844 p.pending = append(p.pending, node)
845 } else if chosen > 1 && chosen < len(p.workers)+2 {
846 workerID := uint64(chosen - 2)
847 p.completed(workerID)
848 } else {
849 plog.Panicf("chosen %d, unknown case", chosen)
850 }
851 p.schedule()
852 }
853}
854
855func (p *closeWorkerPool) timedWait() {
856 timer := time.NewTimer(timedCloseWait)

Callers 1

newCloseWorkerPoolFunction · 0.95

Calls 5

timedWaitMethod · 0.95
completedMethod · 0.95
scheduleMethod · 0.95
ShouldStopMethod · 0.65
PanicfMethod · 0.65

Tested by

no test coverage detected