Skip to content

Commit

Permalink
Added new cpu-info feature and updated version scheme
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuri6037 committed Aug 1, 2023
1 parent 637ae8e commit 540d42f
Show file tree
Hide file tree
Showing 6 changed files with 302 additions and 3 deletions.
8 changes: 5 additions & 3 deletions core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "bp3d-os"
version = "1.0.0-alpha-3"
version = "1.0.0-rc.1.0.0"
authors = ["Yuri Edward <yuri6037@outlook.com>"]
edition = "2021"
description = "Operating System tools designed for BlockProject3D"
Expand Down Expand Up @@ -33,15 +33,17 @@ windows-sys = { version = "0.42.0", features = ["Win32_UI_Shell", "Win32_Foundat
[target.'cfg(all(unix, not(any(target_vendor = "apple", target_os = "android"))))'.dependencies]
zbus = { version = "3.7.0", optional = true }

[target.'cfg(all(not(any(target_vendor = "apple", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd")), any(target_arch = "x86", target_arch = "x86_64")))'.dependencies]
raw-cpuid = { version = "11.0.1", optional = true }

[features]
dirs = ["once_cell", "objc", "objc-foundation", "windows-sys"]
open = ["fs", "zbus", "windows-sys", "windows-sys/Win32_UI_WindowsAndMessaging", "objc"]
fs = ["windows-sys"]
assets = ["libc", "objc", "objc-foundation", "windows-sys/Win32_System_LibraryLoader"]
env = []

cpu-info = ["raw-cpuid"]

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
105 changes: 105 additions & 0 deletions core/src/cpu_info/bsd.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
// Copyright (c) 2023, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of BlockProject 3D nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

use std::ffi::{c_char, c_int, c_void, CStr};
use crate::cpu_info::CpuInfo;

extern "C" {
fn sysctlbyname(
name: *const c_char,
oldp: *mut c_void,
oldlenp: *mut usize,
newp: *mut c_void,
newlen: usize,
) -> c_int;
}

#[cfg(target_vendor = "apple")]
pub fn read_cpu_info() -> Option<CpuInfo> {
const MACHDEP_CPU_CORE_COUNT: *const c_char =
unsafe { CStr::from_bytes_with_nul_unchecked(b"machdep.cpu.core_count\0").as_ptr() };
const MACHDEP_CPU_BRAND_STRING: *const c_char =
unsafe { CStr::from_bytes_with_nul_unchecked(b"machdep.cpu.brand_string\0").as_ptr() };
read_cpu_info_bsd(MACHDEP_CPU_CORE_COUNT, MACHDEP_CPU_BRAND_STRING)
}

#[cfg(not(target_vendor = "apple"))]
pub fn read_cpu_info() -> Option<CpuInfo> {
const HW_NCPU: *const c_char =
unsafe { CStr::from_bytes_with_nul_unchecked(b"hw.ncpu\0").as_ptr() };
const HW_MODEL: *const c_char =
unsafe { CStr::from_bytes_with_nul_unchecked(b"hw.model\0").as_ptr() };
read_cpu_info_bsd(HW_NCPU, HW_MODEL)
}

fn read_cpu_info_bsd(
name_core_count: *const c_char,
name_brand_string: *const c_char,
) -> Option<CpuInfo> {
let mut core_count: i32 = 0;
unsafe {
let mut size = std::mem::size_of::<i32>();
let res = sysctlbyname(
name_core_count,
&mut core_count as *mut i32 as _,
&mut size,
std::ptr::null_mut(),
0,
);
if res != 0 {
return None;
}
let res = sysctlbyname(
name_brand_string,
std::ptr::null_mut(),
&mut size,
std::ptr::null_mut(),
0,
);
if res != 0 {
return None;
}
let mut buffer = vec![0u8; size + 1];
let res = sysctlbyname(
name_brand_string,
buffer.as_mut_ptr() as _,
&mut size,
std::ptr::null_mut(),
0,
);
if res != 0 {
return None;
}
Some(CpuInfo {
core_count: core_count as _,
name: CStr::from_ptr(buffer.as_ptr() as _)
.to_string_lossy()
.into(),
})
}
}
122 changes: 122 additions & 0 deletions core/src/cpu_info/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// Copyright (c) 2023, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of BlockProject 3D nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

//! This module contains tools to obtain information about the current system.

/// The CPU information structure.
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct CpuInfo {
/// The name of the CPU (aka brand string).
pub name: String,

/// The number of cores on the physical package.
pub core_count: u32,
}

//Linux and Windows
//x86 & x86-64 -> cpuid instruction (rust-cpuid library / get_processor_brand_string() and max_cores_for_package().or(max_cores_for_cache()))
//other -> None

#[cfg(any(
target_vendor = "apple",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
mod bsd;

//if vendor != apple && os != bsd* && (arch == x86 || arch == x86_64)
#[cfg(all(
not(any(
target_vendor = "apple",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
)),
any(target_arch = "x86", target_arch = "x86_64")
))]
mod x86_64;

#[cfg(any(
target_vendor = "apple",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
use bsd as _impl;

