#patch #dynamic #hotload

nightly hotpatch

Changing function definitions at runtime

3 releases (breaking)

0.3.0 Feb 9, 2021
0.2.0 Feb 2, 2021
0.1.0 Dec 18, 2020

#1258 in Development tools

GPL-3.0 license

26KB
368 lines

hotpatch

crates.io docs.rs

This crate is primarily used to load new function definitions from shared object files in an exceedingly easy way.

Key features:

  • Thread safe
  • Type safe
  • Works for functions of any signature
  • Namespace aware

Short Example

The following shows how dead-simple this crate is to use:

// main.rs
use hotpatch::*;

#[patchable]
fn foo() { }

fn main() -> Result<(), Box<dyn std::error::Error>> {
  foo(); // does nothing
  foo.hotpatch_lib("libsomething.so")?;
  foo(); // does something totally different!
  foo.hotpatch_fn(|| println!("Dyamic!"))?;
  foo(); // even more modification!
  Ok(())
}

Warning

Don't hotpatch the function you're currently in, or any of its parents.

Because hotpatch doesn't allow multiple function definitions to be in affect at the same time, this will cause a deadlock.

It is possible to do this with the force functions, however they are unsafe, as in a multithreaded enironment this could cause multiple function definitions to be in effect at once.

Docs

For more information, see the docs.

TODO

This crate is still has a long way to go before being "finished". Below are some items left to do. Submit an issue or PR to this section for feature requests!

  • no_std and use features to give the widest possible functionality
    • probably will need to move back to lazy_static
  • methods (in progress)
  • #[patchable] ||() to generate from a closure (is this even possible?)
  • lower compile times
    • include only necessary features for sub-dependencies
  • properly document nightly feature requirements

Dependencies

~1.3–1.8MB
~38K SLoC