aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-04-28 16:01:32 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-04-28 16:01:32 +0000
commit9b7a1759c13d77e4e247ed9c51a44393be3ee0b6 (patch)
treef15e382c8c37289b00f0119b13fa4cf1feda254c
parentd026b1c54ad18fb0f02f18037c84395983c91164 (diff)
parent9f8910ae8692c12635e0e1f572c14e0357dd3f57 (diff)
downloadnum_cpus-android13-frc-permission-release.tar.gz
Snap for 8512216 from 9f8910ae8692c12635e0e1f572c14e0357dd3f57 to tm-frc-permission-releaset_frc_per_330444010android13-frc-permission-release
Change-Id: I259ebb5e585a7c89fcd3245ecdffd3e61df4abd0
-rw-r--r--.appveyor.yml16
-rw-r--r--.cargo_vcs_info.json7
-rw-r--r--.github/workflows/ci.yml166
-rw-r--r--.travis.yml81
-rw-r--r--Android.bp4
-rw-r--r--CHANGELOG.md6
-rw-r--r--Cargo.lock16
-rw-r--r--Cargo.toml17
-rw-r--r--Cargo.toml.orig6
-rw-r--r--METADATA14
-rw-r--r--README.md2
-rw-r--r--ci/cgroups/Dockerfile2
-rw-r--r--fixtures/cgroups/proc/cgroups/mountinfo_multi_opt8
-rw-r--r--fixtures/cgroups/proc/cgroups/mountinfo_zero_opt8
-rw-r--r--src/lib.rs5
-rw-r--r--src/linux.rs104
16 files changed, 281 insertions, 181 deletions
diff --git a/.appveyor.yml b/.appveyor.yml
deleted file mode 100644
index e75d59f..0000000
--- a/.appveyor.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-environment:
- matrix:
- - TARGET: x86_64-pc-windows-msvc
- - TARGET: i686-pc-windows-msvc
- - TARGET: x86_64-pc-windows-gnu
- - TARGET: i686-pc-windows-gnu
-install:
- - curl -sSf -o rustup-init.exe https://win.rustup.rs/
- - rustup-init.exe -y --default-host %TARGET%
- - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
- - rustc -vV
- - cargo -vV
-build: false
-test_script:
- - cargo build --verbose
- - cargo test --verbose
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 6fcb99c..45e1a87 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,6 @@
{
"git": {
- "sha1": "b347731fc0c008dbb88b406c595b1e644458fffe"
- }
-}
+ "sha1": "5f1b03332000b4c4274b5bd35fac516049ff1c6b"
+ },
+ "path_in_vcs": ""
+} \ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..f9adc30
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,166 @@
+name: CI
+on:
+ pull_request:
+ push:
+ branches:
+ - master
+
+env:
+ RUST_BACKTRACE: 1
+ CARGO_TERM_COLOR: always
+
+jobs:
+ ci-pass:
+ name: CI is green
+ runs-on: ubuntu-latest
+ needs:
+ - msrv
+ - test-linux
+ - test-macos
+ - test-windows
+ - build-cross
+ - test-cgroups
+ steps:
+ - run: exit 0
+
+ msrv:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ rust:
+ - 1.13
+ target:
+ - x86_64-unknown-linux-gnu
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run tests
+ run: |
+ rustup default ${{ matrix.rust }}
+ rustup target add ${{ matrix.target }}
+ cargo test --verbose --target ${{ matrix.target }}
+
+ test-linux:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ rust:
+ - stable
+ - beta
+ - nightly
+ target:
+ - x86_64-unknown-linux-gnu
+ - x86_64-unknown-linux-musl
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run tests
+ run: |
+ rustup default ${{ matrix.rust }}
+ rustup target add ${{ matrix.target }}
+ cargo test --verbose --target ${{ matrix.target }}
+
+ test-macos:
+ runs-on: macos-latest
+
+ strategy:
+ matrix:
+ rust:
+ - stable
+ - beta
+ - nightly
+ target:
+ - x86_64-apple-darwin
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run tests
+ run: |
+ rustup default ${{ matrix.rust }}
+ rustup target add ${{ matrix.target }}
+ cargo test --verbose --target ${{ matrix.target }}
+
+ test-windows:
+ runs-on: windows-latest
+
+ strategy:
+ matrix:
+ rust:
+ - stable
+ - beta
+ - nightly
+ target:
+ - x86_64-pc-windows-gnu
+ - x86_64-pc-windows-msvc
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run tests
+ run: |
+ rustup default ${{ matrix.rust }}
+ rustup target add ${{ matrix.target }}
+ cargo test --verbose --target ${{ matrix.target }}
+
+ build-cross:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ rust:
+ - stable
+ target:
+ - aarch64-unknown-linux-gnu
+ - i686-pc-windows-gnu
+ - i686-pc-windows-msvc
+ - i686-unknown-linux-gnu
+ - aarch64-apple-darwin
+ - aarch64-pc-windows-msvc
+ - aarch64-unknown-linux-musl
+ - arm-unknown-linux-gnueabi
+ - arm-unknown-linux-gnueabihf
+ - armv7-unknown-linux-gnueabihf
+ - mips-unknown-linux-gnu
+ - mips64-unknown-linux-gnuabi64
+ - mips64el-unknown-linux-gnuabi64
+ - mipsel-unknown-linux-gnu
+ - powerpc-unknown-linux-gnu
+ - powerpc64-unknown-linux-gnu
+ - powerpc64le-unknown-linux-gnu
+ - riscv64gc-unknown-linux-gnu
+ - s390x-unknown-linux-gnu
+ - x86_64-unknown-freebsd
+ - x86_64-unknown-illumos
+ - x86_64-unknown-netbsd
+ - i686-linux-android
+ - x86_64-linux-android
+ - arm-linux-androideabi
+ - aarch64-linux-android
+ - x86_64-apple-ios
+ - asmjs-unknown-emscripten
+ - aarch64-apple-ios
+ - aarch64-apple-ios-sim
+ - aarch64-apple-darwin
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run build
+ run: |
+ rustup default ${{ matrix.rust }}
+ rustup target add ${{ matrix.target }}
+ cargo build --verbose --target ${{ matrix.target }}
+
+ test-cgroups:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Test Cgroup
+ run: |
+ docker build -f ci/cgroups/Dockerfile -t num-cpus-cgroups .
+ # Test without cgroups
+ docker run -e NUM_CPUS_TEST_GET=2 num-cpus-cgroups
+ # Only 1 CPU
+ docker run --cpus="1" -e NUM_CPUS_TEST_GET=1 num-cpus-cgroups
+ # 1.5 CPUs
+ docker run --cpus="1.5" -e NUM_CPUS_TEST_GET=2 num-cpus-cgroups
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index cec6ddb..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-language: rust
-rust: stable
-dist: xenial
-sudo: false
-notifications:
- email: disabled
-
-cache: cargo
-
-install:
- - if [ -z "$NO_ADD" ]; then rustup target add "$TARGET"; fi
-
-script:
- - cargo build --verbose --target "$TARGET"
- # Only run the targets if we are on the same OS.
- - if [ "$RUN" == "1" ]; then cargo test --verbose --target "$TARGET"; fi
-
-env:
- global:
- # Travis CI servers make 2 cores available to processes via virtualization.
- # See https://docs.travis-ci.com/user/reference/overview/
- - NUM_CPUS_TEST_GET=2
-
-matrix:
- include:
- # Linux
- # Minimum Supported Rust Version
- - name: Minimum Supported Rust Version
- env: TARGET=x86_64-unknown-linux-gnu RUN=1 NO_ADD=1
- rust: 1.13.0
- # 32-bit requires multilib.
- - env: TARGET=i686-unknown-linux-gnu RUN=1
- addons:
- apt:
- packages:
- - gcc-multilib
- # 64-bit stable.
- - env: TARGET=x86_64-unknown-linux-gnu RUN=1 NO_ADD=1
- rust: stable
- # 64-bit beta.
- - env: TARGET=x86_64-unknown-linux-gnu RUN=1 NO_ADD=1
- rust: beta
- # 64-bit nightly.
- - env: TARGET=x86_64-unknown-linux-gnu RUN=1 NO_ADD=1
- rust: nightly
-
- # Mac OS X
- - os: osx
- env: TARGET=x86_64-apple-darwin RUN=1 NO_ADD=1
- # Android
- # - for x86
- - env: TARGET=i686-linux-android
- - env: TARGET=x86_64-linux-android
- # - for ARM
- - env: TARGET=arm-linux-androideabi
- - env: TARGET=aarch64-linux-android
- # IOS
- - os: osx
- osx_image: xcode9
- env: TARGET=x86_64-apple-ios
- # FreeBSD
- - env: TARGET=x86_64-unknown-freebsd
- # Fuchsia
- # FIXME: figure out why target is missing and re-enable
- #- env: TARGET=x86_64-unknown-fuchsia
- # NetBSD
- - env: TARGET=x86_64-unknown-netbsd
- # Emscripten
- - env: TARGET=asmjs-unknown-emscripten
-
- # CGroups in Docker
- - name: Docker CGroups
- install:
- script:
- - docker build -f ci/cgroups/Dockerfile -t num-cpus-cgroups .
- # Test without cgroups
- - docker run -it -e NUM_CPUS_TEST_GET=2 num-cpus-cgroups
- # Only 1 CPU
- - docker run -it --cpus="1" -e NUM_CPUS_TEST_GET=1 num-cpus-cgroups
- # 1.5 CPUs
- - docker run -it --cpus="1.5" -e NUM_CPUS_TEST_GET=2 num-cpus-cgroups
diff --git a/Android.bp b/Android.bp
index 82addfe..d737475 100644
--- a/Android.bp
+++ b/Android.bp
@@ -42,7 +42,7 @@ rust_library {
host_supported: true,
crate_name: "num_cpus",
cargo_env_compat: true,
- cargo_pkg_version: "1.13.0",
+ cargo_pkg_version: "1.13.1",
srcs: ["src/lib.rs"],
edition: "2015",
rustlibs: [
@@ -64,7 +64,7 @@ rust_test {
name: "num_cpus_test_src_lib",
crate_name: "num_cpus",
cargo_env_compat: true,
- cargo_pkg_version: "1.13.0",
+ cargo_pkg_version: "1.13.1",
srcs: ["src/lib.rs"],
test_suites: ["general-tests"],
auto_gen_config: true,
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0caafb2..5496ace 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## v1.13.1
+
+### Fixes
+
+- fix parsing zero or multiple optional fields in cgroup mountinfo.
+
## v1.13.0
### Features
diff --git a/Cargo.lock b/Cargo.lock
index 62c701c..93137c3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,26 +1,26 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
+version = 3
+
[[package]]
name = "hermit-abi"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
dependencies = [
- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc",
]
[[package]]
name = "libc"
version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
[[package]]
name = "num_cpus"
-version = "1.13.0"
+version = "1.13.1"
dependencies = [
- "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "hermit-abi",
+ "libc",
]
-
-[metadata]
-"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
-"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
diff --git a/Cargo.toml b/Cargo.toml
index 0bab66d..f708cc8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -3,25 +3,24 @@
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies
+# to registry (e.g., crates.io) dependencies.
#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
[package]
name = "num_cpus"
-version = "1.13.0"
+version = "1.13.1"
authors = ["Sean McArthur <sean@seanmonstar.com>"]
description = "Get the number of CPUs on a machine."
documentation = "https://docs.rs/num_cpus"
readme = "README.md"
keywords = ["cpu", "cpus", "cores"]
categories = ["hardware-support"]
-license = "MIT/Apache-2.0"
+license = "MIT OR Apache-2.0"
repository = "https://github.com/seanmonstar/num_cpus"
-[dependencies.libc]
-version = "0.2.26"
[target."cfg(all(any(target_arch = \"x86_64\", target_arch = \"aarch64\"), target_os = \"hermit\"))".dependencies.hermit-abi]
version = "0.1.3"
+[target."cfg(not(windows))".dependencies.libc]
+version = "0.2.26"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index a6e9434..a6cbbd2 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,17 +1,17 @@
[package]
name = "num_cpus"
-version = "1.13.0" # don't forget to update html_root_url
+version = "1.13.1"
description = "Get the number of CPUs on a machine."
authors = ["Sean McArthur <sean@seanmonstar.com>"]
-license = "MIT/Apache-2.0"
+license = "MIT OR Apache-2.0"
repository = "https://github.com/seanmonstar/num_cpus"
documentation = "https://docs.rs/num_cpus"
keywords = ["cpu", "cpus", "cores"]
categories = ["hardware-support"]
readme = "README.md"
-[dependencies]
+[target.'cfg(not(windows))'.dependencies]
libc = "0.2.26"
[target.'cfg(all(any(target_arch = "x86_64", target_arch = "aarch64"), target_os = "hermit"))'.dependencies]
diff --git a/METADATA b/METADATA
index 0b69247..f0d949f 100644
--- a/METADATA
+++ b/METADATA
@@ -1,7 +1,5 @@
name: "num_cpus"
-description:
- "Get the number of CPUs on a machine."
-
+description: "Get the number of CPUs on a machine."
third_party {
url {
type: HOMEPAGE
@@ -9,9 +7,13 @@ third_party {
}
url {
type: ARCHIVE
- value: "https://static.crates.io/crates/num_cpus/num_cpus-1.13.0.crate"
+ value: "https://static.crates.io/crates/num_cpus/num_cpus-1.13.1.crate"
}
- version: "1.13.0"
- last_upgrade_date { year: 2020 month: 10 day: 15 }
+ version: "1.13.1"
license_type: NOTICE
+ last_upgrade_date {
+ year: 2022
+ month: 3
+ day: 1
+ }
}
diff --git a/README.md b/README.md
index a0bbe97..1de7d8e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# num_cpus
-[![crates.io](http://meritbadge.herokuapp.com/num_cpus)](https://crates.io/crates/num_cpus)
+[![crates.io](https://img.shields.io/crates/v/num_cpus.svg)](https://crates.io/crates/num_cpus)
[![Travis CI Status](https://travis-ci.org/seanmonstar/num_cpus.svg?branch=master)](https://travis-ci.org/seanmonstar/num_cpus)
[![AppVeyor status](https://ci.appveyor.com/api/projects/status/qn8t6grhko5jwno6?svg=true)](https://ci.appveyor.com/project/seanmonstar/num-cpus)
diff --git a/ci/cgroups/Dockerfile b/ci/cgroups/Dockerfile
index d5f288a..7636a47 100644
--- a/ci/cgroups/Dockerfile
+++ b/ci/cgroups/Dockerfile
@@ -1,4 +1,4 @@
-FROM rust:1.40
+FROM rust:latest
WORKDIR /usr/num_cpus
diff --git a/fixtures/cgroups/proc/cgroups/mountinfo_multi_opt b/fixtures/cgroups/proc/cgroups/mountinfo_multi_opt
new file mode 100644
index 0000000..e03a95b
--- /dev/null
+++ b/fixtures/cgroups/proc/cgroups/mountinfo_multi_opt
@@ -0,0 +1,8 @@
+1 0 8:1 / / rw,noatime shared:1 - ext4 /dev/sda1 rw,errors=remount-ro,data=reordered
+2 1 0:1 / /dev rw,relatime shared:2 - devtmpfs udev rw,size=10240k,nr_inodes=16487629,mode=755
+3 1 0:2 / /proc rw,nosuid,nodev,noexec,relatime shared:3 - proc proc rw
+4 1 0:3 / /sys rw,nosuid,nodev,noexec,relatime shared:4 - sysfs sysfs rw
+5 4 0:4 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:5 - tmpfs tmpfs ro,mode=755
+6 5 0:5 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:6 - cgroup cgroup rw,cpuset
+7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 shared:8 shared:9 - cgroup cgroup rw,cpu,cpuacct
+8 5 0:7 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:8 - cgroup cgroup rw,memory
diff --git a/fixtures/cgroups/proc/cgroups/mountinfo_zero_opt b/fixtures/cgroups/proc/cgroups/mountinfo_zero_opt
new file mode 100644
index 0000000..ad27a96
--- /dev/null
+++ b/fixtures/cgroups/proc/cgroups/mountinfo_zero_opt
@@ -0,0 +1,8 @@
+1 0 8:1 / / rw,noatime shared:1 - ext4 /dev/sda1 rw,errors=remount-ro,data=reordered
+2 1 0:1 / /dev rw,relatime shared:2 - devtmpfs udev rw,size=10240k,nr_inodes=16487629,mode=755
+3 1 0:2 / /proc rw,nosuid,nodev,noexec,relatime shared:3 - proc proc rw
+4 1 0:3 / /sys rw,nosuid,nodev,noexec,relatime shared:4 - sysfs sysfs rw
+5 4 0:4 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:5 - tmpfs tmpfs ro,mode=755
+6 5 0:5 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:6 - cgroup cgroup rw,cpuset
+7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpu,cpuacct
+8 5 0:7 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:8 - cgroup cgroup rw,memory
diff --git a/src/lib.rs b/src/lib.rs
index 6c8280f..20474af 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -28,7 +28,6 @@
//! [`rayon::ThreadPool`]: https://docs.rs/rayon/1.*/rayon/struct.ThreadPool.html
#![cfg_attr(test, deny(warnings))]
#![deny(missing_docs)]
-#![doc(html_root_url = "https://docs.rs/num_cpus/1.13.0")]
#![allow(non_snake_case)]
#[cfg(not(windows))]
@@ -47,6 +46,8 @@ use linux::{get_num_cpus, get_num_physical_cpus};
/// This function will get the number of logical cores. Sometimes this is different from the number
/// of physical cores (See [Simultaneous multithreading on Wikipedia][smt]).
///
+/// This will always return at least `1`.
+///
/// # Examples
///
/// ```
@@ -75,6 +76,8 @@ pub fn get() -> usize {
/// Returns the number of physical cores of the current system.
///
+/// This will always return at least `1`.
+///
/// # Note
///
/// Physical count is supported only on Linux, mac OS and Windows platforms.
diff --git a/src/linux.rs b/src/linux.rs
index 671a943..36f4727 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -18,7 +18,7 @@ macro_rules! debug {
}
macro_rules! some {
- ($e:expr) => ({
+ ($e:expr) => {{
match $e {
Some(v) => v,
None => {
@@ -26,7 +26,7 @@ macro_rules! some {
return None;
}
}
- })
+ }};
}
pub fn get_num_cpus() -> usize {
@@ -126,18 +126,15 @@ fn init_cgroups() {
// Should only be called once
debug_assert!(CGROUPS_CPUS.load(Ordering::SeqCst) == 0);
- match load_cgroups("/proc/self/cgroup", "/proc/self/mountinfo") {
- Some(quota) => {
- if quota == 0 {
- return;
- }
+ if let Some(quota) = load_cgroups("/proc/self/cgroup", "/proc/self/mountinfo") {
+ if quota == 0 {
+ return;
+ }
- let logical = logical_cpus();
- let count = ::std::cmp::min(quota, logical);
+ let logical = logical_cpus();
+ let count = ::std::cmp::min(quota, logical);
- CGROUPS_CPUS.store(count, Ordering::SeqCst);
- }
- None => return,
+ CGROUPS_CPUS.store(count, Ordering::SeqCst);
}
}
@@ -167,18 +164,14 @@ struct Subsys {
impl Cgroup {
fn new(dir: PathBuf) -> Cgroup {
- Cgroup {
- base: dir,
- }
+ Cgroup { base: dir }
}
fn translate(mntinfo: MountInfo, subsys: Subsys) -> Option<Cgroup> {
// Translate the subsystem directory via the host paths.
debug!(
"subsys = {:?}; root = {:?}; mount_point = {:?}",
- subsys.base,
- mntinfo.root,
- mntinfo.mount_point
+ subsys.base, mntinfo.root, mntinfo.mount_point
);
let rel_from_root = some!(Path::new(&subsys.base).strip_prefix(&mntinfo.root).ok());
@@ -238,13 +231,27 @@ impl MountInfo {
fn parse_line(line: String) -> Option<MountInfo> {
let mut fields = line.split(' ');
+ // 7 5 0:6 </> /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 - cgroup cgroup rw,cpu,cpuacct
let mnt_root = some!(fields.nth(3));
- let mnt_point = some!(fields.nth(0));
+ // 7 5 0:6 / </sys/fs/cgroup/cpu,cpuacct> rw,nosuid,nodev,noexec,relatime shared:7 - cgroup cgroup rw,cpu,cpuacct
+ let mnt_point = some!(fields.next());
+
+ // Ignore all fields until the separator(-).
+ // Note: there could be zero or more optional fields before hyphen.
+ // See: https://man7.org/linux/man-pages/man5/proc.5.html
+ // 7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 <-> cgroup cgroup rw,cpu,cpuacct
+ // Note: we cannot use `?` here because we need to support Rust 1.13.
+ match fields.find(|&s| s == "-") {
+ Some(_) => {}
+ None => return None,
+ };
- if fields.nth(3) != Some("cgroup") {
+ // 7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 - <cgroup> cgroup rw,cpu,cpuacct
+ if fields.next() != Some("cgroup") {
return None;
}
+ // 7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 - cgroup cgroup <rw,cpu,cpuacct>
let super_opts = some!(fields.nth(1));
// We only care about the 'cpu' option
@@ -281,16 +288,18 @@ impl Subsys {
return None;
}
- fields.next().map(|path| Subsys { base: path.to_owned() })
+ fields.next().map(|path| Subsys {
+ base: path.to_owned(),
+ })
}
}
#[cfg(test)]
mod tests {
- use std::path::{Path, PathBuf};
use super::{Cgroup, MountInfo, Subsys};
+ use std::path::{Path, PathBuf};
-
+ // `static_in_const` feature is not stable in Rust 1.13.
static FIXTURES_PROC: &'static str = "fixtures/cgroups/proc/cgroups";
static FIXTURES_CGROUPS: &'static str = "fixtures/cgroups/cgroups";
@@ -304,12 +313,29 @@ mod tests {
#[test]
fn test_load_mountinfo() {
+ // test only one optional fields
let path = join!(FIXTURES_PROC, "mountinfo");
let mnt_info = MountInfo::load_cpu(path).unwrap();
assert_eq!(mnt_info.root, "/");
assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct");
+
+ // test zero optional field
+ let path = join!(FIXTURES_PROC, "mountinfo_zero_opt");
+
+ let mnt_info = MountInfo::load_cpu(path).unwrap();
+
+ assert_eq!(mnt_info.root, "/");
+ assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct");
+
+ // test multi optional fields
+ let path = join!(FIXTURES_PROC, "mountinfo_multi_opt");
+
+ let mnt_info = MountInfo::load_cpu(path).unwrap();
+
+ assert_eq!(mnt_info.root, "/");
+ assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct");
}
#[test]
@@ -324,12 +350,7 @@ mod tests {
#[test]
fn test_cgroup_mount() {
let cases = &[
- (
- "/",
- "/sys/fs/cgroup/cpu",
- "/",
- Some("/sys/fs/cgroup/cpu"),
- ),
+ ("/", "/sys/fs/cgroup/cpu", "/", Some("/sys/fs/cgroup/cpu")),
(
"/docker/01abcd",
"/sys/fs/cgroup/cpu",
@@ -348,27 +369,10 @@ mod tests {
"/docker/01abcd/large",
Some("/sys/fs/cgroup/cpu/large"),
),
-
// fails
-
- (
- "/docker/01abcd",
- "/sys/fs/cgroup/cpu",
- "/",
- None,
- ),
- (
- "/docker/01abcd",
- "/sys/fs/cgroup/cpu",
- "/docker",
- None,
- ),
- (
- "/docker/01abcd",
- "/sys/fs/cgroup/cpu",
- "/elsewhere",
- None,
- ),
+ ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/", None),
+ ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/docker", None),
+ ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/elsewhere", None),
(
"/docker/01abcd",
"/sys/fs/cgroup/cpu",
@@ -387,7 +391,7 @@ mod tests {
};
let actual = Cgroup::translate(mnt_info, subsys).map(|c| c.base);
- let expected = expected.map(|s| PathBuf::from(s));
+ let expected = expected.map(PathBuf::from);
assert_eq!(actual, expected);
}
}