mirror of
https://github.com/bspeice/qadapt
synced 2024-11-23 22:38:10 -05:00
Warning message if guards without allocator enabled
This commit is contained in:
parent
e68316527f
commit
095fd797c4
@ -19,7 +19,11 @@ maintenance = { status = "actively-developed" }
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
|
log = "0.4"
|
||||||
spin = "0.4"
|
spin = "0.4"
|
||||||
thread-id = "3.3"
|
thread-id = "3.3"
|
||||||
|
|
||||||
qadapt-macro = { version = "0.7.0", path = "./qadapt-macro" }
|
qadapt-macro = { version = "0.7.0", path = "./qadapt-macro" }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
env_logger = "0.6"
|
@ -14,6 +14,7 @@ fn does_allocate() -> Box<u8> {
|
|||||||
fn main() {
|
fn main() {
|
||||||
// If you were to run `cargo run --example release_mode`, this program blows up.
|
// If you were to run `cargo run --example release_mode`, this program blows up.
|
||||||
// If, however, you ran `cargo run --release --example release_mode`,
|
// If, however, you ran `cargo run --release --example release_mode`,
|
||||||
// nothing interesting will happen.
|
// nothing interesting will happen since panic-related code is stripped
|
||||||
|
// for release builds.
|
||||||
does_allocate();
|
does_allocate();
|
||||||
}
|
}
|
||||||
|
21
examples/setup_warning.rs
Normal file
21
examples/setup_warning.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
extern crate env_logger;
|
||||||
|
extern crate qadapt;
|
||||||
|
|
||||||
|
use qadapt::allocate_panic;
|
||||||
|
|
||||||
|
// Note that we're missing the `#[global_allocator]` attribute
|
||||||
|
|
||||||
|
#[allocate_panic]
|
||||||
|
fn does_allocate() -> Box<u8> {
|
||||||
|
Box::new(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// This code will warn that QADAPT isn't being used, but won't trigger a panic.
|
||||||
|
// Run with `RUST_LOG=warn cargo run --example setup_warning`
|
||||||
|
env_logger::init();
|
||||||
|
does_allocate();
|
||||||
|
|
||||||
|
// The warning will only trigger once though
|
||||||
|
does_allocate();
|
||||||
|
}
|
12
src/lib.rs
12
src/lib.rs
@ -12,6 +12,8 @@
|
|||||||
//! for some helper macros to make working with QADAPT a bit easier.
|
//! for some helper macros to make working with QADAPT a bit easier.
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs)]
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
extern crate qadapt_macro;
|
extern crate qadapt_macro;
|
||||||
extern crate spin;
|
extern crate spin;
|
||||||
// thread_id is necessary because `std::thread::current()` panics if we have not yet
|
// thread_id is necessary because `std::thread::current()` panics if we have not yet
|
||||||
@ -45,6 +47,11 @@ pub fn enter_protected() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *IS_ACTIVE.read() == false {
|
||||||
|
*IS_ACTIVE.write() = true;
|
||||||
|
warn!("QADAPT not initialized when using allocation guards; please verify `#[global_allocator]` is set!");
|
||||||
|
}
|
||||||
|
|
||||||
PROTECTION_LEVEL
|
PROTECTION_LEVEL
|
||||||
.try_with(|v| {
|
.try_with(|v| {
|
||||||
*v.write() += 1;
|
*v.write() += 1;
|
||||||
@ -76,6 +83,7 @@ pub fn exit_protected() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IS_ACTIVE: RwLock<bool> = RwLock::new(false);
|
||||||
static INTERNAL_ALLOCATION: RwLock<usize> = RwLock::new(usize::max_value());
|
static INTERNAL_ALLOCATION: RwLock<usize> = RwLock::new(usize::max_value());
|
||||||
|
|
||||||
/// Get the current "protection level" in QADAPT: calls to enter_protected() - exit_protected()
|
/// Get the current "protection level" in QADAPT: calls to enter_protected() - exit_protected()
|
||||||
@ -115,6 +123,10 @@ fn alloc_immediate() -> bool {
|
|||||||
|
|
||||||
unsafe impl GlobalAlloc for QADAPT {
|
unsafe impl GlobalAlloc for QADAPT {
|
||||||
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
||||||
|
if *IS_ACTIVE.read() == false {
|
||||||
|
*IS_ACTIVE.write() = true;
|
||||||
|
}
|
||||||
|
|
||||||
// If we're attempting to allocate our PROTECTION_LEVEL thread local,
|
// If we're attempting to allocate our PROTECTION_LEVEL thread local,
|
||||||
// just allow it through
|
// just allow it through
|
||||||
if alloc_immediate() {
|
if alloc_immediate() {
|
||||||
|
Loading…
Reference in New Issue
Block a user