From 9df08b8b2f6cab1c68a61fd497323a8363bd2033 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Sun, 12 Apr 2026 12:58:17 +0000 Subject: [PATCH 1/3] fix: ci --- diffsl/src/execution/external/mod.rs | 9 +--- diffsl/src/execution/external_interface.rs | 44 +++++++++++++++++++ .../external_dynamic_fixture_f32/Cargo.toml | 2 +- .../external_dynamic_fixture_f64/Cargo.toml | 2 +- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/diffsl/src/execution/external/mod.rs b/diffsl/src/execution/external/mod.rs index 4833563..3914fa6 100644 --- a/diffsl/src/execution/external/mod.rs +++ b/diffsl/src/execution/external/mod.rs @@ -373,14 +373,7 @@ macro_rules! impl_extern_symbols { ($ty:ty, $sym:path) => { impl ExternSymbols for $ty { fn insert_symbols(symbols: &mut HashMap) { - macro_rules! insert { - ($($name:literal => $func:ident,)+) => { - use $sym as sym; - $(symbols.insert($name.to_string(), sym::$func as *const u8);)+ - }; - } - - crate::execution::external_interface::for_each_external_symbol!(insert); + crate::execution::external_interface::insert_external_symbols!(symbols, $sym); } } }; diff --git a/diffsl/src/execution/external_interface.rs b/diffsl/src/execution/external_interface.rs index 1f41a56..435a6e0 100644 --- a/diffsl/src/execution/external_interface.rs +++ b/diffsl/src/execution/external_interface.rs @@ -45,6 +45,50 @@ macro_rules! for_each_external_symbol { #[allow(unused_imports)] pub(crate) use for_each_external_symbol; +#[allow(unused_macros)] +macro_rules! insert_external_symbols { + ($symbols:expr, $sym:path) => {{ + use $sym as sym; + $symbols.insert("barrier_init".to_string(), sym::barrier_init as *const u8); + $symbols.insert("set_constants".to_string(), sym::set_constants as *const u8); + $symbols.insert("set_u0".to_string(), sym::set_u0 as *const u8); + $symbols.insert("reset".to_string(), sym::reset as *const u8); + $symbols.insert("reset_grad".to_string(), sym::reset_grad as *const u8); + $symbols.insert("reset_rgrad".to_string(), sym::reset_rgrad as *const u8); + $symbols.insert("reset_sgrad".to_string(), sym::reset_sgrad as *const u8); + $symbols.insert("reset_srgrad".to_string(), sym::reset_srgrad as *const u8); + $symbols.insert("rhs".to_string(), sym::rhs as *const u8); + $symbols.insert("rhs_grad".to_string(), sym::rhs_grad as *const u8); + $symbols.insert("rhs_rgrad".to_string(), sym::rhs_rgrad as *const u8); + $symbols.insert("rhs_sgrad".to_string(), sym::rhs_sgrad as *const u8); + $symbols.insert("rhs_srgrad".to_string(), sym::rhs_srgrad as *const u8); + $symbols.insert("mass".to_string(), sym::mass as *const u8); + $symbols.insert("mass_rgrad".to_string(), sym::mass_rgrad as *const u8); + $symbols.insert("set_u0_grad".to_string(), sym::set_u0_grad as *const u8); + $symbols.insert("set_u0_rgrad".to_string(), sym::set_u0_rgrad as *const u8); + $symbols.insert("set_u0_sgrad".to_string(), sym::set_u0_sgrad as *const u8); + $symbols.insert("calc_out".to_string(), sym::calc_out as *const u8); + $symbols.insert("calc_out_grad".to_string(), sym::calc_out_grad as *const u8); + $symbols.insert("calc_out_rgrad".to_string(), sym::calc_out_rgrad as *const u8); + $symbols.insert("calc_out_sgrad".to_string(), sym::calc_out_sgrad as *const u8); + $symbols.insert("calc_out_srgrad".to_string(), sym::calc_out_srgrad as *const u8); + $symbols.insert("calc_stop".to_string(), sym::calc_stop as *const u8); + $symbols.insert("calc_stop_grad".to_string(), sym::calc_stop_grad as *const u8); + $symbols.insert("calc_stop_rgrad".to_string(), sym::calc_stop_rgrad as *const u8); + $symbols.insert("calc_stop_sgrad".to_string(), sym::calc_stop_sgrad as *const u8); + $symbols.insert("calc_stop_srgrad".to_string(), sym::calc_stop_srgrad as *const u8); + $symbols.insert("set_id".to_string(), sym::set_id as *const u8); + $symbols.insert("get_dims".to_string(), sym::get_dims as *const u8); + $symbols.insert("set_inputs".to_string(), sym::set_inputs as *const u8); + $symbols.insert("get_inputs".to_string(), sym::get_inputs as *const u8); + $symbols.insert("set_inputs_grad".to_string(), sym::set_inputs_grad as *const u8); + $symbols.insert("set_inputs_rgrad".to_string(), sym::set_inputs_rgrad as *const u8); + }}; +} + +#[allow(unused_imports)] +pub(crate) use insert_external_symbols; + macro_rules! collect_external_symbol_names { ($($name:literal => $func:ident,)+) => { pub(crate) const EXTERNAL_SYMBOL_NAMES: &[&str] = &[$($name),+]; diff --git a/diffsl/tests/fixtures/external_dynamic_fixture_f32/Cargo.toml b/diffsl/tests/fixtures/external_dynamic_fixture_f32/Cargo.toml index 5af4732..f8fb4eb 100644 --- a/diffsl/tests/fixtures/external_dynamic_fixture_f32/Cargo.toml +++ b/diffsl/tests/fixtures/external_dynamic_fixture_f32/Cargo.toml @@ -7,6 +7,6 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -diffsl = { path = "../../../", features = ["external"] } +diffsl = { path = "../../../", features = ["external_f32"] } [workspace] diff --git a/diffsl/tests/fixtures/external_dynamic_fixture_f64/Cargo.toml b/diffsl/tests/fixtures/external_dynamic_fixture_f64/Cargo.toml index 0449fd8..8130020 100644 --- a/diffsl/tests/fixtures/external_dynamic_fixture_f64/Cargo.toml +++ b/diffsl/tests/fixtures/external_dynamic_fixture_f64/Cargo.toml @@ -7,6 +7,6 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -diffsl = { path = "../../../", features = ["external"] } +diffsl = { path = "../../../", features = ["external_f64"] } [workspace] From af87c01432494ce36ee771b13a73f3d736831781 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Sun, 12 Apr 2026 13:00:08 +0000 Subject: [PATCH 2/3] cargo fmt --- diffsl/src/execution/external_interface.rs | 45 +++++++++++++++++----- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/diffsl/src/execution/external_interface.rs b/diffsl/src/execution/external_interface.rs index 435a6e0..bfc10e8 100644 --- a/diffsl/src/execution/external_interface.rs +++ b/diffsl/src/execution/external_interface.rs @@ -69,20 +69,47 @@ macro_rules! insert_external_symbols { $symbols.insert("set_u0_sgrad".to_string(), sym::set_u0_sgrad as *const u8); $symbols.insert("calc_out".to_string(), sym::calc_out as *const u8); $symbols.insert("calc_out_grad".to_string(), sym::calc_out_grad as *const u8); - $symbols.insert("calc_out_rgrad".to_string(), sym::calc_out_rgrad as *const u8); - $symbols.insert("calc_out_sgrad".to_string(), sym::calc_out_sgrad as *const u8); - $symbols.insert("calc_out_srgrad".to_string(), sym::calc_out_srgrad as *const u8); + $symbols.insert( + "calc_out_rgrad".to_string(), + sym::calc_out_rgrad as *const u8, + ); + $symbols.insert( + "calc_out_sgrad".to_string(), + sym::calc_out_sgrad as *const u8, + ); + $symbols.insert( + "calc_out_srgrad".to_string(), + sym::calc_out_srgrad as *const u8, + ); $symbols.insert("calc_stop".to_string(), sym::calc_stop as *const u8); - $symbols.insert("calc_stop_grad".to_string(), sym::calc_stop_grad as *const u8); - $symbols.insert("calc_stop_rgrad".to_string(), sym::calc_stop_rgrad as *const u8); - $symbols.insert("calc_stop_sgrad".to_string(), sym::calc_stop_sgrad as *const u8); - $symbols.insert("calc_stop_srgrad".to_string(), sym::calc_stop_srgrad as *const u8); + $symbols.insert( + "calc_stop_grad".to_string(), + sym::calc_stop_grad as *const u8, + ); + $symbols.insert( + "calc_stop_rgrad".to_string(), + sym::calc_stop_rgrad as *const u8, + ); + $symbols.insert( + "calc_stop_sgrad".to_string(), + sym::calc_stop_sgrad as *const u8, + ); + $symbols.insert( + "calc_stop_srgrad".to_string(), + sym::calc_stop_srgrad as *const u8, + ); $symbols.insert("set_id".to_string(), sym::set_id as *const u8); $symbols.insert("get_dims".to_string(), sym::get_dims as *const u8); $symbols.insert("set_inputs".to_string(), sym::set_inputs as *const u8); $symbols.insert("get_inputs".to_string(), sym::get_inputs as *const u8); - $symbols.insert("set_inputs_grad".to_string(), sym::set_inputs_grad as *const u8); - $symbols.insert("set_inputs_rgrad".to_string(), sym::set_inputs_rgrad as *const u8); + $symbols.insert( + "set_inputs_grad".to_string(), + sym::set_inputs_grad as *const u8, + ); + $symbols.insert( + "set_inputs_rgrad".to_string(), + sym::set_inputs_rgrad as *const u8, + ); }}; } From 0775797ece33844ea4ca49edb1abc280620f7220 Mon Sep 17 00:00:00 2001 From: martinjrobins Date: Sun, 12 Apr 2026 13:05:11 +0000 Subject: [PATCH 3/3] fix: windows --- diffsl/Cargo.toml | 1 + diffsl/src/execution/external_dynamic/loader.rs | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/diffsl/Cargo.toml b/diffsl/Cargo.toml index e7928d9..fb7b1f5 100644 --- a/diffsl/Cargo.toml +++ b/diffsl/Cargo.toml @@ -73,6 +73,7 @@ mmap-rs = "0.7" [target.'cfg(windows)'.dependencies.windows-sys] version = "0.61" features = [ + "Win32_Foundation", "Win32_System_LibraryLoader", ] diff --git a/diffsl/src/execution/external_dynamic/loader.rs b/diffsl/src/execution/external_dynamic/loader.rs index eeee797..7d9b525 100644 --- a/diffsl/src/execution/external_dynamic/loader.rs +++ b/diffsl/src/execution/external_dynamic/loader.rs @@ -100,7 +100,7 @@ impl DynamicLibrary { .chain(std::iter::once(0)) .collect::>(); let handle = unsafe { LoadLibraryW(wide_path.as_ptr()) }; - if handle == 0 { + if handle.is_null() { return Err(anyhow!( "Failed to load dynamic library {}: {}", path.display(), @@ -129,8 +129,10 @@ impl DynamicLibrary { #[cfg(all(windows, not(target_arch = "wasm32")))] impl Drop for DynamicLibrary { fn drop(&mut self) { + use windows_sys::Win32::Foundation::FreeLibrary; + unsafe { - windows_sys::Win32::System::LibraryLoader::FreeLibrary(self.handle); + FreeLibrary(self.handle); } } }