From 4e8659f9dedf1fc845434d9d4b6030884213ff58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:30:48 +0000 Subject: [PATCH 1/3] Format Rust code using rustfmt --- src/profiler/mod.rs | 2 +- src/profiler/section.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/profiler/mod.rs b/src/profiler/mod.rs index b038e9e..99169a4 100644 --- a/src/profiler/mod.rs +++ b/src/profiler/mod.rs @@ -26,9 +26,9 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +mod instant; mod interface; mod macros; pub mod section; -mod instant; pub use interface::*; diff --git a/src/profiler/section.rs b/src/profiler/section.rs index 165d2a5..72ca225 100644 --- a/src/profiler/section.rs +++ b/src/profiler/section.rs @@ -26,11 +26,11 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +use super::instant::Instant; use crate::field::FieldSet; use crate::util::Location; use std::num::NonZeroU32; use std::sync::OnceLock; -use super::instant::Instant; #[repr(u8)] #[derive(Debug, Copy, Clone, Eq, PartialEq)] From c9dd4263e90db3081acfc48f213058e1d907b392 Mon Sep 17 00:00:00 2001 From: Yuri Edward Date: Sat, 28 Feb 2026 22:24:46 +0100 Subject: [PATCH 2/3] Use a global instant rather than a thread local for better accuracy --- src/profiler/instant.rs | 77 ++++++++++------------------------------- src/profiler/section.rs | 12 +++---- 2 files changed, 22 insertions(+), 67 deletions(-) diff --git a/src/profiler/instant.rs b/src/profiler/instant.rs index 18492aa..5371d72 100644 --- a/src/profiler/instant.rs +++ b/src/profiler/instant.rs @@ -1,4 +1,4 @@ -// Copyright (c) 2025, BlockProject 3D +// Copyright (c) 2026, BlockProject 3D // // All rights reserved. // @@ -31,68 +31,27 @@ #[cfg(unix)] use libc::{clock_gettime, timespec, CLOCK_MONOTONIC_RAW}; -#[cfg(unix)] -use std::hash::Hash; -use std::time::Duration; - -#[cfg(unix)] -trait DurationNewUnchecked { - unsafe fn new_unchecked(secs: u64, subsec_nanos: u32) -> Duration; -} - -#[cfg(unix)] -impl DurationNewUnchecked for Duration { - unsafe fn new_unchecked(secs: u64, subsec_nanos: u32) -> Duration { - const NANOS_PER_SEC: u32 = 1000000000; - if subsec_nanos >= NANOS_PER_SEC { - unsafe { std::hint::unreachable_unchecked() } - } - Duration::new(secs, subsec_nanos) - } -} - -#[cfg(unix)] -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] -#[repr(transparent)] -pub struct Instant(Duration); - #[cfg(windows)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[repr(transparent)] -pub struct Instant(std::time::Instant); - +use std::sync::LazyLock; #[cfg(windows)] -impl Instant { - #[inline(always)] - pub fn now() -> Self { - Self(std::time::Instant::now()) - } +use std::time::Instant; - #[inline(always)] - pub fn elapsed(&self) -> Duration { - self.0.elapsed() - } -} +#[cfg(windows)] +static CUR_TIME: LazyLock = LazyLock::new(Instant::now); #[cfg(unix)] -impl Instant { - pub fn now() -> Self { - let mut t = timespec { - tv_sec: 0, - tv_nsec: 0, - }; - unsafe { clock_gettime(CLOCK_MONOTONIC_RAW, &mut t) }; - Self(unsafe { Duration::new_unchecked(t.tv_sec as _, t.tv_nsec as _) }) - } +#[inline(always)] +pub fn get_time() -> u64 { + let mut other = timespec { + tv_sec: 0, + tv_nsec: 0, + }; + unsafe { clock_gettime(CLOCK_MONOTONIC_RAW, &mut other) }; + (other.tv_sec as u64) * 1000000000 + (other.tv_nsec as u64) +} - pub fn elapsed(&self) -> Duration { - let mut other = timespec { - tv_sec: 0, - tv_nsec: 0, - }; - unsafe { clock_gettime(CLOCK_MONOTONIC_RAW, &mut other) }; - // Need super slow code cause somehow CLOCK_MONOTONIC_RAW is randomly broken. - let a = unsafe { Duration::new_unchecked(other.tv_sec as _, other.tv_nsec as _) }; - a - self.0 - } +#[cfg(windows)] +#[inline(always)] +pub fn get_time() -> u64 { + CUR_TIME.elapsed().as_nanos() as _ } diff --git a/src/profiler/section.rs b/src/profiler/section.rs index 72ca225..1f00590 100644 --- a/src/profiler/section.rs +++ b/src/profiler/section.rs @@ -1,4 +1,4 @@ -// Copyright (c) 2025, BlockProject 3D +// Copyright (c) 2026, BlockProject 3D // // All rights reserved. // @@ -26,7 +26,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use super::instant::Instant; +use super::instant::get_time; use crate::field::FieldSet; use crate::util::Location; use std::num::NonZeroU32; @@ -45,10 +45,6 @@ pub enum Level { Event = 2, } -thread_local! { - static CUR_TIME: Instant = Instant::now(); -} - pub struct Entered<'a, const N: usize> { id: NonZeroU32, start: u64, @@ -57,7 +53,7 @@ pub struct Entered<'a, const N: usize> { impl Drop for Entered<'_, N> { fn drop(&mut self) { - let end = CUR_TIME.with(|v| v.elapsed().as_nanos() as _); + let end = get_time(); crate::engine::get().section_record(self.id, self.start, end, self.fields.as_ref()); } } @@ -111,7 +107,7 @@ impl Section { let id = self.get_id(); Entered { id: *id, - start: CUR_TIME.with(|v| v.elapsed().as_nanos() as _), + start: get_time(), fields, } } From 2b3aa14c1ce992b6375ffa66eea27b60c57ab925 Mon Sep 17 00:00:00 2001 From: Yuri Edward Date: Sat, 28 Feb 2026 22:25:09 +0100 Subject: [PATCH 3/3] Update version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 593c036..2c8ab2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bp3d-debug" -version = "1.0.2" +version = "1.0.3" authors = ["Yuri Edward "] edition = "2021" description = "Tracing subscriber implementations for use with BP3D software. Supports traditional logging through bp3d-logger and supports remote profiling through TCP."