feat(lib): parallelize the reader and parser

This commit is contained in:
Orhun Parmaksız 2021-10-09 23:50:57 +03:00
parent 0795f8c8bc
commit 3bcd06aa9a
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
4 changed files with 159 additions and 7 deletions

134
Cargo.lock generated
View file

@ -11,6 +11,12 @@ dependencies = [
"memchr",
]
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "block-buffer"
version = "0.7.3"
@ -44,6 +50,56 @@ version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "crossbeam-channel"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
dependencies = [
"cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd"
dependencies = [
"cfg-if",
"crossbeam-utils",
"lazy_static",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db"
dependencies = [
"cfg-if",
"lazy_static",
]
[[package]]
name = "digest"
version = "0.8.1"
@ -53,6 +109,12 @@ dependencies = [
"generic-array",
]
[[package]]
name = "either"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
[[package]]
name = "fake-simd"
version = "0.1.2"
@ -68,12 +130,22 @@ dependencies = [
"typenum",
]
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "kparams"
version = "0.1.0"
dependencies = [
"kparams-core",
"kparams-parser",
"rayon",
]
[[package]]
@ -116,6 +188,18 @@ dependencies = [
"syn",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6"
[[package]]
name = "maplit"
version = "1.0.2"
@ -128,6 +212,25 @@ version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
[[package]]
name = "memoffset"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "once_cell"
version = "1.8.0"
@ -201,6 +304,31 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rayon"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90"
dependencies = [
"autocfg",
"crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
"lazy_static",
"num_cpus",
]
[[package]]
name = "regex"
version = "1.5.4"
@ -218,6 +346,12 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "sha-1"
version = "0.8.2"

View file

@ -6,10 +6,15 @@ pub enum Error {
/// Error that might occur during I/O operations.
#[error("IO error: `{0}`")]
IoError(#[from] std::io::Error),
/// Error that might occur whenever a lock is acquired.
#[error("Thread lock error: `{0}`")]
ThreadLockError(String),
/// Error that might occur while parsing documents.
#[error("parse error: `{0}`")]
ParseError(String),
}
unsafe impl Send for Error {}
/// Type alias for the standard [`Result`] type.
pub type Result<T> = core::result::Result<T, Error>;

View file

@ -5,6 +5,7 @@ authors = ["Orhun Parmaksız <orhunparmaksiz@gmail.com>"]
edition = "2021"
[dependencies]
rayon = "1.5.1"
[dependencies.kparams-parser]
version = "0.1.0"

View file

@ -2,24 +2,36 @@
#![warn(missing_docs, clippy::unwrap_used)]
use kparams_core::error::Result;
use kparams_core::error::{Error, Result};
use kparams_core::kernel::SysctlSection;
use kparams_core::reader;
use kparams_parser::parser::RstParser;
use rayon::prelude::*;
use std::path::PathBuf;
use std::sync::Mutex;
/// Runs `kparams`.
pub fn run() -> Result<()> {
let kernel_docs = PathBuf::from("/usr/share/doc/linux");
let sysctl_docs = kernel_docs.join("admin-guide").join("sysctl");
let mut kernel_parameters = Vec::new();
for section in SysctlSection::variants().iter() {
let docs = reader::read_to_string(&sysctl_docs.join(section.as_file()))?;
kernel_parameters.extend(RstParser::parse_docs(&docs, *section)?);
}
let kernel_parameters = Mutex::new(Vec::new());
SysctlSection::variants().par_iter().try_for_each(|s| {
let mut kernel_parameters = kernel_parameters
.lock()
.map_err(|e| Error::ThreadLockError(e.to_string()))?;
let mut parse = |section: SysctlSection| -> Result<()> {
let docs = reader::read_to_string(&sysctl_docs.join(section.as_file()))?;
Ok(kernel_parameters.extend(RstParser::parse_docs(&docs, section)?))
};
parse(*s)
})?;
for param in kernel_parameters {
for param in kernel_parameters
.lock()
.map_err(|e| Error::ThreadLockError(e.to_string()))?
.iter()
{
println!("## {}::{}\n", param.section, param.name);
println!("{}\n", param.description);
}