fd/src/exec/job.rs

46 lines
1.7 KiB
Rust
Raw Normal View History

2017-10-21 10:16:03 +02:00
// Copyright (c) 2017 fd developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0>
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
// at your option. All files in the project carrying such
// notice may not be copied, modified, or distributed except
// according to those terms.
2018-09-30 22:56:32 +02:00
use super::CommandTemplate;
use internal::print_error_and_exit;
2017-10-14 18:04:11 +02:00
use std::path::PathBuf;
use std::sync::mpsc::Receiver;
2018-04-13 22:46:17 +02:00
use std::sync::{Arc, Mutex};
2018-09-30 22:56:32 +02:00
use walk::WorkerResult;
2017-10-14 18:04:11 +02:00
/// An event loop that listens for inputs from the `rx` receiver. Each received input will
/// generate a command with the supplied command template. The generated command will then
/// be executed, and this process will continue until the receiver's sender has closed.
2018-09-30 22:56:32 +02:00
pub fn job(
rx: Arc<Mutex<Receiver<WorkerResult>>>,
cmd: Arc<CommandTemplate>,
out_perm: Arc<Mutex<()>>,
) {
2017-10-14 18:04:11 +02:00
loop {
// Create a lock on the shared receiver for this thread.
let lock = rx.lock().unwrap();
// Obtain the next path from the receiver, else if the channel
// has closed, exit from the loop
2017-10-14 22:42:47 +02:00
let value: PathBuf = match lock.recv() {
2018-09-30 22:56:32 +02:00
Ok(value) => match value {
WorkerResult::Entry(val) => val,
WorkerResult::Error(err) => {
print_error_and_exit(&format!("{}", err));
2018-09-30 15:01:23 +02:00
}
},
2017-10-14 20:04:04 +02:00
Err(_) => break,
2017-10-14 18:04:11 +02:00
};
// Drop the lock so that other threads can read from the the receiver.
drop(lock);
2017-11-03 01:39:03 +01:00
// Generate a command and execute it.
cmd.generate_and_execute(&value, Arc::clone(&out_perm));
2017-10-14 18:04:11 +02:00
}
2017-10-14 20:04:04 +02:00
}