Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "bp3d-debug"
version = "1.0.2"
version = "1.0.3"
authors = ["Yuri Edward <yuri6037@outlook.com>"]
edition = "2021"
description = "Tracing subscriber implementations for use with BP3D software. Supports traditional logging through bp3d-logger and supports remote profiling through TCP."
Expand Down
77 changes: 18 additions & 59 deletions src/profiler/instant.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2025, BlockProject 3D
// Copyright (c) 2026, BlockProject 3D
//
// All rights reserved.
//
Expand Down Expand Up @@ -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<Instant> = 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 _
}
2 changes: 1 addition & 1 deletion src/profiler/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::*;
12 changes: 4 additions & 8 deletions src/profiler/section.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2025, BlockProject 3D
// Copyright (c) 2026, BlockProject 3D
//
// All rights reserved.
//
Expand Down Expand Up @@ -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::get_time;
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)]
Expand All @@ -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,
Expand All @@ -57,7 +53,7 @@ pub struct Entered<'a, const N: usize> {

impl<const N: usize> 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());
}
}
Expand Down Expand Up @@ -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,
}
}
Expand Down