MCPcopy Index your code
hub / github.com/php/frankenphp / initWorkers

Function initWorkers

worker.go:46–99  ·  view source on GitHub ↗
(opt []workerOpt)

Source from the content-addressed store, hash-verified

44)
45
46func initWorkers(opt []workerOpt) error {
47 if len(opt) == 0 {
48 return nil
49 }
50
51 var (
52 workersReady sync.WaitGroup
53 totalThreadsToStart int
54 )
55
56 workers = make([]*worker, 0, len(opt))
57 workersByName = make(map[string]*worker, len(opt))
58 workersByPath = make(map[string]*worker, len(opt))
59
60 for _, o := range opt {
61 w, err := newWorker(o)
62 if err != nil {
63 return err
64 }
65
66 totalThreadsToStart += w.num
67 workers = append(workers, w)
68 workersByName[w.name] = w
69 if w.allowPathMatching {
70 workersByPath[w.fileName] = w
71 }
72 }
73
74 startupFailChan = make(chan error, totalThreadsToStart)
75
76 for _, w := range workers {
77 for i := 0; i < w.num; i++ {
78 thread := getInactivePHPThread()
79 convertToWorkerThread(thread, w)
80
81 workersReady.Go(func() {
82 thread.state.WaitFor(state.Ready, state.ShuttingDown, state.Done)
83 })
84 }
85 }
86
87 workersReady.Wait()
88
89 select {
90 case err := <-startupFailChan:
91 // at least 1 worker has failed, return an error
92 return fmt.Errorf("failed to initialize workers: %w", err)
93 default:
94 // all workers started successfully
95 startupFailChan = nil
96 }
97
98 return nil
99}
100
101func newWorker(o workerOpt) (*worker, error) {
102 // Order is important!

Callers 1

InitFunction · 0.85

Calls 4

newWorkerFunction · 0.85
getInactivePHPThreadFunction · 0.85
convertToWorkerThreadFunction · 0.85
WaitForMethod · 0.80

Tested by

no test coverage detected