aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ports/libsimpleservo/capi/Cargo.toml2
-rw-r--r--ports/libsimpleservo/capi/src/lib.rs26
-rw-r--r--ports/libsimpleservo/capi/src/vslogger.rs10
-rw-r--r--support/hololens/ServoApp/ServoControl/Servo.cpp22
4 files changed, 53 insertions, 7 deletions
diff --git a/ports/libsimpleservo/capi/Cargo.toml b/ports/libsimpleservo/capi/Cargo.toml
index 4cceabd8f26..594f1f8f36b 100644
--- a/ports/libsimpleservo/capi/Cargo.toml
+++ b/ports/libsimpleservo/capi/Cargo.toml
@@ -15,8 +15,8 @@ bench = false
[dependencies]
simpleservo = { path = "../api" }
log = "0.4"
-env_logger = "0.6"
lazy_static = "1"
+env_logger = "0.6"
backtrace = "0.3"
[target.'cfg(target_os = "windows")'.dependencies]
diff --git a/ports/libsimpleservo/capi/src/lib.rs b/ports/libsimpleservo/capi/src/lib.rs
index 7ee3d5022b6..a7e5b039bc8 100644
--- a/ports/libsimpleservo/capi/src/lib.rs
+++ b/ports/libsimpleservo/capi/src/lib.rs
@@ -21,6 +21,7 @@ use std::ffi::{CStr, CString};
use std::mem;
use std::os::raw::{c_char, c_void};
use std::panic::{self, UnwindSafe};
+use std::slice;
use std::sync::RwLock;
extern "C" fn default_panic_handler(msg: *const c_char) {
@@ -222,6 +223,8 @@ pub struct CInitOptions {
pub density: f32,
pub vr_pointer: *mut c_void,
pub enable_subpixel_text_antialiasing: bool,
+ pub vslogger_mod_list: *const *const c_char,
+ pub vslogger_mod_size: u32,
}
/// The returned string is not freed. This will leak.
@@ -231,13 +234,22 @@ pub extern "C" fn servo_version() -> *const c_char {
}
#[cfg(target_os = "windows")]
-fn init_logger() {
+fn init_logger(modules: &[*const c_char]) {
+ use crate::vslogger::LOG_MODULE_FILTERS;
use log::LevelFilter;
use std::sync::Once;
use vslogger::VSLogger;
static LOGGER: VSLogger = VSLogger;
static LOGGER_INIT: Once = Once::new();
+
+ if !modules.is_empty() {
+ *LOG_MODULE_FILTERS.lock().unwrap() = modules
+ .iter()
+ .map(|modules| unsafe { CStr::from_ptr(*modules).to_string_lossy().into_owned() })
+ .collect::<Vec<_>>();
+ }
+
LOGGER_INIT.call_once(|| {
log::set_logger(&LOGGER)
.map(|_| log::set_max_level(LevelFilter::Debug))
@@ -246,7 +258,7 @@ fn init_logger() {
}
#[cfg(not(target_os = "windows"))]
-fn init_logger() {
+fn init_logger(_modules: &[*const c_char]) {
crate::env_logger::init();
}
@@ -258,7 +270,13 @@ unsafe fn init(
wakeup: extern "C" fn(),
callbacks: CHostCallbacks,
) {
- init_logger();
+ let logger_modules = if opts.vslogger_mod_list.is_null() {
+ &[]
+ } else {
+ slice::from_raw_parts(opts.vslogger_mod_list, opts.vslogger_mod_size as usize)
+ };
+
+ init_logger(logger_modules);
if let Err(reason) = redirect_stdout_stderr() {
warn!("Error redirecting stdout/stderr: {}", reason);
@@ -310,7 +328,6 @@ pub extern "C" fn init_with_egl(
callbacks: CHostCallbacks,
) {
catch_any_panic(|| {
- init_logger();
let gl = gl_glue::egl::init().unwrap();
unsafe {
init(
@@ -333,7 +350,6 @@ pub extern "C" fn init_with_gl(
callbacks: CHostCallbacks,
) {
catch_any_panic(|| {
- init_logger();
let gl = gl_glue::gl::init().unwrap();
unsafe { init(opts, gl, None, None, wakeup, callbacks) }
});
diff --git a/ports/libsimpleservo/capi/src/vslogger.rs b/ports/libsimpleservo/capi/src/vslogger.rs
index 2cfc49088de..77fb550c222 100644
--- a/ports/libsimpleservo/capi/src/vslogger.rs
+++ b/ports/libsimpleservo/capi/src/vslogger.rs
@@ -3,6 +3,11 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use log::{self, Level, Metadata, Record};
+use std::sync::{Arc, Mutex};
+
+lazy_static! {
+ pub static ref LOG_MODULE_FILTERS: Arc<Mutex<Vec<String>>> = Arc::new(Mutex::new(vec![]));
+}
extern "C" {
fn OutputDebugStringA(s: *const u8);
@@ -12,7 +17,10 @@ pub struct VSLogger;
impl log::Log for VSLogger {
fn enabled(&self, metadata: &Metadata) -> bool {
- metadata.level() <= Level::Warn
+ let modules = LOG_MODULE_FILTERS.lock().unwrap();
+ let is_module_enabled =
+ modules.contains(&String::from(metadata.target())) || modules.is_empty();
+ return metadata.level() <= Level::Warn && is_module_enabled;
}
fn log(&self, record: &Record) {
diff --git a/support/hololens/ServoApp/ServoControl/Servo.cpp b/support/hololens/ServoApp/ServoControl/Servo.cpp
index 270865182a8..c315cb98409 100644
--- a/support/hololens/ServoApp/ServoControl/Servo.cpp
+++ b/support/hololens/ServoApp/ServoControl/Servo.cpp
@@ -69,6 +69,28 @@ Servo::Servo(hstring url, GLsizei width, GLsizei height, float dpi,
o.enable_subpixel_text_antialiasing = false;
o.vr_pointer = NULL;
+ // 7 filter modules.
+ /* Sample list of servo modules to filter.
+ static char *pfilters[] = {
+ "servo",
+ "simpleservo",
+ "simpleservo::jniapi",
+ "simpleservo::gl_glue::egl",
+ // Show JS errors by default.
+ "script::dom::bindings::error",
+ // Show GL errors by default.
+ "canvas::webgl_thread",
+ "compositing::compositor",
+ "constellation::constellation",
+ };
+ */
+
+ // Example Call when *pfilters[] is used:
+ // o.vslogger_mod_list = pfilters; // servo log modules
+ // o.vslogger_mod_size = sizeof(pfilters) / sizeof(pfilters[0]) -1; // Important: Number of modules in pfilters
+ o.vslogger_mod_list = NULL;
+ o.vslogger_mod_size = 0;
+
sServo = this; // FIXME;
capi::CHostCallbacks c;