#dll #file-format #dlopen #dylib #so #hotupdate

hotload

Zero cost hot update dynamic library; supporting DLL, SO

13 releases (5 breaking)

0.15.1 Oct 11, 2024
0.15.0 Oct 11, 2024
0.14.2 Sep 12, 2024
0.12.4 Sep 10, 2024
0.9.1 Aug 31, 2024

#668 in Parser implementations

Download history 310/week @ 2024-08-26 299/week @ 2024-09-02 580/week @ 2024-09-09 79/week @ 2024-09-16 23/week @ 2024-09-23 8/week @ 2024-09-30 236/week @ 2024-10-07 49/week @ 2024-10-14

298 downloads per month

MIT license

24KB
497 lines

hotload

[crates.io

Quick example

use dlopen2::wrapper::{Container, WrapperApi};
use hotload::types::Hotload;

// Generate the following rust calling methods
hotload::gen_rust_no_mangle!((MyApi, "../call_lib/src/lib.rs"));

// #[derive(WrapperApi)]
// struct MyApi {
//     test_print: fn(msg: String),
//     init_data: fn(msg: String),
//     stop_runtime: fn(),
// }

fn main(){
    let dll: Hotload<MyApi> = Hotload::new("../call_lib/target/release/call_lib.dll");

    // "dll created" or "file rename to" is actively loaded
    dll.init_load(|_, _| {}).unwrap();

    let mut count = 0;
    loop {
        count += 1;
        dll.test_print(format!("msg{count}"));
    }
}

Features

Main features

  • Zero cost hot update dynamic library; supporting DLL, SO

Comparison with other libraries

Feature dlopen2 hotload hot-lib-reloader
Basic functionality Yes Yes Yes
Multiplatform Yes Yes Yes
Dangling symbol prevention Yes Yes Yes
Thread safety Yes Yes Yes
Loading of symbols into structures Yes Yes Yes
Overhead Minimal Minimal Minimal
Low-level, unsafe API Yes Yes Yes
Object-oriented friendly Yes Yes Yes
Load from the program itself Yes Yes Yes
Obtaining address information (dladdr) Yes Yes Yes
Auto reload No Yes Yes
Is haved load new dll event No Yes No
Zero cost, Is not lock No Yes No
Generate rust call method No Yes Yes

Usage

Cargo.toml:

[dependencies]
dlopen2 = "0.6"
hotload = "0.9"

Documentation

Cargo documentation

License

This code is licensed under the MIT license.

Changelog

GitHub

Acknowledgement

Special thanks to dlopen2 and hot-lib-reloader

Dependencies

~2–11MB
~103K SLoC