[][src]Crate qadapt

debug_assert! for your memory usage

Please note: This crate has been deprecated in favor of alloc-counter.

This allocator is a helper for writing high-performance code that is memory-sensitive; a thread panic will be triggered if a function annotated with #[no_alloc], or code inside an assert_no_alloc! macro interacts with the allocator in any way. Wanton allocations and unforeseen drops no more - this library lets you focus on writing code without worrying if Rust properly managed to inline the variable into the stack.

Now, an allocator blowing up in production is a scary thought; that's why QADAPT is designed to strip its own code out whenever you're running with a release build. Just like the debug_assert! macro in Rust's standard library, it's safe to use without worrying about a unforeseen circumstance causing your application to crash.

Usage

Actually making use of QADAPT is straight-forward. To set up the allocator, place the following snippet in either your program binaries (main.rs) or tests:

use qadapt::QADAPT;

#[global_allocator]
static Q: QADAPT = QADAPT;

fn main() {
    assert!(qadapt::is_active());
}

After that, there are two ways of telling QADAPT that it should trigger a panic:

  1. Annotate functions with the #[no_alloc] proc macro:
use qadapt::no_alloc;
use qadapt::QADAPT;
use std::panic::catch_unwind;

#[global_allocator]
static Q: QADAPT = QADAPT;

// This function is fine, there are no allocations here
#[no_alloc]
fn do_math() -> u8 {
    2 + 2
}

// This function will trigger a panic when called
#[no_alloc]
fn does_panic() -> Box<u32> {
    Box::new(5)
}

fn main() {
    do_math();

    let err = catch_unwind(|| does_panic());
    assert!(err.is_err());
}
  1. Evaluate expressions with the assert_no_alloc! macro
use qadapt::assert_no_alloc;
use qadapt::QADAPT;

#[global_allocator]
static Q: QADAPT = QADAPT;

fn main() {
    // This code is allowed to trigger an allocation
    let b = Box::new(8);
     
    // This code would panic if an allocation occurred inside it
    let x = assert_no_alloc!(*b + 2);
    assert_eq!(x, 10);
}

Macros

assert_no_alloc[
Deprecated
]

Get the result of an expression, guaranteeing that no memory accesses occur during its evaluation.

Structs

QADAPT[
Deprecated
]

The QADAPT allocator itself

Functions

enter_protected[
Deprecated
]

Let QADAPT know that we are now entering a protected region and that panics should be triggered if allocations/drops happen while we are running.

exit_protected[
Deprecated
]

Let QADAPT know that we are exiting a protected region. Will panic if we attempt to exit_protected more times than we enter_protected.

is_active[
Deprecated
]

Determine whether QADAPT will trigger thread panics if an allocation happens during protected code. This should be used for making sure that QADAPT is properly set up and initialized.

protection_level[
Deprecated
]

Get the current "protection level" in QADAPT: calls to enter_protected() - exit_protected().