Skip to main content

Module cdyn

Module cdyn 

Source
Expand description

§cdyn — COM-style C function-table loading (ABI-stable)

Load Copy-sized vtable/descriptor structs from dynamic libraries using plain C function tables — no Rust trait objects, no named-based access, purely positional dispatch. This is the COM+-like emulated vtable system (formerly the separate cdyn-loader crate).

Unlike crate::dyn_mod, this mode is ABI-stable across languages: the C++ SDK (cdyn-loader-sdks/cpp) and Zig SDK (cdyn-loader-sdks/zig) build plugins that match these layouts exactly.

§Cross-module memory ownership model

The core of every cross-module boundary is who manages memory. Every pointer crossing the boundary must be paired with a deallocation function that lives in the module which allocated the memory (allocators are not guaranteed to match across module/CRT boundaries). This crate provides three ownership tiers, all following that rule:

TierTypeOwnershipFree function
StatelessVTablePlugin<T>none (static vtable)
Instance (multi-owner)CdynHandle<T>ref-counted via retain/release fn ptrs in AbiStableDynRefprovided by the plugin
Data (single-owner)CdynBox / CdynBoxHandlemove-only, exactly one ownerfree fn ptr in the box, provided by the allocating module

Cross-module safety rules enforced by construction:

  1. Allocator symmetryfree/release always execute inside the module that allocated (the function pointer belongs to that module’s code, e.g. CdynBox::from_vec pairs with a Rust-plugin allocator).
  2. Library lifetimeCdynBoxHandle and CdynHandle<T> own a DynLib (Arc-shared), so the library cannot be unloaded while a handle (and thus a free/release fn ptr) still exists.

§Usage

#[repr(C)]
struct MyVtable {
    add: unsafe extern "C" fn(i32, i32) -> i32,
    name: unsafe extern "C" fn() -> *const std::ffi::c_char,
}

let plugin = unsafe { VTablePlugin::<MyVtable>::load("libmy.so", b"my_get_vtable\0")? };
let n = unsafe { (plugin.vtable().add)(1, 2) };

Structs§

CdynBox
A cross-module data box: memory allocated and freed by the same module.
CdynBoxHandle
Host-side owning handle over a CdynBox received from a foreign module.
CdynHandle
Ref-counted handle to a foreign plugin object exposed through a *_get_dyn style entry point returning an AbiStableDynRef.
GeneratedFunction
Descriptor for a generated math function (matches C++ GeneratedFunction)
MathModuleVtable
Vtable struct matching C++ MathModuleVtable layout exactly
VTablePlugin
Load a Copy-sized vtable/descriptor struct from a dynamic library.

Functions§

cdyn_box_free_rust
Rust plugin free function paired with CdynBox::from_vec.

Type Aliases§

MathSession
Opaque handle for a C++ MathSession
PluginDynEntryPoint
Type of the dyn entry point that foreign plugins export (C++ CDYN_EXPORT AbiStableDynRef name_get_dyn(), Zig declareDynEntry).