From 758d551a3eb7dc8881e9c650ad0e6ad3dc9fb98a Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 11:10:17 +0000 Subject: [PATCH 01/15] dev container: remove duplicate entry cargo audit was being installed twice Signed-off-by: Pedro Ferreira --- .devcontainer/scripts/common/rust/install-rust.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.devcontainer/scripts/common/rust/install-rust.sh b/.devcontainer/scripts/common/rust/install-rust.sh index fbab8779..253388cd 100755 --- a/.devcontainer/scripts/common/rust/install-rust.sh +++ b/.devcontainer/scripts/common/rust/install-rust.sh @@ -25,5 +25,4 @@ cargo binstall cargo-outdated --locked cargo binstall cargo-machete --locked cargo binstall cargo-deny --locked -cargo binstall cargo-audit --locked cargo binstall cargo-nextest --locked From b957cff94992a15c03d129b04f060fb5cab52a72 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 16:15:19 +0000 Subject: [PATCH 02/15] dev container: set the root path for rust analyzer Signed-off-by: Pedro Ferreira --- .devcontainer/almalinux/devcontainer.json | 5 ++++- .devcontainer/amazonlinux/devcontainer.json | 5 ++++- .devcontainer/debiantrixie/devcontainer.json | 5 ++++- .devcontainer/ubuntu20/devcontainer.json | 5 ++++- .devcontainer/ubuntu22/devcontainer.json | 5 ++++- .devcontainer/ubuntu24/devcontainer.json | 5 ++++- .devcontainer/ubuntu25/devcontainer.json | 5 ++++- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/.devcontainer/almalinux/devcontainer.json b/.devcontainer/almalinux/devcontainer.json index 252bbf68..72c16e5c 100644 --- a/.devcontainer/almalinux/devcontainer.json +++ b/.devcontainer/almalinux/devcontainer.json @@ -38,7 +38,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, diff --git a/.devcontainer/amazonlinux/devcontainer.json b/.devcontainer/amazonlinux/devcontainer.json index 2610a3e6..9a12fd37 100644 --- a/.devcontainer/amazonlinux/devcontainer.json +++ b/.devcontainer/amazonlinux/devcontainer.json @@ -42,7 +42,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, diff --git a/.devcontainer/debiantrixie/devcontainer.json b/.devcontainer/debiantrixie/devcontainer.json index 684157d1..c3085b13 100644 --- a/.devcontainer/debiantrixie/devcontainer.json +++ b/.devcontainer/debiantrixie/devcontainer.json @@ -38,7 +38,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, diff --git a/.devcontainer/ubuntu20/devcontainer.json b/.devcontainer/ubuntu20/devcontainer.json index e7783184..cb10c067 100644 --- a/.devcontainer/ubuntu20/devcontainer.json +++ b/.devcontainer/ubuntu20/devcontainer.json @@ -40,7 +40,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, diff --git a/.devcontainer/ubuntu22/devcontainer.json b/.devcontainer/ubuntu22/devcontainer.json index 02c77d4d..fdc217ec 100644 --- a/.devcontainer/ubuntu22/devcontainer.json +++ b/.devcontainer/ubuntu22/devcontainer.json @@ -40,7 +40,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, diff --git a/.devcontainer/ubuntu24/devcontainer.json b/.devcontainer/ubuntu24/devcontainer.json index 52f08331..57789ef2 100644 --- a/.devcontainer/ubuntu24/devcontainer.json +++ b/.devcontainer/ubuntu24/devcontainer.json @@ -40,7 +40,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, diff --git a/.devcontainer/ubuntu25/devcontainer.json b/.devcontainer/ubuntu25/devcontainer.json index 87ea80b5..d69f9d4b 100644 --- a/.devcontainer/ubuntu25/devcontainer.json +++ b/.devcontainer/ubuntu25/devcontainer.json @@ -40,7 +40,10 @@ "editor.formatOnSave": true, "[cpp]": { "editor.defaultFormatter": "xaver.clang-format" - } + }, + "rust-analyzer.linkedProjects": [ + "${workspaceFolder}/rust/Cargo.toml" + ] } } }, From 81adbdc4ac1a5c4add770d6b77ed28ee0e432872 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 15:00:49 +0000 Subject: [PATCH 03/15] rust: fix clippy lints Signed-off-by: Pedro Ferreira --- rust/mxl/examples/flow-reader.rs | 18 ++++++++---------- rust/mxl/examples/flow-writer.rs | 20 ++++++++++---------- rust/mxl/tests/basic_tests.rs | 6 +++--- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/rust/mxl/examples/flow-reader.rs b/rust/mxl/examples/flow-reader.rs index 60987c87..7f0e89eb 100644 --- a/rust/mxl/examples/flow-reader.rs +++ b/rust/mxl/examples/flow-reader.rs @@ -95,17 +95,15 @@ fn read_samples( ); } batch_size as usize - } else { - if continous_flow_info.commitBatchSize == 0 { - let batch_size = (sample_rate.numerator / (100 * sample_rate.denominator)) as usize; - warn!( - "Writer batch size not available, using fallback value of {}.", - batch_size - ); + } else if continous_flow_info.commitBatchSize == 0 { + let batch_size = (sample_rate.numerator / (100 * sample_rate.denominator)) as usize; + warn!( + "Writer batch size not available, using fallback value of {}.", batch_size - } else { - continous_flow_info.commitBatchSize as usize - } + ); + batch_size + } else { + continous_flow_info.commitBatchSize as usize }; let mut read_head = reader.get_info()?.continuous_flow_info()?.headIndex; let mut read_head_valid_at = mxl_instance.get_time(); diff --git a/rust/mxl/examples/flow-writer.rs b/rust/mxl/examples/flow-writer.rs index 7f369c80..44031212 100644 --- a/rust/mxl/examples/flow-writer.rs +++ b/rust/mxl/examples/flow-writer.rs @@ -88,8 +88,8 @@ pub fn write_grains( let mut grain_writer_access = writer.open_grain(grain_index)?; let payload = grain_writer_access.payload_mut(); let payload_len = payload.len(); - for i in 0..payload_len { - payload[i] = ((i as u64 + grain_index) % 256) as u8; + for (i, byte) in payload.iter_mut().enumerate() { + *byte = ((i as u64 + grain_index) % 256) as u8; } grain_writer_access.commit(payload_len as u32)?; @@ -130,10 +130,10 @@ pub fn write_samples( let mut remaining_samples = sample_count; loop { - if let Some(count) = remaining_samples { - if count == 0 { - break; - } + if let Some(count) = remaining_samples + && count == 0 + { + break; } let samples_to_write = u64::min(batch_size, remaining_samples.unwrap_or(u64::MAX)); if let Some(count) = remaining_samples { @@ -144,12 +144,12 @@ pub fn write_samples( let mut writing_sample_index = samples_index - batch_size + 1; for channel in 0..samples_write_access.channels() { let (data_1, data_2) = samples_write_access.channel_data_mut(channel)?; - for i in 0..data_1.len() { - data_1[i] = (writing_sample_index % 256) as u8; + for sample in data_1.iter_mut() { + *sample = (writing_sample_index % 256) as u8; writing_sample_index += 1; } - for i in 0..data_2.len() { - data_2[i] = (writing_sample_index % 256) as u8; + for sample in data_2.iter_mut() { + *sample = (writing_sample_index % 256) as u8; writing_sample_index += 1; } } diff --git a/rust/mxl/tests/basic_tests.rs b/rust/mxl/tests/basic_tests.rs index 003952a3..c153ce8b 100644 --- a/rust/mxl/tests/basic_tests.rs +++ b/rust/mxl/tests/basic_tests.rs @@ -42,7 +42,8 @@ fn setup_test(test: &str) -> mxl::MxlInstance { fn read_flow_def>(path: P) -> String { let flow_config_file = mxl::config::get_mxl_repo_root().join(path); - let flow_def = std::fs::read_to_string(flow_config_file.as_path()) + + std::fs::read_to_string(flow_config_file.as_path()) .map_err(|error| { mxl::Error::Other(format!( "Error while reading flow definition from \"{}\": {}", @@ -50,8 +51,7 @@ fn read_flow_def>(path: P) -> String { error )) }) - .unwrap(); - flow_def + .unwrap() } fn prepare_flow_info>( From 4cb659451de9e01bf2fad822b98265b5907fb12c Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 15:01:15 +0000 Subject: [PATCH 04/15] rust: add license to nextest config Signed-off-by: Pedro Ferreira --- rust/.config/nextest.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rust/.config/nextest.toml b/rust/.config/nextest.toml index 6a109e17..d7db88de 100644 --- a/rust/.config/nextest.toml +++ b/rust/.config/nextest.toml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2025 2025 Contributors to the Media eXchange Layer project. +# SPDX-License-Identifier: Apache-2.0 + [profile.ci] fail-fast = false From ea7e80259f00d96c2618b72a205dd587333a7da6 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 16:57:19 +0000 Subject: [PATCH 05/15] rust: upgrade tracing-subscriber cargo audit complained about RUSTSEC-2025-0055 Signed-off-by: Pedro Ferreira --- rust/Cargo.lock | 137 +++++++++++++++++++++++++++++++++--------------- rust/Cargo.toml | 2 +- 2 files changed, 95 insertions(+), 44 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index eda5e2d4..9ea4d3b8 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -221,7 +221,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets", + "windows-targets 0.53.2", ] [[package]] @@ -232,11 +232,11 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -284,12 +284,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys", ] [[package]] @@ -298,12 +297,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -346,17 +339,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -367,15 +351,9 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -501,14 +479,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -625,64 +603,137 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + [[package]] name = "windows-targets" version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_aarch64_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + [[package]] name = "windows_i686_gnu" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_i686_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnu" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "windows_x86_64_msvc" version = "0.53.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index d986b3aa..3a030638 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -20,7 +20,7 @@ dlopen2 = "0.8" futures = "0.3" thiserror = "2.0.12" tracing = { version = "0.1", features = ["log"] } -tracing-subscriber = { version = "0.3", features = ["env-filter", "std"] } +tracing-subscriber = { version = "0.3.20", features = ["env-filter", "std"] } uuid = { version = "1.17" } [workspace.dependencies.clap] From 19eefd75e0f72ec6b04b2915836ba2c89ec66b6b Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 16:58:28 +0000 Subject: [PATCH 06/15] rust: add version to Cargo.toml Signed-off-by: Pedro Ferreira --- rust/mxl-sys/Cargo.toml | 1 + rust/mxl/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/rust/mxl-sys/Cargo.toml b/rust/mxl-sys/Cargo.toml index 58e1dbf1..1da42252 100644 --- a/rust/mxl-sys/Cargo.toml +++ b/rust/mxl-sys/Cargo.toml @@ -6,6 +6,7 @@ name = "mxl-sys" edition.workspace = true publish.workspace = true version.workspace = true +license.workspace = true [dependencies] diff --git a/rust/mxl/Cargo.toml b/rust/mxl/Cargo.toml index 325c59ec..ca640489 100644 --- a/rust/mxl/Cargo.toml +++ b/rust/mxl/Cargo.toml @@ -6,6 +6,7 @@ name = "mxl" edition.workspace = true publish.workspace = true version.workspace = true +license.workspace = true [dependencies] mxl-sys = { path = "../mxl-sys" } From 78d047f3b0bc22e3cbf9798304f5ff116e7fd2fc Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 17:06:24 +0000 Subject: [PATCH 07/15] rust: add a config file for cargo deny Asked on Slack for guidance regarding which licenses should be accepted. Signed-off-by: Pedro Ferreira --- rust/deny.toml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 rust/deny.toml diff --git a/rust/deny.toml b/rust/deny.toml new file mode 100644 index 00000000..d8a4044e --- /dev/null +++ b/rust/deny.toml @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2025 Contributors to the Media eXchange Layer project. +# SPDX-License-Identifier: Apache-2.0 + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +# List of explicitly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +allow = [ + "MIT", + "Apache-2.0", + "Unicode-3.0", + "BSD-3-Clause", + "ISC" +] From ee04b9e3b2d3e1f9ba1c599891a4a986270ce5ed Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 14:33:02 +0100 Subject: [PATCH 08/15] ci: create the rust target directory Signed-off-by: Pedro Ferreira --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9a0332d8..79879a97 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -87,6 +87,9 @@ jobs: mkdir -p ${{ github.workspace }}/install chmod 777 ${{ github.workspace }}/install chmod g+s ${{ github.workspace }}/install + mkdir -p ${{ github.workspace }}/rust/target + chmod 777 ${{ github.workspace }}/rust/target + chmod g+s ${{ github.workspace }}/rust/target - name: Build Docker image if: steps.check-image.outputs.exists == 'false' From 2d08debeacf18d921e91d3355edff2b037ef8fcb Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 16:17:07 +0000 Subject: [PATCH 09/15] ci: add rust tasks Signed-off-by: Pedro Ferreira --- .github/workflows/build.yml | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 79879a97..123008a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -165,6 +165,53 @@ jobs: ctest --output-junit test-results.xml " + - name: Cache Cargo registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-lint-${{ hashFiles('**/Cargo.toml') }} + restore-keys: ${{ runner.os }}-cargo-lint- + + - name: Check the Rust bindings + env: + RUSTFLAGS: "-Dwarnings" + run: | + docker run --mount src=${{ github.workspace }},target=/workspace/mxl,type=bind \ + -i mxl_build_container_with_source \ + bash -c " + cd /workspace/mxl/rust && \ + cargo fmt -- --check && \ + cargo clippy --all-targets --all-features --locked -- -D warnings && \ + cargo audit && \ + cargo outdated && \ + cargo machete && \ + cargo deny check all + " + + - name: Build Rust bindings + run: | + docker run --mount src=${{ github.workspace }},target=/workspace/mxl,type=bind \ + -i mxl_build_container_with_source \ + bash -c " + cd /workspace/mxl/rust && \ + cargo build --all-targets --locked && \ + cargo build --release --all-targets --locked + " + + - name: Test the Rust bindings + run: | + docker run --mount src=${{ github.workspace }},target=/workspace/mxl,type=bind \ + -i mxl_build_container_with_source \ + bash -c " + cd /workspace/mxl/rust && \ + cargo nextest run --release --locked + " + - name: Publish Test Results uses: EnricoMi/publish-unit-test-result-action@v2 if: always() From 56975241daf08d3e8c11a2110b811c4404de7144 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 17:05:13 +0000 Subject: [PATCH 10/15] ci: delete the original rust workflow Signed-off-by: Pedro Ferreira --- .github/workflows/rust.yml | 146 ------------------------------------- 1 file changed, 146 deletions(-) delete mode 100644 .github/workflows/rust.yml diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml deleted file mode 100644 index a2fa3889..00000000 --- a/.github/workflows/rust.yml +++ /dev/null @@ -1,146 +0,0 @@ -# SPDX-FileCopyrightText: 2025 Contributors to the Media eXchange Layer project. -# SPDX-License-Identifier: Apache-2.0 - -name: Test the rust bindings - -on: - pull_request: - workflow_dispatch: - workflow_call: # We would like this to be called by the main job - -jobs: - dependencies: - name: Check Rust dependencies - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./rust - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Cache - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.toml') }} - restore-keys: ${{ runner.os }}-cargo-deps- - - name: Use Rust stable 1.88 - uses: dtolnay/rust-toolchain@1.88.0 - - name: Install cargo audit - uses: baptiste0928/cargo-install@v3 - with: - crate: cargo-audit - - name: Install cargo outdated - uses: baptiste0928/cargo-install@v3 - with: - crate: cargo-outdated - - name: Install cargo udeps - uses: baptiste0928/cargo-install@v3 - with: - crate: cargo-udeps - - name: Install cargo deny - uses: baptiste0928/cargo-install@v3 - with: - crate: cargo-deny - - name: Audit dependencies - run: cargo audit -D warnings - - name: Outdated dependencies - run: cargo outdated -d 1 -w --exit-code 1 - - name: Install nightly-2025-06-26 # Same date as 1.88 release - uses: dtolnay/rust-toolchain@nightly - with: - toolchain: nightly-2025-06-26 - - name: Unused depedency check - run: cargo udeps --all-targets - - lint: - name: Perform Rust linting and documentation - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./rust - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Cache - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-lint-${{ hashFiles('**/Cargo.toml') }} - restore-keys: ${{ runner.os }}-cargo-lint- - - name: Use Rust stable 1.88 - uses: dtolnay/rust-toolchain@1.88.0 - with: - components: rustfmt, clippy - - name: build - run: cargo build --locked - - name: Format - run: cargo fmt -- --check - - name: Docs - run: cargo doc --all-features - env: - RUSTDOCFLAGS: "-D warnings" - - name: Clippy - run: cargo clippy --all-targets -F mxl-not-built -- -D warnings - - tests: - name: Run the tests - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./rust - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Cache - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-tests-${{ hashFiles('**/Cargo.toml') }} - restore-keys: ${{ runner.os }}-cargo-tests- - - name: Use Rust stable 1.88 - uses: dtolnay/rust-toolchain@1.88.0 - with: - components: rustfmt, clippy - - name: build - run: cargo build --locked -F mxl-not-built - - name: Test - run: cargo test --locked -F mxl-not-built - - name: Coverage - run: > - cargo llvm-cov --ignore-filename-regex "build.rs|ffi.rs|(.*)_test.rs" - --lcov --output-path lcov.info - - name: Report Coverage - uses: romeovs/lcov-reporter-action@v0.4.0 - if: ${{ github.event_name == 'pull_request' }} - with: - lcov-file: ./lcov.info - github-token: ${{ secrets.GITHUB_TOKEN }} - delete-old-comments: true From 096f1c41530c20fc537e10dec1ddc4bea2d62a30 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 19:04:12 +0000 Subject: [PATCH 11/15] rust: allow reusing a loaded api The api is now returned as an Arc, which can be cloned. Signed-off-by: Pedro Ferreira --- rust/mxl/src/api.rs | 10 +++++++--- rust/mxl/src/instance.rs | 8 +++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/rust/mxl/src/api.rs b/rust/mxl/src/api.rs index c47c18d0..fde080d5 100644 --- a/rust/mxl/src/api.rs +++ b/rust/mxl/src/api.rs @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2025 2025 Contributors to the Media eXchange Layer project. // SPDX-License-Identifier: Apache-2.0 -use std::path::Path; +use std::{path::Path, sync::Arc}; use dlopen2::wrapper::{Container, WrapperApi}; @@ -154,6 +154,10 @@ pub struct MxlApi { mxl_get_time: unsafe extern "C" fn() -> u64, } -pub fn load_api(path_to_so_file: impl AsRef) -> Result> { - Ok(unsafe { Container::load(path_to_so_file.as_ref().as_os_str()) }?) +pub type MxlApiHandle = Arc>; + +pub fn load_api(path_to_so_file: impl AsRef) -> Result { + Ok(Arc::new(unsafe { + Container::load(path_to_so_file.as_ref().as_os_str()) + }?)) } diff --git a/rust/mxl/src/instance.rs b/rust/mxl/src/instance.rs index 64fd5d2a..cfb2f15b 100644 --- a/rust/mxl/src/instance.rs +++ b/rust/mxl/src/instance.rs @@ -3,16 +3,14 @@ use std::{ffi::CString, sync::Arc}; -use dlopen2::wrapper::Container; - -use crate::{Error, FlowInfo, MxlApi, MxlFlowReader, MxlFlowWriter, Result}; +use crate::{Error, FlowInfo, MxlFlowReader, MxlFlowWriter, Result, api::MxlApiHandle}; /// This struct stores the context that is shared by all objects. /// It is separated out from `MxlInstance` so that it can be cloned /// and other objects' lifetimes be decoupled from the MxlInstance /// itself. pub(crate) struct InstanceContext { - pub(crate) api: Container, + pub(crate) api: MxlApiHandle, pub(crate) instance: mxl_sys::mxlInstance, } @@ -70,7 +68,7 @@ pub struct MxlInstance { } impl MxlInstance { - pub fn new(api: Container, domain: &str, options: &str) -> Result { + pub fn new(api: MxlApiHandle, domain: &str, options: &str) -> Result { let instance = unsafe { api.mxl_create_instance( CString::new(domain)?.as_ptr(), From a886d6d0ff5f83580435a8a506184e9c70a72651 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Wed, 1 Oct 2025 19:36:00 +0000 Subject: [PATCH 12/15] rust: add non-blocking version of get grain Signed-off-by: Pedro Ferreira --- rust/mxl/src/grain/data.rs | 9 +++++++- rust/mxl/src/grain/reader.rs | 42 +++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/rust/mxl/src/grain/data.rs b/rust/mxl/src/grain/data.rs index d8cd9879..8ced646d 100644 --- a/rust/mxl/src/grain/data.rs +++ b/rust/mxl/src/grain/data.rs @@ -2,8 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 pub struct GrainData<'a> { - pub user_data: &'a [u8], + /// The grain payload. This may be a partial payload if the grain is not complete. + /// The length of this slice is given by `commitedSize` in `mxlGrainInfo`. pub payload: &'a [u8], + + /// The total size of the grain payload, which may be larger than `payload.len()` if the grain is partial. + pub total_size: usize, + + /// The grain user data. The length of this slice is given by `userDataSize` in `mxlGrainInfo`. + pub user_data: &'a [u8], } impl<'a> GrainData<'a> { diff --git a/rust/mxl/src/grain/reader.rs b/rust/mxl/src/grain/reader.rs index df892e02..cc8d5ffb 100644 --- a/rust/mxl/src/grain/reader.rs +++ b/rust/mxl/src/grain/reader.rs @@ -70,7 +70,47 @@ impl GrainReader { let payload = unsafe { std::slice::from_raw_parts(payload_ptr, grain_info.grainSize as usize) }; - Ok(GrainData { user_data, payload }) + Ok(GrainData { + user_data, + payload, + total_size: grain_info.grainSize as usize, + }) + } + + /// Non-blocking version of `get_complete_grain`. If the grain is not available, returns an error. + /// If the grain is partial, it is returned as is and the payload length will be smaller than the total grain size. + pub fn get_grain_non_blocking<'a>(&'a self, index: u64) -> Result> { + let mut grain_info: mxl_sys::mxlGrainInfo = unsafe { std::mem::zeroed() }; + let mut payload_ptr: *mut u8 = std::ptr::null_mut(); + unsafe { + Error::from_status(self.context.api.mxl_flow_reader_get_grain_non_blocking( + self.reader, + index, + &mut grain_info, + &mut payload_ptr, + ))?; + } + + if payload_ptr.is_null() { + return Err(Error::Other(format!( + "Failed to get grain payload for index {index}.", + ))); + } + + // SAFETY + // We know that the lifetime is as long as the flow, so it is at least self's lifetime. + // It may happen that the buffer is overwritten by a subsequent write, but it is safe. + let user_data: &'a [u8] = + unsafe { std::mem::transmute::<&[u8], &'a [u8]>(&grain_info.userData) }; + + let payload = + unsafe { std::slice::from_raw_parts(payload_ptr, grain_info.grainSize as usize) }; + + Ok(GrainData { + user_data, + payload, + total_size: grain_info.grainSize as usize, + }) } fn destroy_inner(&mut self) -> Result<()> { From 5d9aedfc81c7a308ba898d8b1c52a693814704ac Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Thu, 2 Oct 2025 07:13:11 +0000 Subject: [PATCH 13/15] rust: rename MxlFlowReader to FlowReader Signed-off-by: Pedro Ferreira --- rust/mxl/src/flow/reader.rs | 8 ++++---- rust/mxl/src/instance.rs | 8 ++++---- rust/mxl/src/lib.rs | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rust/mxl/src/flow/reader.rs b/rust/mxl/src/flow/reader.rs index 38abfd73..2461c55b 100644 --- a/rust/mxl/src/flow/reader.rs +++ b/rust/mxl/src/flow/reader.rs @@ -9,14 +9,14 @@ use crate::{ instance::InstanceContext, }; -pub struct MxlFlowReader { +pub struct FlowReader { context: Arc, reader: mxl_sys::mxlFlowReader, } /// The MXL readers and writers are not thread-safe, so we do not implement `Sync` for them, but /// there is no reason to not implement `Send`. -unsafe impl Send for MxlFlowReader {} +unsafe impl Send for FlowReader {} pub(crate) fn get_flow_info( context: &Arc, @@ -29,7 +29,7 @@ pub(crate) fn get_flow_info( Ok(FlowInfo { value: flow_info }) } -impl MxlFlowReader { +impl FlowReader { pub(crate) fn new(context: Arc, reader: mxl_sys::mxlFlowReader) -> Self { Self { context, reader } } @@ -65,7 +65,7 @@ impl MxlFlowReader { } } -impl Drop for MxlFlowReader { +impl Drop for FlowReader { fn drop(&mut self) { if !self.reader.is_null() && let Err(err) = Error::from_status(unsafe { diff --git a/rust/mxl/src/instance.rs b/rust/mxl/src/instance.rs index cfb2f15b..b4ff8fcb 100644 --- a/rust/mxl/src/instance.rs +++ b/rust/mxl/src/instance.rs @@ -3,7 +3,7 @@ use std::{ffi::CString, sync::Arc}; -use crate::{Error, FlowInfo, MxlFlowReader, MxlFlowWriter, Result, api::MxlApiHandle}; +use crate::{Error, FlowInfo, FlowReader, MxlFlowWriter, Result, api::MxlApiHandle}; /// This struct stores the context that is shared by all objects. /// It is separated out from `MxlInstance` so that it can be cloned @@ -44,7 +44,7 @@ impl Drop for InstanceContext { pub(crate) fn create_flow_reader( context: &Arc, flow_id: &str, -) -> Result { +) -> Result { let flow_id = CString::new(flow_id)?; let options = CString::new("")?; let mut reader: mxl_sys::mxlFlowReader = std::ptr::null_mut(); @@ -59,7 +59,7 @@ pub(crate) fn create_flow_reader( if reader.is_null() { return Err(Error::Other("Failed to create flow reader.".to_string())); } - Ok(MxlFlowReader::new(context.clone(), reader)) + Ok(FlowReader::new(context.clone(), reader)) } #[derive(Clone)] @@ -83,7 +83,7 @@ impl MxlInstance { } } - pub fn create_flow_reader(&self, flow_id: &str) -> Result { + pub fn create_flow_reader(&self, flow_id: &str) -> Result { create_flow_reader(&self.context, flow_id) } diff --git a/rust/mxl/src/lib.rs b/rust/mxl/src/lib.rs index 1b9ecbc9..44db333c 100644 --- a/rust/mxl/src/lib.rs +++ b/rust/mxl/src/lib.rs @@ -12,7 +12,7 @@ pub mod config; pub use api::{MxlApi, load_api}; pub use error::{Error, Result}; -pub use flow::{reader::MxlFlowReader, writer::MxlFlowWriter, *}; +pub use flow::{reader::FlowReader, writer::MxlFlowWriter, *}; pub use grain::{ data::*, reader::GrainReader, write_access::GrainWriteAccess, writer::GrainWriter, }; From bbde83f1424f1548617acb78270c371f82b40bf2 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Thu, 2 Oct 2025 07:14:03 +0000 Subject: [PATCH 14/15] rust: rename MxlFlowWriter to FlowWriter Signed-off-by: Pedro Ferreira --- rust/mxl/src/flow/writer.rs | 8 ++++---- rust/mxl/src/instance.rs | 6 +++--- rust/mxl/src/lib.rs | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rust/mxl/src/flow/writer.rs b/rust/mxl/src/flow/writer.rs index b1234073..0f7c6bca 100644 --- a/rust/mxl/src/flow/writer.rs +++ b/rust/mxl/src/flow/writer.rs @@ -11,7 +11,7 @@ use crate::{ /// Generic MXL Flow Writer, which can be further used to build either the "discrete" (grain-based /// data like video frames or meta) or "continuous" (audio samples) flow writers in MXL terminology. -pub struct MxlFlowWriter { +pub struct FlowWriter { context: Arc, writer: mxl_sys::mxlFlowWriter, id: uuid::Uuid, @@ -19,9 +19,9 @@ pub struct MxlFlowWriter { /// The MXL readers and writers are not thread-safe, so we do not implement `Sync` for them, but /// there is no reason to not implement `Send`. -unsafe impl Send for MxlFlowWriter {} +unsafe impl Send for FlowWriter {} -impl MxlFlowWriter { +impl FlowWriter { pub(crate) fn new( context: Arc, writer: mxl_sys::mxlFlowWriter, @@ -77,7 +77,7 @@ impl MxlFlowWriter { } } -impl Drop for MxlFlowWriter { +impl Drop for FlowWriter { fn drop(&mut self) { if !self.writer.is_null() && let Err(err) = Error::from_status(unsafe { diff --git a/rust/mxl/src/instance.rs b/rust/mxl/src/instance.rs index b4ff8fcb..e0d3374c 100644 --- a/rust/mxl/src/instance.rs +++ b/rust/mxl/src/instance.rs @@ -3,7 +3,7 @@ use std::{ffi::CString, sync::Arc}; -use crate::{Error, FlowInfo, FlowReader, MxlFlowWriter, Result, api::MxlApiHandle}; +use crate::{Error, FlowInfo, FlowReader, FlowWriter, Result, api::MxlApiHandle}; /// This struct stores the context that is shared by all objects. /// It is separated out from `MxlInstance` so that it can be cloned @@ -87,7 +87,7 @@ impl MxlInstance { create_flow_reader(&self.context, flow_id) } - pub fn create_flow_writer(&self, flow_id: &str) -> Result { + pub fn create_flow_writer(&self, flow_id: &str) -> Result { let uuid = uuid::Uuid::parse_str(flow_id) .map_err(|_| Error::Other("Invalid flow ID format.".to_string()))?; let flow_id = CString::new(flow_id)?; @@ -104,7 +104,7 @@ impl MxlInstance { if writer.is_null() { return Err(Error::Other("Failed to create flow writer.".to_string())); } - Ok(MxlFlowWriter::new(self.context.clone(), writer, uuid)) + Ok(FlowWriter::new(self.context.clone(), writer, uuid)) } /// For now, we provide direct access to the MXL API for creating and diff --git a/rust/mxl/src/lib.rs b/rust/mxl/src/lib.rs index 44db333c..d33137f7 100644 --- a/rust/mxl/src/lib.rs +++ b/rust/mxl/src/lib.rs @@ -12,7 +12,7 @@ pub mod config; pub use api::{MxlApi, load_api}; pub use error::{Error, Result}; -pub use flow::{reader::FlowReader, writer::MxlFlowWriter, *}; +pub use flow::{reader::FlowReader, writer::FlowWriter, *}; pub use grain::{ data::*, reader::GrainReader, write_access::GrainWriteAccess, writer::GrainWriter, }; From 44c6dc123f676a67c1183a033eab20a652d908b7 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Thu, 2 Oct 2025 12:08:12 +0000 Subject: [PATCH 15/15] rust: remove mxl prefix from api function names Signed-off-by: Pedro Ferreira --- rust/mxl/src/api.rs | 121 ++++++++++++++------------- rust/mxl/src/flow/reader.rs | 4 +- rust/mxl/src/flow/writer.rs | 2 +- rust/mxl/src/grain/reader.rs | 6 +- rust/mxl/src/grain/write_access.rs | 6 +- rust/mxl/src/grain/writer.rs | 4 +- rust/mxl/src/instance.rs | 34 ++++---- rust/mxl/src/samples/reader.rs | 4 +- rust/mxl/src/samples/write_access.rs | 6 +- rust/mxl/src/samples/writer.rs | 4 +- 10 files changed, 98 insertions(+), 93 deletions(-) diff --git a/rust/mxl/src/api.rs b/rust/mxl/src/api.rs index fde080d5..35f70254 100644 --- a/rust/mxl/src/api.rs +++ b/rust/mxl/src/api.rs @@ -10,148 +10,157 @@ use crate::Result; #[derive(WrapperApi)] pub struct MxlApi { #[dlopen2_name = "mxlGetVersion"] - mxl_get_version: + get_version: unsafe extern "C" fn(out_version: *mut mxl_sys::mxlVersionType) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlCreateInstance"] - mxl_create_instance: unsafe extern "C" fn( - in_mxlDomain: *const std::os::raw::c_char, + create_instance: unsafe extern "C" fn( + in_mxl_domain: *const std::os::raw::c_char, in_options: *const std::os::raw::c_char, ) -> mxl_sys::mxlInstance, + #[dlopen2_name = "mxlGarbageCollectFlows"] - mxl_garbage_collect_flows: + garbage_collect_flows: unsafe extern "C" fn(in_instance: mxl_sys::mxlInstance) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlDestroyInstance"] - mxl_destroy_instance: - unsafe extern "C" fn(in_instance: mxl_sys::mxlInstance) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + destroy_instance: unsafe extern "C" fn(in_instance: mxl_sys::mxlInstance) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlCreateFlow"] - mxl_create_flow: unsafe extern "C" fn( + create_flow: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, - flowDef: *const std::os::raw::c_char, + flow_def: *const std::os::raw::c_char, options: *const std::os::raw::c_char, info: *mut mxl_sys::mxlFlowInfo, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlDestroyFlow"] - mxl_destroy_flow: unsafe extern "C" fn( + destroy_flow: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, - flowId: *const std::os::raw::c_char, + flow_id: *const std::os::raw::c_char, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] #[dlopen2_name = "mxlGetFlowDef"] - mxl_get_flow_def: unsafe extern "C" fn( + get_flow_def: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, - flowId: *const ::std::os::raw::c_char, + flow_id: *const ::std::os::raw::c_char, buffer: *mut ::std::os::raw::c_char, - bufferSize: *mut usize, + buffer_size: *mut usize, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] #[dlopen2_name = "mxlCreateFlowReader"] - mxl_create_flow_reader: unsafe extern "C" fn( + create_flow_reader: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, - flowId: *const std::os::raw::c_char, + flow_id: *const std::os::raw::c_char, options: *const std::os::raw::c_char, reader: *mut mxl_sys::mxlFlowReader, ) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlReleaseFlowReader"] - mxl_release_flow_reader: unsafe extern "C" fn( + release_flow_reader: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, reader: mxl_sys::mxlFlowReader, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlCreateFlowWriter"] - mxl_create_flow_writer: unsafe extern "C" fn( + create_flow_writer: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, - flowId: *const std::os::raw::c_char, + flow_id: *const std::os::raw::c_char, options: *const std::os::raw::c_char, writer: *mut mxl_sys::mxlFlowWriter, ) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlReleaseFlowWriter"] - mxl_release_flow_writer: unsafe extern "C" fn( + release_flow_writer: unsafe extern "C" fn( instance: mxl_sys::mxlInstance, writer: mxl_sys::mxlFlowWriter, ) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlFlowReaderGetInfo"] - mxl_flow_reader_get_info: unsafe extern "C" fn( + flow_reader_get_info: unsafe extern "C" fn( reader: mxl_sys::mxlFlowReader, info: *mut mxl_sys::mxlFlowInfo, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlFlowReaderGetGrain"] - mxl_flow_reader_get_grain: unsafe extern "C" fn( + flow_reader_get_grain: unsafe extern "C" fn( reader: mxl_sys::mxlFlowReader, index: u64, - timeoutNs: u64, + timeout_ns: u64, grain: *mut mxl_sys::mxlGrainInfo, payload: *mut *mut u8, ) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlFlowReaderGetGrainNonBlocking"] - mxl_flow_reader_get_grain_non_blocking: unsafe extern "C" fn( + flow_reader_get_grain_non_blocking: unsafe extern "C" fn( reader: mxl_sys::mxlFlowReader, index: u64, grain: *mut mxl_sys::mxlGrainInfo, payload: *mut *mut u8, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlFlowWriterOpenGrain"] - mxl_flow_writer_open_grain: unsafe extern "C" fn( + flow_writer_open_grain: unsafe extern "C" fn( writer: mxl_sys::mxlFlowWriter, index: u64, - grainInfo: *mut mxl_sys::mxlGrainInfo, + grain_info: *mut mxl_sys::mxlGrainInfo, payload: *mut *mut u8, ) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlFlowWriterCancelGrain"] - mxl_flow_writer_cancel_grain: + flow_writer_cancel_grain: unsafe extern "C" fn(writer: mxl_sys::mxlFlowWriter) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlFlowWriterCommitGrain"] - mxl_flow_writer_commit_grain: unsafe extern "C" fn( + flow_writer_commit_grain: unsafe extern "C" fn( writer: mxl_sys::mxlFlowWriter, grain: *const mxl_sys::mxlGrainInfo, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlFlowReaderGetSamples"] - mxl_flow_reader_get_samples: unsafe extern "C" fn( + flow_reader_get_samples: unsafe extern "C" fn( reader: mxl_sys::mxlFlowReader, index: u64, count: usize, - payloadBuffersSlices: *mut mxl_sys::mxlWrappedMultiBufferSlice, + payload_buffers_slices: *mut mxl_sys::mxlWrappedMultiBufferSlice, ) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlFlowWriterOpenSamples"] - mxl_flow_writer_open_samples: unsafe extern "C" fn( + flow_writer_open_samples: unsafe extern "C" fn( writer: mxl_sys::mxlFlowWriter, index: u64, count: usize, - payloadBuffersSlices: *mut mxl_sys::mxlMutableWrappedMultiBufferSlice, + payload_buffers_slices: *mut mxl_sys::mxlMutableWrappedMultiBufferSlice, ) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlFlowWriterCancelSamples"] - mxl_flow_writer_cancel_samples: + flow_writer_cancel_samples: unsafe extern "C" fn(writer: mxl_sys::mxlFlowWriter) -> mxl_sys::mxlStatus, + #[dlopen2_name = "mxlFlowWriterCommitSamples"] - mxl_flow_writer_commit_samples: + flow_writer_commit_samples: unsafe extern "C" fn(writer: mxl_sys::mxlFlowWriter) -> mxl_sys::mxlStatus, - #[allow(non_snake_case)] + #[dlopen2_name = "mxlGetCurrentIndex"] - mxl_get_current_index: unsafe extern "C" fn(editRate: *const mxl_sys::mxlRational) -> u64, - #[allow(non_snake_case)] + get_current_index: unsafe extern "C" fn(edit_rate: *const mxl_sys::mxlRational) -> u64, + #[dlopen2_name = "mxlGetNsUntilIndex"] - mxl_get_ns_until_index: - unsafe extern "C" fn(index: u64, editRate: *const mxl_sys::mxlRational) -> u64, - #[allow(non_snake_case)] + get_ns_until_index: + unsafe extern "C" fn(index: u64, edit_rate: *const mxl_sys::mxlRational) -> u64, + #[dlopen2_name = "mxlTimestampToIndex"] - mxl_timestamp_to_index: - unsafe extern "C" fn(editRate: *const mxl_sys::mxlRational, timestamp: u64) -> u64, - #[allow(non_snake_case)] + timestamp_to_index: + unsafe extern "C" fn(edit_rate: *const mxl_sys::mxlRational, timestamp: u64) -> u64, + #[dlopen2_name = "mxlIndexToTimestamp"] - mxl_index_to_timestamp: - unsafe extern "C" fn(editRate: *const mxl_sys::mxlRational, index: u64) -> u64, + index_to_timestamp: + unsafe extern "C" fn(edit_rate: *const mxl_sys::mxlRational, index: u64) -> u64, + #[dlopen2_name = "mxlSleepForNs"] - mxl_sleep_for_ns: unsafe extern "C" fn(ns: u64), + sleep_for_ns: unsafe extern "C" fn(ns: u64), + #[dlopen2_name = "mxlGetTime"] - mxl_get_time: unsafe extern "C" fn() -> u64, + get_time: unsafe extern "C" fn() -> u64, } pub type MxlApiHandle = Arc>; diff --git a/rust/mxl/src/flow/reader.rs b/rust/mxl/src/flow/reader.rs index 2461c55b..522f0eed 100644 --- a/rust/mxl/src/flow/reader.rs +++ b/rust/mxl/src/flow/reader.rs @@ -24,7 +24,7 @@ pub(crate) fn get_flow_info( ) -> Result { let mut flow_info: mxl_sys::mxlFlowInfo = unsafe { std::mem::zeroed() }; unsafe { - Error::from_status(context.api.mxl_flow_reader_get_info(reader, &mut flow_info))?; + Error::from_status(context.api.flow_reader_get_info(reader, &mut flow_info))?; } Ok(FlowInfo { value: flow_info }) } @@ -71,7 +71,7 @@ impl Drop for FlowReader { && let Err(err) = Error::from_status(unsafe { self.context .api - .mxl_release_flow_reader(self.context.instance, self.reader) + .release_flow_reader(self.context.instance, self.reader) }) { tracing::error!("Failed to release MXL flow reader: {:?}", err); diff --git a/rust/mxl/src/flow/writer.rs b/rust/mxl/src/flow/writer.rs index 0f7c6bca..1b80de58 100644 --- a/rust/mxl/src/flow/writer.rs +++ b/rust/mxl/src/flow/writer.rs @@ -83,7 +83,7 @@ impl Drop for FlowWriter { && let Err(err) = Error::from_status(unsafe { self.context .api - .mxl_release_flow_writer(self.context.instance, self.writer) + .release_flow_writer(self.context.instance, self.writer) }) { tracing::error!("Failed to release MXL flow writer: {:?}", err); diff --git a/rust/mxl/src/grain/reader.rs b/rust/mxl/src/grain/reader.rs index cc8d5ffb..e3d2946c 100644 --- a/rust/mxl/src/grain/reader.rs +++ b/rust/mxl/src/grain/reader.rs @@ -41,7 +41,7 @@ impl GrainReader { let timeout_ns = timeout.as_nanos() as u64; loop { unsafe { - Error::from_status(self.context.api.mxl_flow_reader_get_grain( + Error::from_status(self.context.api.flow_reader_get_grain( self.reader, index, timeout_ns, @@ -83,7 +83,7 @@ impl GrainReader { let mut grain_info: mxl_sys::mxlGrainInfo = unsafe { std::mem::zeroed() }; let mut payload_ptr: *mut u8 = std::ptr::null_mut(); unsafe { - Error::from_status(self.context.api.mxl_flow_reader_get_grain_non_blocking( + Error::from_status(self.context.api.flow_reader_get_grain_non_blocking( self.reader, index, &mut grain_info, @@ -124,7 +124,7 @@ impl GrainReader { Error::from_status(unsafe { self.context .api - .mxl_release_flow_reader(self.context.instance, reader) + .release_flow_reader(self.context.instance, reader) }) } } diff --git a/rust/mxl/src/grain/write_access.rs b/rust/mxl/src/grain/write_access.rs index c3469608..25dcb1e5 100644 --- a/rust/mxl/src/grain/write_access.rs +++ b/rust/mxl/src/grain/write_access.rs @@ -70,7 +70,7 @@ impl<'a> GrainWriteAccess<'a> { Error::from_status( self.context .api - .mxl_flow_writer_commit_grain(self.writer, &self.grain_info), + .flow_writer_commit_grain(self.writer, &self.grain_info), ) } } @@ -82,7 +82,7 @@ impl<'a> GrainWriteAccess<'a> { pub fn cancel(mut self) -> Result<()> { self.committed_or_canceled = true; - unsafe { Error::from_status(self.context.api.mxl_flow_writer_cancel_grain(self.writer)) } + unsafe { Error::from_status(self.context.api.flow_writer_cancel_grain(self.writer)) } } } @@ -90,7 +90,7 @@ impl<'a> Drop for GrainWriteAccess<'a> { fn drop(&mut self) { if !self.committed_or_canceled && let Err(error) = unsafe { - Error::from_status(self.context.api.mxl_flow_writer_cancel_grain(self.writer)) + Error::from_status(self.context.api.flow_writer_cancel_grain(self.writer)) } { error!("Failed to cancel grain write on drop: {:?}", error); diff --git a/rust/mxl/src/grain/writer.rs b/rust/mxl/src/grain/writer.rs index 85e2598d..e312627e 100644 --- a/rust/mxl/src/grain/writer.rs +++ b/rust/mxl/src/grain/writer.rs @@ -34,7 +34,7 @@ impl GrainWriter { let mut grain_info: mxl_sys::mxlGrainInfo = unsafe { std::mem::zeroed() }; let mut payload_ptr: *mut u8 = std::ptr::null_mut(); unsafe { - Error::from_status(self.context.api.mxl_flow_writer_open_grain( + Error::from_status(self.context.api.flow_writer_open_grain( self.writer, index, &mut grain_info, @@ -67,7 +67,7 @@ impl GrainWriter { Error::from_status(unsafe { self.context .api - .mxl_release_flow_writer(self.context.instance, writer) + .release_flow_writer(self.context.instance, writer) }) } } diff --git a/rust/mxl/src/instance.rs b/rust/mxl/src/instance.rs index e0d3374c..ae9a9110 100644 --- a/rust/mxl/src/instance.rs +++ b/rust/mxl/src/instance.rs @@ -27,7 +27,7 @@ impl InstanceContext { unsafe { let mut instance = std::ptr::null_mut(); std::mem::swap(&mut self.instance, &mut instance); - self.api.mxl_destroy_instance(self.instance) + self.api.destroy_instance(self.instance) }; Ok(()) } @@ -36,7 +36,7 @@ impl InstanceContext { impl Drop for InstanceContext { fn drop(&mut self) { if !self.instance.is_null() { - unsafe { self.api.mxl_destroy_instance(self.instance) }; + unsafe { self.api.destroy_instance(self.instance) }; } } } @@ -49,7 +49,7 @@ pub(crate) fn create_flow_reader( let options = CString::new("")?; let mut reader: mxl_sys::mxlFlowReader = std::ptr::null_mut(); unsafe { - Error::from_status(context.api.mxl_create_flow_reader( + Error::from_status(context.api.create_flow_reader( context.instance, flow_id.as_ptr(), options.as_ptr(), @@ -70,7 +70,7 @@ pub struct MxlInstance { impl MxlInstance { pub fn new(api: MxlApiHandle, domain: &str, options: &str) -> Result { let instance = unsafe { - api.mxl_create_instance( + api.create_instance( CString::new(domain)?.as_ptr(), CString::new(options)?.as_ptr(), ) @@ -94,7 +94,7 @@ impl MxlInstance { let options = CString::new("")?; let mut writer: mxl_sys::mxlFlowWriter = std::ptr::null_mut(); unsafe { - Error::from_status(self.context.api.mxl_create_flow_writer( + Error::from_status(self.context.api.create_flow_writer( self.context.instance, flow_id.as_ptr(), options.as_ptr(), @@ -116,7 +116,7 @@ impl MxlInstance { let mut info = std::mem::MaybeUninit::::uninit(); unsafe { - Error::from_status(self.context.api.mxl_create_flow( + Error::from_status(self.context.api.create_flow( self.context.instance, flow_def.as_ptr(), options.as_ptr(), @@ -135,7 +135,7 @@ impl MxlInstance { Error::from_status( self.context .api - .mxl_destroy_flow(self.context.instance, flow_id.as_ptr()), + .destroy_flow(self.context.instance, flow_id.as_ptr()), )?; } Ok(()) @@ -148,7 +148,7 @@ impl MxlInstance { let mut buffer_size = INITIAL_BUFFER_SIZE; let status = unsafe { - self.context.api.mxl_get_flow_def( + self.context.api.get_flow_def( self.context.instance, flow_id.as_ptr(), buffer.as_mut_ptr() as *mut std::os::raw::c_char, @@ -159,7 +159,7 @@ impl MxlInstance { if status == mxl_sys::MXL_ERR_INVALID_ARG && buffer_size > INITIAL_BUFFER_SIZE { buffer = vec![0; buffer_size]; unsafe { - Error::from_status(self.context.api.mxl_get_flow_def( + Error::from_status(self.context.api.get_flow_def( self.context.instance, flow_id.as_ptr(), buffer.as_mut_ptr() as *mut std::os::raw::c_char, @@ -180,7 +180,7 @@ impl MxlInstance { } pub fn get_current_index(&self, rational: &mxl_sys::mxlRational) -> u64 { - unsafe { self.context.api.mxl_get_current_index(rational) } + unsafe { self.context.api.get_current_index(rational) } } pub fn get_duration_until_index( @@ -188,7 +188,7 @@ impl MxlInstance { index: u64, rate: &mxl_sys::mxlRational, ) -> Result { - let duration_ns = unsafe { self.context.api.mxl_get_ns_until_index(index, rate) }; + let duration_ns = unsafe { self.context.api.get_ns_until_index(index, rate) }; if duration_ns == u64::MAX { Err(Error::Other(format!( "Failed to get duration until index, invalid rate {}/{}.", @@ -201,7 +201,7 @@ impl MxlInstance { /// TODO: Make timestamp a strong type. pub fn timestamp_to_index(&self, timestamp: u64, rate: &mxl_sys::mxlRational) -> Result { - let index = unsafe { self.context.api.mxl_timestamp_to_index(rate, timestamp) }; + let index = unsafe { self.context.api.timestamp_to_index(rate, timestamp) }; if index == u64::MAX { Err(Error::Other(format!( "Failed to convert timestamp to index, invalid rate {}/{}.", @@ -213,7 +213,7 @@ impl MxlInstance { } pub fn index_to_timestamp(&self, index: u64, rate: &mxl_sys::mxlRational) -> Result { - let timestamp = unsafe { self.context.api.mxl_index_to_timestamp(rate, index) }; + let timestamp = unsafe { self.context.api.index_to_timestamp(rate, index) }; if timestamp == u64::MAX { Err(Error::Other(format!( "Failed to convert index to timestamp, invalid rate {}/{}.", @@ -225,15 +225,11 @@ impl MxlInstance { } pub fn sleep_for(&self, duration: std::time::Duration) { - unsafe { - self.context - .api - .mxl_sleep_for_ns(duration.as_nanos() as u64) - } + unsafe { self.context.api.sleep_for_ns(duration.as_nanos() as u64) } } pub fn get_time(&self) -> u64 { - unsafe { self.context.api.mxl_get_time() } + unsafe { self.context.api.get_time() } } /// This function forces the destruction of the MXL instance. diff --git a/rust/mxl/src/samples/reader.rs b/rust/mxl/src/samples/reader.rs index 9c31d7e6..4ad387c0 100644 --- a/rust/mxl/src/samples/reader.rs +++ b/rust/mxl/src/samples/reader.rs @@ -34,7 +34,7 @@ impl SamplesReader { pub fn get_samples(&self, index: u64, count: usize) -> Result> { let mut buffer_slice: mxl_sys::mxlWrappedMultiBufferSlice = unsafe { std::mem::zeroed() }; unsafe { - Error::from_status(self.context.api.mxl_flow_reader_get_samples( + Error::from_status(self.context.api.flow_reader_get_samples( self.reader, index, count, @@ -55,7 +55,7 @@ impl SamplesReader { Error::from_status(unsafe { self.context .api - .mxl_release_flow_reader(self.context.instance, reader) + .release_flow_reader(self.context.instance, reader) }) } } diff --git a/rust/mxl/src/samples/write_access.rs b/rust/mxl/src/samples/write_access.rs index 5b43c53e..53672036 100644 --- a/rust/mxl/src/samples/write_access.rs +++ b/rust/mxl/src/samples/write_access.rs @@ -40,7 +40,7 @@ impl<'a> SamplesWriteAccess<'a> { pub fn commit(mut self) -> crate::Result<()> { self.committed_or_canceled = true; - unsafe { Error::from_status(self.context.api.mxl_flow_writer_commit_samples(self.writer)) } + unsafe { Error::from_status(self.context.api.flow_writer_commit_samples(self.writer)) } } /// Please note that the behavior of canceling samples writing is dependent on the behavior @@ -50,7 +50,7 @@ impl<'a> SamplesWriteAccess<'a> { pub fn cancel(mut self) -> crate::Result<()> { self.committed_or_canceled = true; - unsafe { Error::from_status(self.context.api.mxl_flow_writer_cancel_samples(self.writer)) } + unsafe { Error::from_status(self.context.api.flow_writer_cancel_samples(self.writer)) } } pub fn channels(&self) -> usize { @@ -87,7 +87,7 @@ impl<'a> Drop for SamplesWriteAccess<'a> { fn drop(&mut self) { if !self.committed_or_canceled && let Err(error) = unsafe { - Error::from_status(self.context.api.mxl_flow_writer_cancel_samples(self.writer)) + Error::from_status(self.context.api.flow_writer_cancel_samples(self.writer)) } { error!("Failed to cancel grain write on drop: {:?}", error); diff --git a/rust/mxl/src/samples/writer.rs b/rust/mxl/src/samples/writer.rs index ecc455b4..c8f6996b 100644 --- a/rust/mxl/src/samples/writer.rs +++ b/rust/mxl/src/samples/writer.rs @@ -28,7 +28,7 @@ impl SamplesWriter { let mut buffer_slice: mxl_sys::mxlMutableWrappedMultiBufferSlice = unsafe { std::mem::zeroed() }; unsafe { - Error::from_status(self.context.api.mxl_flow_writer_open_samples( + Error::from_status(self.context.api.flow_writer_open_samples( self.writer, index, count, @@ -53,7 +53,7 @@ impl SamplesWriter { Error::from_status(unsafe { self.context .api - .mxl_release_flow_writer(self.context.instance, writer) + .release_flow_writer(self.context.instance, writer) }) } }