mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-07 12:05:46 +00:00
refac: simplify logger shutdown system
This commit is contained in:
parent
e108e5b778
commit
67215ea230
14
src/main.rs
14
src/main.rs
@ -11,11 +11,15 @@ pub mod utils;
|
|||||||
use std::{env, path::PathBuf};
|
use std::{env, path::PathBuf};
|
||||||
|
|
||||||
use cli::CliArgs;
|
use cli::CliArgs;
|
||||||
use error::{Error, Result};
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use utils::{QuestionAction, QuestionPolicy};
|
|
||||||
|
|
||||||
use crate::utils::logger::spawn_logger_thread;
|
use self::{
|
||||||
|
error::{Error, Result},
|
||||||
|
utils::{
|
||||||
|
logger::{shutdown_logger_and_wait, spawn_logger_thread},
|
||||||
|
QuestionAction, QuestionPolicy,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
// Used in BufReader and BufWriter to perform less syscalls
|
// Used in BufReader and BufWriter to perform less syscalls
|
||||||
const BUFFER_CAPACITY: usize = 1024 * 32;
|
const BUFFER_CAPACITY: usize = 1024 * 32;
|
||||||
@ -27,9 +31,9 @@ static CURRENT_DIRECTORY: Lazy<PathBuf> = Lazy::new(|| env::current_dir().unwrap
|
|||||||
pub const EXIT_FAILURE: i32 = libc::EXIT_FAILURE;
|
pub const EXIT_FAILURE: i32 = libc::EXIT_FAILURE;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let handler = spawn_logger_thread();
|
spawn_logger_thread();
|
||||||
let result = run();
|
let result = run();
|
||||||
handler.shutdown_and_wait();
|
shutdown_logger_and_wait();
|
||||||
|
|
||||||
if let Err(err) = result {
|
if let Err(err) = result {
|
||||||
eprintln!("{err}");
|
eprintln!("{err}");
|
||||||
|
@ -5,6 +5,12 @@ pub use logger_thread::spawn_logger_thread;
|
|||||||
use super::colors::{ORANGE, RESET, YELLOW};
|
use super::colors::{ORANGE, RESET, YELLOW};
|
||||||
use crate::accessible::is_running_in_accessible_mode;
|
use crate::accessible::is_running_in_accessible_mode;
|
||||||
|
|
||||||
|
/// Asks logger to shutdown and waits till it flushes all pending messages.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn shutdown_logger_and_wait() {
|
||||||
|
logger_thread::send_shutdown_command_and_wait();
|
||||||
|
}
|
||||||
|
|
||||||
/// Asks logger to flush all messages, useful before starting STDIN interaction.
|
/// Asks logger to flush all messages, useful before starting STDIN interaction.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn flush_messages() {
|
pub fn flush_messages() {
|
||||||
@ -57,7 +63,7 @@ pub fn warning(contents: String) {
|
|||||||
enum LoggerCommand {
|
enum LoggerCommand {
|
||||||
Print(PrintMessage),
|
Print(PrintMessage),
|
||||||
Flush { finished_barrier: Arc<Barrier> },
|
Flush { finished_barrier: Arc<Barrier> },
|
||||||
FlushAndShutdown,
|
FlushAndShutdown { finished_barrier: Arc<Barrier> },
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Message object used for sending logs from worker threads to a logging thread via channels.
|
/// Message object used for sending logs from worker threads to a logging thread via channels.
|
||||||
@ -134,13 +140,6 @@ mod logger_thread {
|
|||||||
.expect("Failed to send print message");
|
.expect("Failed to send print message");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[track_caller]
|
|
||||||
fn send_shutdown_message() {
|
|
||||||
get_sender()
|
|
||||||
.send(LoggerCommand::FlushAndShutdown)
|
|
||||||
.expect("Failed to send shutdown message");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub(super) fn send_flush_message_and_wait() {
|
pub(super) fn send_flush_message_and_wait() {
|
||||||
let barrier = Arc::new(Barrier::new(2));
|
let barrier = Arc::new(Barrier::new(2));
|
||||||
@ -154,45 +153,25 @@ mod logger_thread {
|
|||||||
barrier.wait();
|
barrier.wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LoggerThreadHandle {
|
#[track_caller]
|
||||||
shutdown_barrier: Arc<Barrier>,
|
pub(super) fn send_shutdown_command_and_wait() {
|
||||||
|
let barrier = Arc::new(Barrier::new(2));
|
||||||
|
|
||||||
|
get_sender()
|
||||||
|
.send(LoggerCommand::FlushAndShutdown {
|
||||||
|
finished_barrier: barrier.clone(),
|
||||||
|
})
|
||||||
|
.expect("Failed to send shutdown message");
|
||||||
|
|
||||||
|
barrier.wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LoggerThreadHandle {
|
pub fn spawn_logger_thread() {
|
||||||
/// Tell logger to shutdown and waits till it does.
|
|
||||||
pub fn shutdown_and_wait(self) {
|
|
||||||
// Signal the shutdown
|
|
||||||
send_shutdown_message();
|
|
||||||
// Wait for confirmation
|
|
||||||
self.shutdown_barrier.wait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
// shutdown_and_wait must be called manually, but to keep 'em clean, in
|
|
||||||
// case of tests just do it on drop
|
|
||||||
impl Drop for LoggerThreadHandle {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
send_shutdown_message();
|
|
||||||
self.shutdown_barrier.wait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn spawn_logger_thread() -> LoggerThreadHandle {
|
|
||||||
let log_receiver = setup_channel();
|
let log_receiver = setup_channel();
|
||||||
|
rayon::spawn(move || run_logger(log_receiver));
|
||||||
let shutdown_barrier = Arc::new(Barrier::new(2));
|
|
||||||
|
|
||||||
let handle = LoggerThreadHandle {
|
|
||||||
shutdown_barrier: shutdown_barrier.clone(),
|
|
||||||
};
|
|
||||||
|
|
||||||
rayon::spawn(move || run_logger(log_receiver, shutdown_barrier));
|
|
||||||
|
|
||||||
handle
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_logger(log_receiver: LogReceiver, shutdown_barrier: Arc<Barrier>) {
|
fn run_logger(log_receiver: LogReceiver) {
|
||||||
const FLUSH_TIMEOUT: Duration = Duration::from_millis(200);
|
const FLUSH_TIMEOUT: Duration = Duration::from_millis(200);
|
||||||
|
|
||||||
let mut buffer = Vec::<String>::with_capacity(16);
|
let mut buffer = Vec::<String>::with_capacity(16);
|
||||||
@ -222,14 +201,13 @@ mod logger_thread {
|
|||||||
flush_logs_to_stderr(&mut buffer);
|
flush_logs_to_stderr(&mut buffer);
|
||||||
finished_barrier.wait();
|
finished_barrier.wait();
|
||||||
}
|
}
|
||||||
LoggerCommand::FlushAndShutdown => {
|
LoggerCommand::FlushAndShutdown { finished_barrier } => {
|
||||||
flush_logs_to_stderr(&mut buffer);
|
flush_logs_to_stderr(&mut buffer);
|
||||||
break;
|
finished_barrier.wait();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shutdown_barrier.wait();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn flush_logs_to_stderr(buffer: &mut Vec<String>) {
|
fn flush_logs_to_stderr(buffer: &mut Vec<String>) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user