evobench_tools/run/
open_run_queues.rs

1//! Does not belong in run_queues.rs? But must be accessible for utils
2//! other than evobench.rs, too, thus this module.
3
4use std::{
5    thread::{self, JoinHandle},
6    time::Duration,
7};
8
9use anyhow::Result;
10use chj_unix_util::polling_signals::SharedPollingSignals;
11
12use crate::{
13    clone,
14    run::{
15        config::ShareableConfig, output_directory::html_files::regenerate_index_files,
16        run_queues::RunQueues, sub_command::wd::open_queue_change_signals,
17    },
18    utillib::arc::CloneArc,
19    warn,
20};
21
22#[must_use]
23pub struct RegenerateIndexFiles {
24    signal_change: SharedPollingSignals,
25    shareable_config: ShareableConfig,
26}
27
28impl RegenerateIndexFiles {
29    pub fn run_one(&self) {
30        if let Some(signal) = self.signal_change.get_latest_signal() {
31            if let Err(e) = regenerate_index_files(&self.shareable_config, None, None) {
32                signal.ignore();
33                // XX backoff
34                warn!("error: regenerate_index_files: {e:#}");
35            } else {
36                signal.confirm();
37            }
38        }
39    }
40
41    pub fn spawn_runner_thread(self) -> std::io::Result<JoinHandle<()>> {
42        thread::Builder::new()
43            .name("regen-index-files".into())
44            .spawn({
45                move || {
46                    loop {
47                        self.run_one();
48                        thread::sleep(Duration::from_millis(500));
49                    }
50                }
51            })
52    }
53}
54
55pub fn open_run_queues(
56    shareable_config: &ShareableConfig,
57) -> Result<(RunQueues, RegenerateIndexFiles)> {
58    // Get `signal_change` as argument? But there's really no harm
59    // done by multiple mappings, OK?
60    let signal_change = open_queue_change_signals(&shareable_config.global_app_state_dir)?;
61    let signal_change_sender = signal_change.sender();
62    clone!(shareable_config);
63    Ok((
64        RunQueues::open(
65            shareable_config.run_config.queues.clone_arc(),
66            true,
67            &shareable_config.global_app_state_dir,
68            Some(signal_change_sender),
69        )?,
70        RegenerateIndexFiles {
71            signal_change,
72            shareable_config,
73        },
74    ))
75}