Added chapter9 PD code
parent
b968abce3d
commit
cd14c8480b
@ -0,0 +1,5 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "chapter9"
|
||||
version = "0.1.0"
|
@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "chapter9"
|
||||
version = "0.1.0"
|
||||
authors = ["peshwar9"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[[bin]]
|
||||
name = "message-passing"
|
||||
path = "src/message-passing.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "shared-state"
|
||||
path = "src/shared-state.rs"
|
||||
|
||||
[dependencies]
|
@ -0,0 +1,6 @@
|
||||
/Users/<username>/rust/project1
|
||||
/Users/<username>/rust/project2
|
||||
/Users/<username>/rust/project3
|
||||
/Users/<username>/rust/project4
|
||||
/Users/<username>/rust/project5
|
||||
|
@ -0,0 +1,27 @@
|
||||
use std::sync::mpsc;
|
||||
use std::thread;
|
||||
|
||||
fn main() {
|
||||
let (transmitter1, receiver) = mpsc::channel();
|
||||
|
||||
let transmitter2 = mpsc::Sender::clone(&transmitter1);
|
||||
|
||||
thread::spawn(move || {
|
||||
let num_vec: Vec<String> = vec!["One".into(), "two".into(), "three".into(), "four".into()];
|
||||
for num in num_vec {
|
||||
transmitter1.send(num).unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
thread::spawn(move || {
|
||||
let num_vec: Vec<String> =
|
||||
vec!["Five".into(), "Six".into(), "Seven".into(), "eight".into()];
|
||||
for num in num_vec {
|
||||
transmitter2.send(num).unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
for received_val in receiver {
|
||||
println!("Received from thread: {}", received_val);
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
use std::ffi::OsStr;
|
||||
use std::fs;
|
||||
use std::fs::File;
|
||||
use std::io::{BufRead, BufReader};
|
||||
use std::path::PathBuf;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct SrcStats {
|
||||
pub number_of_files: u32,
|
||||
pub loc: u32,
|
||||
pub comments: u32,
|
||||
pub blanks: u32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let src_stats = SrcStats {
|
||||
number_of_files: 0,
|
||||
loc: 0,
|
||||
comments: 0,
|
||||
blanks: 0,
|
||||
};
|
||||
let stats_counter = Arc::new(Mutex::new(src_stats));
|
||||
|
||||
let mut dir_list = File::open("./dirnames.txt").unwrap();
|
||||
let reader = BufReader::new(&mut dir_list);
|
||||
let dir_lines: Vec<_> = reader.lines().collect();
|
||||
|
||||
let mut child_handles = vec![];
|
||||
for dir in dir_lines {
|
||||
let dir = dir.unwrap();
|
||||
let src_stats = Arc::clone(&stats_counter);
|
||||
|
||||
let handle = thread::spawn(move || {
|
||||
let mut dir_entries = vec![PathBuf::from(dir)];
|
||||
let mut file_entries = vec![];
|
||||
while let Some(entry) = dir_entries.pop() {
|
||||
for inner_entry in fs::read_dir(&entry).unwrap() {
|
||||
if let Ok(entry) = inner_entry {
|
||||
if entry.path().is_dir() {
|
||||
dir_entries.push(entry.path());
|
||||
} else {
|
||||
if entry.path().extension() == Some(OsStr::new("rs")) {
|
||||
println!("File name processed is {:?}", entry);
|
||||
file_entries.push(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for file in file_entries {
|
||||
let file_contents = fs::read_to_string(&file.path()).unwrap();
|
||||
|
||||
let mut stats_pointer = src_stats.lock().unwrap();
|
||||
for line in file_contents.lines() {
|
||||
if line.len() == 0 {
|
||||
stats_pointer.blanks += 1;
|
||||
} else if line.starts_with("//") {
|
||||
stats_pointer.comments += 1;
|
||||
} else {
|
||||
stats_pointer.loc += 1;
|
||||
}
|
||||
}
|
||||
|
||||
stats_pointer.number_of_files += 1;
|
||||
}
|
||||
});
|
||||
child_handles.push(handle);
|
||||
}
|
||||
|
||||
for handle in child_handles {
|
||||
handle.join().unwrap();
|
||||
}
|
||||
println!("Source stats: {:?}", stats_counter.lock().unwrap());
|
||||
}
|
Loading…
Reference in New Issue