//if vendor != apple && os != bsd* && (arch == x86 || arch == x86_64)
#[cfg(all(
not(any(
target_vendor = "apple",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
)),
any(target_arch = "x86", target_arch = "x86_64")
))]
use x86_64 as _impl;

//if vendor != apple && os != bsd* && arch != x86 && arch != x86_64
#[cfg(all(
not(any(
target_vendor = "apple",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
)),
not(any(target_arch = "x86", target_arch = "x86_64"))
))]
mod unknown;

//if vendor != apple && os != bsd* && arch != x86 && arch != x86_64
#[cfg(all(
not(any(
target_vendor = "apple",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
)),
not(any(target_arch = "x86", target_arch = "x86_64"))
))]
use unknown as _impl;

/// Reads CPU information from the current system, returns None if no CPU information could be found on the current system.
///
/// # Platform specific behavior
///
/// - On macOS and iOS, this function calls *sysctlbyname* with key names `machdep.cpu.core_count` and `machdep.cpu.brand_string`.
///
/// - On other BSD systems, this function calls *sysctlbyname* with key names `hw.ncpu` and `hw.model`.
///
/// - On any x86_64 system except BSD and macos, this function uses the cpuid instruction through the raw-cpuid library.
///
/// - This function returns None for any other system not present in this list.
pub fn read_cpu_info() -> Option<CpuInfo> {
_impl::read_cpu_info()
}
33 changes: 33 additions & 0 deletions core/src/cpu_info/unknown.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Copyright (c) 2023, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of BlockProject 3D nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

use crate::cpu_info::CpuInfo;

pub fn read_cpu_info() -> Option<CpuInfo> {
None
}
34 changes: 34 additions & 0 deletions core/src/cpu_info/x86_64.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2023, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of BlockProject 3D nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

use crate::cpu_info::CpuInfo;
use raw_cpuid::CpuId;

Check warning on line 30 in core/src/cpu_info/x86_64.rs

View workflow job for this annotation

GitHub Actions / cargo test (ubuntu-20.04)

unused import: `raw_cpuid::CpuId`

warning: unused import: `raw_cpuid::CpuId` --> core/src/cpu_info/x86_64.rs:30:5 | 30 | use raw_cpuid::CpuId; | ^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default
Raw output
[
  {
    "children": [],
    "code": null,
    "level": "note",
    "message": "`#[warn(unused_imports)]` on by default",
    "rendered": null,
    "spans": []
  },
  {
    "children": [],
    "code": null,
    "level": "help",
    "message": "remove the whole `use` item",
    "rendered": null,
    "spans": [
      {
        "byte_end": 1647,
        "byte_start": 1626,
        "column_end": 22,
        "column_start": 1,
        "expansion": null,
        "file_name": "core/src/cpu_info/x86_64.rs",
        "is_primary": true,
        "label": null,
        "line_end": 30,
        "line_start": 30,
        "suggested_replacement": "",
        "suggestion_applicability": "MachineApplicable",
        "text": [
          {
            "highlight_end": 22,
            "highlight_start": 1,
            "text": "use raw_cpuid::CpuId;"
          }
        ]
      }
    ]
  }
]

Check warning on line 30 in core/src/cpu_info/x86_64.rs

View workflow job for this annotation

GitHub Actions / cargo test (ubuntu-20.04)

unused import: `raw_cpuid::CpuId`

warning: unused import: `raw_cpuid::CpuId` --> core/src/cpu_info/x86_64.rs:30:5 | 30 | use raw_cpuid::CpuId; | ^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default
Raw output
[
  {
    "children": [],
    "code": null,
    "level": "note",
    "message": "`#[warn(unused_imports)]` on by default",
    "rendered": null,
    "spans": []
  },
  {
    "children": [],
    "code": null,
    "level": "help",
    "message": "remove the whole `use` item",
    "rendered": null,
    "spans": [
      {
        "byte_end": 1647,
        "byte_start": 1626,
        "column_end": 22,
        "column_start": 1,
        "expansion": null,
        "file_name": "core/src/cpu_info/x86_64.rs",
        "is_primary": true,
        "label": null,
        "line_end": 30,
        "line_start": 30,
        "suggested_replacement": "",
        "suggestion_applicability": "MachineApplicable",
        "text": [
          {
            "highlight_end": 22,
            "highlight_start": 1,
            "text": "use raw_cpuid::CpuId;"
          }
        ]
      }
    ]
  }
]

Check warning on line 30 in core/src/cpu_info/x86_64.rs

View workflow job for this annotation

GitHub Actions / clippy

unused import: `raw_cpuid::CpuId`

warning: unused import: `raw_cpuid::CpuId` --> core/src/cpu_info/x86_64.rs:30:5 | 30 | use raw_cpuid::CpuId; | ^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default

pub fn read_cpu_info() -> Option<CpuInfo> {
None
}
3 changes: 3 additions & 0 deletions core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,6 @@ pub mod fs;

#[cfg(feature = "env")]
pub mod env;

#[cfg(feature = "cpu-info")]
pub mod cpu_info;

0 comments on commit 540d42f

Please sign in to comment.