Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(c-api) Introduce the middleware (specifically metering) C API #2103

Merged
merged 37 commits into from
Mar 5, 2021
Merged
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
197d0f7
Initial commit of C API for metering and middleware.
nlewycky Feb 9, 2021
d660943
feat(c-api) Simplify `&Box<T>` to `&T`.
Hywan Mar 1, 2021
2bc502b
fix(c-api) Move the middleware API into the `unstable` module.
Hywan Mar 1, 2021
fd5a9b5
chore(c-api) Update headers.
Hywan Mar 1, 2021
cbbdfda
temp
Hywan Mar 1, 2021
0f43391
Merge branch 'master' into feature/metering-c-api
Hywan Mar 1, 2021
db4286d
fix(c-api) Fix merge conflict.
Hywan Mar 1, 2021
8b30ae9
feat(c-api) Add `_delete` and rename `_value` to `wasmer_metering_poi…
Hywan Mar 1, 2021
cb02694
test(c-api) Add tests for the `wasmer_metering_*` API.
Hywan Mar 1, 2021
3b0572f
feat(makefile) Test the C API with the `middlewares` feature.
Hywan Mar 1, 2021
e67fd6a
feat(c-api) Update headers + add the `MIDDLEWARES_FEATURE_AS_C_DEFINE…
Hywan Mar 1, 2021
8f1a4f3
feat(c-api) Add `wasmer_metering_delete`.
Hywan Mar 1, 2021
fb973b2
fix(c-api) `wasmer_module_middleware_t` is an opaque type.
Hywan Mar 2, 2021
31669b8
feat(c-api) Rename `wasmer_module_middleware_t` to `wasmer_middleware…
Hywan Mar 2, 2021
798dd88
feat(c-api) Simplify a compilation condition.
Hywan Mar 2, 2021
e014807
doc(middlewares) Format.
Hywan Mar 2, 2021
19c0412
doc(c-api) Write more documentation and tests.
Hywan Mar 2, 2021
0c4e063
chore(c-api) Update headers.
Hywan Mar 2, 2021
902f58e
!tmp
Hywan Mar 2, 2021
487c964
feat(middleware) Relax `F` in `Metering<F>` by removing `Clone` and `…
Hywan Mar 4, 2021
7780423
feat(c-api) `wasmer_metering_t` contains a closure to the cost function.
Hywan Mar 4, 2021
e2c4f1e
feat(c-api) Rename `Operator` to `wasmer_parser_operator_t`.
Hywan Mar 4, 2021
0163b33
test(c-api) Update the test to use a custom user-defined cost function.
Hywan Mar 4, 2021
e7c78e7
test(c-api) Update tests for the metering API.
Hywan Mar 4, 2021
072066a
Merge branch 'master' into feature/metering-c-api
Hywan Mar 4, 2021
f0024c5
doc(c-api) Fix typos.
Hywan Mar 4, 2021
4f2ba72
feat(c-api) Simplify the metering API.
Hywan Mar 4, 2021
f233ca4
chore(api) The `compiler` feature enables `wasmer-compiler/translator`.
Hywan Mar 4, 2021
df0bdeb
fix(makefile) `build-capi` includes the `middlewares` feature.
Hywan Mar 4, 2021
2d20f44
fix(c-api) Remove useless `unsafe` marker.
Hywan Mar 4, 2021
4136536
Merge branch 'master' into feature/metering-c-api
Hywan Mar 4, 2021
96524b5
chore(c-api) Update headers.
Hywan Mar 4, 2021
8517547
fix(engine-native) Fix Cargo.lock and `Library::new` is unsafe.
Hywan Mar 4, 2021
1700c2d
feat(c-api) Return ~1 if metering are exhausted. Add `wasmer_metering…
Hywan Mar 4, 2021
06a00d9
doc(c-api) Update documentation for clarity.
Hywan Mar 4, 2021
d3f7b7e
chore(c-api) Change `operator` to `wasm_operator` (reserved keyword i…
Hywan Mar 4, 2021
21ea09f
chore(c-api) Fix merge conflicts.
Hywan Mar 5, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 4 additions & 24 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 20 additions & 20 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -387,59 +387,59 @@ build-docs-capi:

build-capi:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,native,object-file,wasi $(capi_default_features) $(capi_compiler_features)
--no-default-features --features deprecated,wat,jit,native,object-file,wasi,middlewares $(capi_default_features) $(capi_compiler_features)

build-capi-singlepass:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,native,object-file,singlepass,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,native,object-file,singlepass,wasi,middlewares $(capi_default_features)

build-capi-singlepass-jit:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,singlepass,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,singlepass,wasi,middlewares $(capi_default_features)

build-capi-singlepass-native:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,native,singlepass,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,native,singlepass,wasi,middlewares $(capi_default_features)

build-capi-singlepass-object-file:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,object-file,singlepass,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,object-file,singlepass,wasi,middlewares $(capi_default_features)

build-capi-cranelift:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,native,object-file,cranelift,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,native,object-file,cranelift,wasi,middlewares $(capi_default_features)

build-capi-cranelift-system-libffi:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,native,object-file,cranelift,wasi,system-libffi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,native,object-file,cranelift,wasi,middlewares,system-libffi $(capi_default_features)

build-capi-cranelift-jit:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,cranelift,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,cranelift,wasi,middlewares $(capi_default_features)

build-capi-cranelift-native:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,native,cranelift,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,native,cranelift,wasi,middlewares $(capi_default_features)

build-capi-cranelift-object-file:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,native,object-file,cranelift,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,native,object-file,cranelift,wasi,middlewares $(capi_default_features)

build-capi-llvm:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,native,object-file,llvm,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,native,object-file,llvm,wasi,middlewares $(capi_default_features)

build-capi-llvm-jit:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,llvm,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,jit,llvm,wasi,middlewares $(capi_default_features)

build-capi-llvm-native:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,native,llvm,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,native,llvm,wasi,middlewares $(capi_default_features)

build-capi-llvm-object-file:
cargo build --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,object-file,llvm,wasi $(capi_default_features)
--no-default-features --features deprecated,wat,object-file,llvm,wasi,middlewares $(capi_default_features)

# Headless (we include the minimal to be able to run)

Expand Down Expand Up @@ -529,27 +529,27 @@ test-capi: $(foreach compiler_engine,$(compilers_engines),test-capi-$(compiler_e

test-capi-all: build-capi
cargo test --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,native,object-file,wasi $(capi_default_features) $(capi_compiler_features) -- --nocapture
--no-default-features --features deprecated,wat,jit,native,object-file,wasi,middlewares $(capi_default_features) $(capi_compiler_features) -- --nocapture

test-capi-singlepass-jit: build-capi-singlepass-jit test-capi-tests
cargo test --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,singlepass,wasi $(capi_default_features) -- --nocapture
--no-default-features --features deprecated,wat,jit,singlepass,wasi,middlewares $(capi_default_features) -- --nocapture

test-capi-cranelift-jit: build-capi-cranelift-jit test-capi-tests
cargo test --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,cranelift,wasi $(capi_default_features) -- --nocapture
--no-default-features --features deprecated,wat,jit,cranelift,wasi,middlewares $(capi_default_features) -- --nocapture

test-capi-cranelift-native: build-capi-cranelift-native test-capi-tests
cargo test --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,native,cranelift,wasi $(capi_default_features) -- --nocapture
--no-default-features --features deprecated,wat,native,cranelift,wasi,middlewares $(capi_default_features) -- --nocapture

test-capi-llvm-jit: build-capi-llvm-jit test-capi-tests
cargo test --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,jit,llvm,wasi $(capi_default_features) -- --nocapture
--no-default-features --features deprecated,wat,jit,llvm,wasi,middlewares $(capi_default_features) -- --nocapture

test-capi-llvm-native: build-capi-llvm-native test-capi-tests
cargo test --manifest-path lib/c-api/Cargo.toml --release \
--no-default-features --features deprecated,wat,native,llvm,wasi $(capi_default_features) -- --nocapture
--no-default-features --features deprecated,wat,native,llvm,wasi,middlewares $(capi_default_features) -- --nocapture

test-capi-tests: package-capi
# Test the Wasmer C API tests for C
Expand Down
1 change: 1 addition & 0 deletions lib/api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ maintenance = { status = "actively-developed" }
[features]
default = ["wat", "default-cranelift", "default-jit"]
compiler = [
"wasmer-compiler/translator",
"wasmer-engine-jit/compiler",
"wasmer-engine-native/compiler",
]
Expand Down
5 changes: 4 additions & 1 deletion lib/c-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ crate-type = ["cdylib", "rlib", "staticlib"]

[dependencies]
wasmer = { version = "1.0.2", path = "../api", default-features = false }
wasmer-compiler = { version = "1.0.2", path = "../compiler" }
wasmer-compiler-cranelift = { version = "1.0.2", path = "../compiler-cranelift", optional = true }
wasmer-compiler-singlepass = { version = "1.0.2", path = "../compiler-singlepass", optional = true }
wasmer-compiler-llvm = { version = "1.0.2", path = "../compiler-llvm", optional = true }
Expand All @@ -25,6 +24,7 @@ wasmer-engine = { version = "1.0.2", path = "../engine" }
wasmer-engine-jit = { version = "1.0.2", path = "../engine-jit", optional = true }
wasmer-engine-native = { version = "1.0.2", path = "../engine-native", optional = true }
wasmer-engine-object-file = { version = "1.0.2", path = "../engine-object-file", optional = true }
wasmer-middlewares = { version = "1.0.2", path = "../middlewares", optional = true }
wasmer-wasi = { version = "1.0.2", path = "../wasi", optional = true }
wasmer-types = { version = "1.0.2", path = "../wasmer-types" }
enumset = "1.0"
Expand All @@ -47,10 +47,12 @@ default = [
"cranelift",
"jit",
"wasi",
"middlewares",
]
wat = ["wasmer/wat"]
wasi = ["wasmer-wasi", "typetag", "serde"]
engine = []
middlewares = ["wasmer-middlewares"]
deprecated = ["libffi"]
jit = [
"wasmer-engine-jit",
Expand All @@ -65,6 +67,7 @@ object-file = [
"engine",
]
compiler = [
"wasmer/compiler",
"wasmer-engine-jit/compiler",
"wasmer-engine-native/compiler",
"wasmer-engine-object-file/compiler"
Expand Down
35 changes: 35 additions & 0 deletions lib/c-api/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ const COMPILER_FEATURE_AS_C_DEFINE: &'static str = "WASMER_COMPILER_ENABLED";
#[allow(unused)]
const WASI_FEATURE_AS_C_DEFINE: &'static str = "WASMER_WASI_ENABLED";

#[allow(unused)]
const MIDDLEWARES_FEATURE_AS_C_DEFINE: &'static str = "WASMER_MIDDLEWARES_ENABLED";

#[allow(unused)]
const EMSCRIPTEN_FEATURE_AS_C_DEFINE: &'static str = "WASMER_EMSCRIPTEN_ENABLED";

Expand Down Expand Up @@ -135,6 +138,7 @@ fn build_wasm_c_api_headers(crate_dir: &str, out_dir: &str) {
map_feature_as_c_define!("jit", JIT_FEATURE_AS_C_DEFINE, pre_header);
map_feature_as_c_define!("compiler", COMPILER_FEATURE_AS_C_DEFINE, pre_header);
map_feature_as_c_define!("wasi", WASI_FEATURE_AS_C_DEFINE, pre_header);
map_feature_as_c_define!("middlewares", MIDDLEWARES_FEATURE_AS_C_DEFINE, pre_header);
map_feature_as_c_define!("emscripten", EMSCRIPTEN_FEATURE_AS_C_DEFINE, pre_header);

add_wasmer_version(&mut pre_header);
Expand Down Expand Up @@ -467,10 +471,33 @@ fn exclude_items_from_wasm_c_api(builder: Builder) -> Builder {
.exclude_item("wasi_get_unordered_imports")
.exclude_item("wasi_get_wasi_version")
.exclude_item("wasi_version_t")
.exclude_item("wasm_config_push_middleware")
.exclude_item("wasm_config_set_compiler")
.exclude_item("wasm_config_set_engine")
.exclude_item("wasm_config_set_features")
.exclude_item("wasm_config_set_target")
.exclude_item("wasm_cpu_features_add")
.exclude_item("wasm_cpu_features_delete")
.exclude_item("wasm_cpu_features_new")
.exclude_item("wasm_cpu_features_t")
.exclude_item("wasm_module_name")
.exclude_item("wasm_module_set_name")
.exclude_item("wasm_named_extern_module")
.exclude_item("wasm_named_extern_name")
.exclude_item("wasm_named_extern_t")
.exclude_item("wasm_named_extern_unwrap")
.exclude_item("wasm_named_extern_vec_copy")
.exclude_item("wasm_named_extern_vec_delete")
.exclude_item("wasm_named_extern_vec_new")
.exclude_item("wasm_named_extern_vec_new_empty")
.exclude_item("wasm_named_extern_vec_new_uninitialized")
.exclude_item("wasm_target_delete")
.exclude_item("wasm_target_new")
.exclude_item("wasm_target_t")
.exclude_item("wasm_triple_delete")
.exclude_item("wasm_triple_new")
.exclude_item("wasm_triple_new_from_host")
.exclude_item("wasm_triple_t")
Hywan marked this conversation as resolved.
Show resolved Hide resolved
.exclude_item("wasmer_compiler_t")
.exclude_item("wasmer_cpu_features_add")
.exclude_item("wasmer_cpu_features_delete")
Expand All @@ -492,6 +519,14 @@ fn exclude_items_from_wasm_c_api(builder: Builder) -> Builder {
.exclude_item("wasmer_is_compiler_available")
.exclude_item("wasmer_is_engine_available")
.exclude_item("wasmer_is_headless")
.exclude_item("wasmer_metering_as_middleware")
.exclude_item("wasmer_metering_delete")
.exclude_item("wasmer_metering_get_remaining_points")
.exclude_item("wasmer_metering_new")
.exclude_item("wasmer_metering_points_are_exhausted")
.exclude_item("wasmer_metering_set_remaining_points")
.exclude_item("wasmer_metering_t")
.exclude_item("wasmer_middleware_t")
.exclude_item("wasmer_module_name")
.exclude_item("wasmer_module_set_name")
.exclude_item("wasmer_named_extern_module")
Expand Down
15 changes: 13 additions & 2 deletions lib/c-api/src/wasm_c_api/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ pub use super::unstable::engine::{
wasmer_is_engine_available,
};
use super::unstable::features::wasmer_features_t;
#[cfg(feature = "middlewares")]
pub use super::unstable::middlewares::wasm_config_push_middleware;
#[cfg(feature = "middlewares")]
use super::unstable::middlewares::wasmer_middleware_t;
use super::unstable::target_lexicon::wasmer_target_t;
use crate::error::{update_last_error, CApiError};
use cfg_if::cfg_if;
Expand Down Expand Up @@ -99,6 +103,8 @@ pub struct wasm_config_t {
engine: wasmer_engine_t,
#[cfg(feature = "compiler")]
compiler: wasmer_compiler_t,
#[cfg(feature = "middlewares")]
pub(super) middlewares: Vec<wasmer_middleware_t>,
pub(super) features: Option<Box<wasmer_features_t>>,
pub(super) target: Option<Box<wasmer_target_t>>,
}
Expand Down Expand Up @@ -280,7 +286,7 @@ pub struct wasm_engine_t {

// Compiler JIT
#[cfg(feature = "compiler")]
use wasmer_compiler::CompilerConfig;
use wasmer::CompilerConfig;
#[cfg(feature = "compiler")]
fn get_default_compiler_config() -> Box<dyn CompilerConfig> {
cfg_if! {
Expand Down Expand Up @@ -334,7 +340,7 @@ cfg_if! {
/// cbindgen:ignore
#[no_mangle]
pub extern "C" fn wasm_engine_new() -> Box<wasm_engine_t> {
let mut compiler_config: Box<dyn CompilerConfig> = get_default_compiler_config();
let compiler_config: Box<dyn CompilerConfig> = get_default_compiler_config();
let engine: Arc<dyn Engine + Send + Sync> = Arc::new(Native::new(compiler_config).engine());
Box::new(wasm_engine_t { inner: engine })
}
Expand Down Expand Up @@ -471,6 +477,11 @@ pub extern "C" fn wasm_engine_new_with_config(
},
};

#[cfg(feature = "middlewares")]
for middleware in config.middlewares {
compiler_config.push_middleware(middleware.inner);
}

let inner: Arc<dyn Engine + Send + Sync> = match config.engine {
wasmer_engine_t::JIT => {
cfg_if! {
Expand Down
Loading