1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Copyright (c) 2022 MASSA LABS <info@massa.net>

//! This module implements a factory manager.
//! See `massa-factory-exports/manager_traits.rs` for functional details.

use std::thread::JoinHandle;

use massa_channel::sender::MassaSender;
use massa_factory_exports::FactoryManager;
use tracing::{info, warn};

/// Implementation of the factory manager
/// Allows stopping the factory worker
pub struct FactoryManagerImpl {
    /// block worker message sender and join handle
    pub(crate) block_worker: Option<(MassaSender<()>, JoinHandle<()>)>,

    /// endorsement worker message sender and join handle
    pub(crate) endorsement_worker: Option<(MassaSender<()>, JoinHandle<()>)>,
}

impl FactoryManager for FactoryManagerImpl {
    /// stops the worker
    fn stop(&mut self) {
        info!("stopping factory...");
        if let Some((chan_tx, join_handle)) = self.block_worker.take() {
            std::mem::drop(chan_tx);
            if let Err(err) = join_handle.join() {
                warn!("block factory worker panicked: {:?}", err);
            }
        }
        if let Some((chan_tx, join_handle)) = self.endorsement_worker.take() {
            std::mem::drop(chan_tx);
            if let Err(err) = join_handle.join() {
                warn!("endorsement factory worker panicked: {:?}", err);
            }
        }
        info!("factory stopped");
    }
}