summaryrefslogtreecommitdiffstats
path: root/servo/components/style/gecko/profiler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'servo/components/style/gecko/profiler.rs')
-rw-r--r--servo/components/style/gecko/profiler.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/servo/components/style/gecko/profiler.rs b/servo/components/style/gecko/profiler.rs
new file mode 100644
index 0000000000..db269b497d
--- /dev/null
+++ b/servo/components/style/gecko/profiler.rs
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+//! Gecko profiler support.
+//!
+//! Use the `profiler_label!` macro from macros.rs.
+
+use crate::gecko_bindings::structs;
+
+/// A label describing a category of work that style threads can perform.
+pub enum ProfilerLabel {
+ /// Style computation.
+ Style,
+ /// Style sheet parsing.
+ Parse,
+}
+
+/// RAII object that constructs and destroys a C++ AutoProfilerLabel object
+/// pointed to be the specified reference.
+#[cfg(feature = "gecko_profiler")]
+pub struct AutoProfilerLabel<'a>(&'a mut structs::AutoProfilerLabel);
+
+#[cfg(feature = "gecko_profiler")]
+impl<'a> AutoProfilerLabel<'a> {
+ /// Creates a new AutoProfilerLabel with the specified label type.
+ ///
+ /// unsafe since the caller must ensure that `label` is allocated on the
+ /// stack.
+ #[inline]
+ pub unsafe fn new(
+ label: &mut std::mem::MaybeUninit<structs::AutoProfilerLabel>,
+ label_type: ProfilerLabel,
+ ) -> AutoProfilerLabel {
+ let category_pair = match label_type {
+ ProfilerLabel::Style => structs::JS::ProfilingCategoryPair_LAYOUT_StyleComputation,
+ ProfilerLabel::Parse => structs::JS::ProfilingCategoryPair_LAYOUT_CSSParsing,
+ };
+ structs::Gecko_Construct_AutoProfilerLabel(label.as_mut_ptr(), category_pair);
+ AutoProfilerLabel(&mut *label.as_mut_ptr())
+ }
+}
+
+#[cfg(feature = "gecko_profiler")]
+impl<'a> Drop for AutoProfilerLabel<'a> {
+ #[inline]
+ fn drop(&mut self) {
+ unsafe {
+ structs::Gecko_Destroy_AutoProfilerLabel(self.0);
+ }
+ }
+}
+
+/// Whether the Gecko profiler is currently active.
+///
+/// This implementation must be kept in sync with
+/// `mozilla::profiler::detail::RacyFeatures::IsActive`.
+#[cfg(feature = "gecko_profiler")]
+#[inline]
+pub fn profiler_is_active() -> bool {
+ use self::structs::profiler::detail;
+ use std::mem;
+ use std::sync::atomic::{AtomicU32, Ordering};
+
+ let active_and_features: &AtomicU32 =
+ unsafe { mem::transmute(&detail::RacyFeatures_sActiveAndFeatures) };
+ (active_and_features.load(Ordering::Relaxed) & detail::RacyFeatures_Active) != 0
+}
+
+/// Always false when the Gecko profiler is disabled.
+#[cfg(not(feature = "gecko_profiler"))]
+#[inline]
+pub fn profiler_is_active() -> bool {
+ false
+}