diff options
author | David LeGare <legare@google.com> | 2022-03-04 22:45:39 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-03-04 22:45:39 +0000 |
commit | 9f8910ae8692c12635e0e1f572c14e0357dd3f57 (patch) | |
tree | f15e382c8c37289b00f0119b13fa4cf1feda254c | |
parent | 972ddd374f92f3f9723bae622df937a9bedcc004 (diff) | |
parent | a3ef2ca36631797a86037e6010c6033839e70518 (diff) | |
download | num_cpus-android13-qpr2-s12-release.tar.gz |
Update num_cpus to 1.13.1 am: 1c54293d6f am: d8658ce468 am: a3ef2ca366t_frc_odp_330442040t_frc_odp_330442000t_frc_ase_330444010android-13.0.0_r83android-13.0.0_r82android-13.0.0_r81android-13.0.0_r80android-13.0.0_r79android-13.0.0_r78android-13.0.0_r77android-13.0.0_r76android-13.0.0_r75android-13.0.0_r74android-13.0.0_r73android-13.0.0_r72android-13.0.0_r71android-13.0.0_r70android-13.0.0_r69android-13.0.0_r68android-13.0.0_r67android-13.0.0_r66android-13.0.0_r65android-13.0.0_r64android-13.0.0_r63android-13.0.0_r62android-13.0.0_r61android-13.0.0_r60android-13.0.0_r59android-13.0.0_r58android-13.0.0_r57android-13.0.0_r56android-13.0.0_r55android-13.0.0_r54android-13.0.0_r53android-13.0.0_r52android-13.0.0_r51android-13.0.0_r50android-13.0.0_r49android-13.0.0_r48android-13.0.0_r47android-13.0.0_r46android-13.0.0_r45android-13.0.0_r44android-13.0.0_r43android-13.0.0_r42android-13.0.0_r41android-13.0.0_r40android-13.0.0_r39android-13.0.0_r38android-13.0.0_r37android-13.0.0_r36android-13.0.0_r35android-13.0.0_r34android-13.0.0_r33android-13.0.0_r32android-13.0.0_r30android-13.0.0_r29android-13.0.0_r28android-13.0.0_r27android-13.0.0_r24android-13.0.0_r23android-13.0.0_r22android-13.0.0_r21android-13.0.0_r20android-13.0.0_r19android-13.0.0_r18android-13.0.0_r17android-13.0.0_r16aml_go_odp_330912000aml_go_ads_330915100aml_go_ads_330915000aml_go_ads_330913000android13-qpr3-s9-releaseandroid13-qpr3-s8-releaseandroid13-qpr3-s7-releaseandroid13-qpr3-s6-releaseandroid13-qpr3-s5-releaseandroid13-qpr3-s4-releaseandroid13-qpr3-s3-releaseandroid13-qpr3-s2-releaseandroid13-qpr3-s14-releaseandroid13-qpr3-s13-releaseandroid13-qpr3-s12-releaseandroid13-qpr3-s11-releaseandroid13-qpr3-s10-releaseandroid13-qpr3-s1-releaseandroid13-qpr3-releaseandroid13-qpr3-c-s8-releaseandroid13-qpr3-c-s7-releaseandroid13-qpr3-c-s6-releaseandroid13-qpr3-c-s5-releaseandroid13-qpr3-c-s4-releaseandroid13-qpr3-c-s3-releaseandroid13-qpr3-c-s2-releaseandroid13-qpr3-c-s12-releaseandroid13-qpr3-c-s11-releaseandroid13-qpr3-c-s10-releaseandroid13-qpr3-c-s1-releaseandroid13-qpr2-s9-releaseandroid13-qpr2-s8-releaseandroid13-qpr2-s7-releaseandroid13-qpr2-s6-releaseandroid13-qpr2-s5-releaseandroid13-qpr2-s3-releaseandroid13-qpr2-s2-releaseandroid13-qpr2-s12-releaseandroid13-qpr2-s11-releaseandroid13-qpr2-s10-releaseandroid13-qpr2-s1-releaseandroid13-qpr2-releaseandroid13-qpr2-b-s1-releaseandroid13-qpr1-s8-releaseandroid13-qpr1-s7-releaseandroid13-qpr1-s6-releaseandroid13-qpr1-s5-releaseandroid13-qpr1-s4-releaseandroid13-qpr1-s3-releaseandroid13-qpr1-s2-releaseandroid13-qpr1-s1-releaseandroid13-qpr1-releaseandroid13-mainline-go-adservices-releaseandroid13-frc-odp-releaseandroid13-devandroid13-d4-s2-releaseandroid13-d4-s1-releaseandroid13-d4-releaseandroid13-d3-s1-releaseandroid13-d2-release
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/num_cpus/+/2005973
Change-Id: I984529b9e79e2200239f413ebeffeec0be248862
-rw-r--r-- | .appveyor.yml | 16 | ||||
-rw-r--r-- | .cargo_vcs_info.json | 7 | ||||
-rw-r--r-- | .github/workflows/ci.yml | 166 | ||||
-rw-r--r-- | .travis.yml | 81 | ||||
-rw-r--r-- | Android.bp | 4 | ||||
-rw-r--r-- | CHANGELOG.md | 6 | ||||
-rw-r--r-- | Cargo.lock | 16 | ||||
-rw-r--r-- | Cargo.toml | 17 | ||||
-rw-r--r-- | Cargo.toml.orig | 6 | ||||
-rw-r--r-- | METADATA | 14 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | ci/cgroups/Dockerfile | 2 | ||||
-rw-r--r-- | fixtures/cgroups/proc/cgroups/mountinfo_multi_opt | 8 | ||||
-rw-r--r-- | fixtures/cgroups/proc/cgroups/mountinfo_zero_opt | 8 | ||||
-rw-r--r-- | src/lib.rs | 5 | ||||
-rw-r--r-- | src/linux.rs | 104 |
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 @@ -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 @@ -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" @@ -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] @@ -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 + } } @@ -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 @@ -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); } } |