Skip to content

Commit

Permalink
Bug 1465709 - Hook rust OOM handler on rustc 1.28. r=froydnj
Browse files Browse the repository at this point in the history
Bug 1458161 added a rust OOM handler based on an unstable API that was
removed in 1.27, replaced with something that didn't allow to get the
failed allocation size.

Latest 1.28 nightly (2018-06-13) has
rust-lang/rust#50880,
rust-lang/rust#51264 and
rust-lang/rust#51241 merged, which allow to
hook the OOM handler and get the failed allocation size again.

Because this is still an unstable API, we explicitly depend on strict
versions of rustc. We also explicitly error out if automation builds
end up using a rustc version that doesn't allow us to get the allocation
size for rust OOM, because we don't want that to happen without knowing.

--HG--
extra : rebase_source : 6c097151046d088cf51f4755dd69bde97bb8bd8b
  • Loading branch information
glandium committed May 31, 2018
1 parent 4294162 commit d0e5083
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 1 deletion.
3 changes: 3 additions & 0 deletions toolkit/crashreporter/nsExceptionHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ using mozilla::ipc::CrashReporterClient;
// From toolkit/library/rust/shared/lib.rs
extern "C" {
void install_rust_panic_hook();
void install_rust_oom_hook();
bool get_rust_panic_reason(char** reason, size_t* length);
}

Expand Down Expand Up @@ -1687,6 +1688,8 @@ nsresult SetExceptionHandler(nsIFile* aXREDirectory,

install_rust_panic_hook();

install_rust_oom_hook();

InitThreadAnnotation();

return NS_OK;
Expand Down
1 change: 1 addition & 0 deletions toolkit/library/gtest/rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ cubeb_pulse_rust = ["gkrust-shared/cubeb_pulse_rust"]
gecko_debug = ["gkrust-shared/gecko_debug"]
simd-accel = ["gkrust-shared/simd-accel"]
oom_with_global_alloc = ["gkrust-shared/oom_with_global_alloc"]
oom_with_hook = ["gkrust-shared/oom_with_hook"]
moz_memory = ["gkrust-shared/moz_memory"]

[dependencies]
Expand Down
1 change: 1 addition & 0 deletions toolkit/library/rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ cubeb_pulse_rust = ["gkrust-shared/cubeb_pulse_rust"]
gecko_debug = ["gkrust-shared/gecko_debug"]
simd-accel = ["gkrust-shared/simd-accel"]
oom_with_global_alloc = ["gkrust-shared/oom_with_global_alloc"]
oom_with_hook = ["gkrust-shared/oom_with_hook"]
moz_memory = ["gkrust-shared/moz_memory"]

[dependencies]
Expand Down
7 changes: 7 additions & 0 deletions toolkit/library/rust/gkrust-features.mozbuild
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,10 @@ if CONFIG['MOZ_MEMORY']:
# A string test is not the best thing, but it works well enough here.
if CONFIG['RUSTC_VERSION'] < "1.27":
gkrust_features += ['oom_with_global_alloc']
elif CONFIG['RUSTC_VERSION'] >= "1.28" and CONFIG['RUSTC_VERSION'] < "1.29":
gkrust_features += ['oom_with_hook']
elif not CONFIG['MOZ_AUTOMATION']:
# We don't want builds on automation to unwillingly stop annotating OOM
# crash reports from rust.
error('Builds on automation must use a version of rust that supports OOM '
'hooking')
1 change: 1 addition & 0 deletions toolkit/library/rust/shared/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ cubeb_pulse_rust = ["cubeb-sys", "cubeb-pulse"]
gecko_debug = ["geckoservo/gecko_debug", "nsstring/gecko_debug"]
simd-accel = ["encoding_c/simd-accel", "encoding_glue/simd-accel"]
oom_with_global_alloc = []
oom_with_hook = []
moz_memory = ["mp4parse_capi/mp4parse_fallible"]

[lib]
Expand Down
2 changes: 1 addition & 1 deletion toolkit/library/rust/shared/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ fn main() {
// versions of rustc, >= 1.24 < 1.27, that are not going to change
// the unstable APIs we use from under us (1.26 being a beta as of
// writing, and close to release).
#[cfg(feature = "oom_with_global_alloc")]
#[cfg(any(feature = "oom_with_global_alloc", feature = "oom_with_hook"))]
println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1");
}
26 changes: 26 additions & 0 deletions toolkit/library/rust/shared/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#![cfg_attr(feature = "oom_with_global_alloc",
feature(global_allocator, alloc, alloc_system, allocator_api))]
#![cfg_attr(feature = "oom_with_hook", feature(oom_hook))]

#[cfg(feature="servo")]
extern crate geckoservo;
Expand Down Expand Up @@ -218,3 +219,28 @@ mod global_alloc {
#[cfg(feature = "oom_with_global_alloc")]
#[global_allocator]
static HEAP: global_alloc::GeckoHeap = global_alloc::GeckoHeap;

#[cfg(feature = "oom_with_hook")]
mod oom_hook {
use std::alloc::{Layout, set_oom_hook};

extern "C" {
fn GeckoHandleOOM(size: usize) -> !;
}

pub fn hook(layout: Layout) {
unsafe {
GeckoHandleOOM(layout.size());
}
}

pub fn install() {
set_oom_hook(hook);
}
}

#[no_mangle]
pub extern "C" fn install_rust_oom_hook() {
#[cfg(feature = "oom_with_hook")]
oom_hook::install();
}

0 comments on commit d0e5083

Please sign in to comment.