Skip to content

Allow the user to choose the MI_SECURE level themselves #158

@chirizxc

Description

@chirizxc

https://github.com/microsoft/mimalloc/blob/dev3/include/mimalloc/types.h#L57-L62
https://github.com/microsoft/mimalloc/blob/dev2/include/mimalloc/types.h#L57-L62

The new versions also include MI_SECURE 5

[features]
secure = []  # secure_level_4 = []
secure_level_1 = []
secure_level_2 = []
secure_level_3 = []
secure_level_4 = []
secure_level_5 = []
  if env::var_os("CARGO_FEATURE_SECURE").is_some() {
      build.define("MI_SECURE", "4");
+ } else if let Some(secure_level) = secure_level() {
+    build.define("MI_SECURE", secure_level);
+ }

+ fn secure_level() -> Option<&'static str> {
+     let levels = [
+         ("CARGO_FEATURE_SECURE_LEVEL_1", "1"),
+         ("CARGO_FEATURE_SECURE_LEVEL_2", "2"),
+         ("CARGO_FEATURE_SECURE_LEVEL_3", "3"),
+         ("CARGO_FEATURE_SECURE_LEVEL_4", "4"),
+         ("CARGO_FEATURE_SECURE_LEVEL_5", "5"),
+     ];
+ 
+     let enabled: Vec<_> = levels
+         .iter()
+         .filter(|(env_var, _)| env::var_os(env_var).is_some())
+         .collect();
+ 
+     if env::var_os("CARGO_FEATURE_SECURE").is_some() && !enabled.is_empty() {
+         panic!("feature `secure` cannot be combined with `secure_level_*` features");
+     }
+ 
+     if enabled.len() > 1 {
+         panic!("multiple secure levels enabled at once");
+     }
+ 
+     enabled.first().map(|(_, level)| *level)
+ }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions