Source code

Revision control

Copy as Markdown

Other Tools

// 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/.
//! The public FOG APIs, for Rust consumers.
// Re-exporting for later use in generated code.
pub extern crate chrono;
pub extern crate once_cell;
pub extern crate uuid;
// Re-exporting for use in user tests.
pub use private::{DistributionData, ErrorType, RecordedEvent};
// Must appear before `metrics` or its use of `ffi`'s macros will fail.
#[macro_use]
mod ffi;
pub mod factory;
pub mod metrics;
pub mod pings;
pub mod private;
pub mod ipc;
#[cfg(test)]
mod common_test;
#[cfg(feature = "with_gecko")]
use nserror::{NS_ERROR_UNEXPECTED, NS_OK};
#[cfg(feature = "with_gecko")]
use nsstring::{nsACString, nsCStr};
#[cfg(feature = "with_gecko")]
use xpcom::interfaces::{nsIHandleReportCallback, nsIMemoryReporter, nsISupports};
#[cfg(feature = "with_gecko")]
use xpcom::RefPtr;
/// Collect a memory report for heap memory in bytes.
#[cfg(feature = "with_gecko")]
macro_rules! moz_collect_report {
($cb:ident, $path:expr, $amount:expr, $desc:expr, $data:expr) => {
$cb.Callback(
&nsCStr::new() as &nsACString,
&nsCStr::from($path) as &nsACString,
nsIMemoryReporter::KIND_HEAP,
nsIMemoryReporter::UNITS_BYTES,
$amount as i64,
&nsCStr::from($desc) as &nsACString,
$data,
)
};
}
#[cfg(feature = "with_gecko")]
#[no_mangle]
unsafe extern "C" fn fog_collect_reports(
callback: *const nsIHandleReportCallback,
data: *const nsISupports,
_anonymize: bool,
) -> nserror::nsresult {
let callback = match RefPtr::from_raw(callback) {
Some(ptr) => ptr,
None => return NS_ERROR_UNEXPECTED,
};
extern "C" {
fn fog_malloc_size_of(ptr: *const xpcom::reexports::libc::c_void) -> usize;
fn fog_malloc_enclosing_size_of(ptr: *const xpcom::reexports::libc::c_void) -> usize;
}
let mut ops = malloc_size_of::MallocSizeOfOps::new(
fog_malloc_size_of,
Some(fog_malloc_enclosing_size_of),
);
let map_size = metrics::__glean_metric_maps::fog_map_alloc_size(&mut ops);
let metric_size = metrics::metric_memory_usage();
let total_metric_size = map_size + metric_size;
let ping_size = pings::fog_ping_alloc_size(&mut ops);
moz_collect_report!(
callback,
"explicit/fog/metrics",
total_metric_size,
"Memory used by all FOG metrics",
data
);
moz_collect_report!(
callback,
"explicit/fog/pings",
ping_size,
"Memory used by all FOG pings",
data
);
NS_OK
}