1use std::sync::mpsc;
11use std::thread;
12
13use tracing::{error, info};
14
15use crate::bridge;
16use crate::zts;
17
18pub fn spawn_zts_worker(
24 worker_id: u32,
25 script: String,
26 task_rx: mpsc::Receiver<bridge::TaskRequest>,
27 ready_tx: mpsc::SyncSender<()>,
28) -> thread::JoinHandle<()> {
29 thread::Builder::new()
30 .name(format!("folk-worker-{worker_id}"))
31 .spawn(move || {
32 if let Err(e) = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
33 run_zts_worker(worker_id, &script, task_rx, ready_tx);
34 })) {
35 error!(worker_id, "ZTS worker thread panicked: {e:?}");
36 }
37 })
38 .expect("failed to spawn worker thread")
39}
40
41fn run_zts_worker(
42 worker_id: u32,
43 script: &str,
44 task_rx: mpsc::Receiver<bridge::TaskRequest>,
45 ready_tx: mpsc::SyncSender<()>,
46) {
47 let _guard = zts::ZtsThreadGuard::new();
49
50 if let Err(e) = zts::request_startup() {
52 error!(worker_id, error = ?e, "php_request_startup failed");
53 return;
54 }
55
56 bridge::init_worker_state(worker_id, task_rx, ready_tx);
58
59 if let Err(e) = zts::execute_script(script) {
63 error!(worker_id, error = ?e, "worker script failed");
64 }
65
66 bridge::cleanup_worker_state();
68 zts::request_shutdown();
69 info!(worker_id, "ZTS worker thread exiting");
72}