37 releases

Uses new Rust 2021

0.3.3 Jun 17, 2022
0.3.0 May 31, 2022
0.3.0-beta.1+f1be609 Jan 30, 2022
0.2.28 Oct 11, 2021
0.2.8 Mar 21, 2020

#22 in Memory management

Download history 1066/week @ 2022-03-11 1534/week @ 2022-03-18 1004/week @ 2022-03-25 987/week @ 2022-04-01 996/week @ 2022-04-08 627/week @ 2022-04-15 975/week @ 2022-04-22 1172/week @ 2022-04-29 1148/week @ 2022-05-06 1531/week @ 2022-05-13 876/week @ 2022-05-20 2118/week @ 2022-05-27 1935/week @ 2022-06-03 1584/week @ 2022-06-10 1965/week @ 2022-06-17 1750/week @ 2022-06-24

7,645 downloads per month
Used in 5 crates (2 directly)

MIT license

3.5MB
4K SLoC

C++ 4K SLoC // 0.1% comments Rust 340 SLoC // 0.0% comments

snmalloc-rs

Notice: MinGW Build is broken and may not be fixed in a near future. See this PR in the upstream.

MSVC/MinGW/Linux/MacOS: Actions Status

FreeBSD: Build Status

snmalloc-rs provides a wrapper for microsoft/snmalloc to make it usable as a global allocator for rust. snmalloc is a research allocator. Its key design features are:

  • Memory that is freed by the same thread that allocated it does not require any synchronising operations.
  • Freeing memory in a different thread to initially allocated it, does not take any locks and instead uses a novel message passing scheme to return the memory to the original allocator, where it is recycled.
  • The allocator uses large ranges of pages to reduce the amount of meta-data required.

Some old benchmark results are available in the snmalloc paper. Some recent benchmark results are listed at bench_suite. There are three features defined in this crate:

  • debug: Enable the Debug mode in snmalloc.
  • 1mib: Use the 1mib chunk configuration. From 0.2.17, this is set as a default feature (removed since 0.3.0)
  • 16mib: Use the 16mib chunk configuration. (removed since 0.3.0)
  • cache-friendly: Make the allocator more cache friendly (setting CACHE_FRIENDLY_OFFSET to 64 in building the library). (removed since 0.3.0)
  • native-cpu: Optimize snmalloc for the native CPU of the host machine. (this is not a default behavior since 0.2.14)
  • qemu: Workaround madvise problem of QEMU environment
  • stats: Enable statistics (removed since 0.3.0)
  • local_dynamic_tls: Workaround cannot allocate memory in static tls block
  • build_cc: Use of cc crate instead of cmake (cmake still default) as builder (more platform agnostic)
  • usecxx20: Enable C++20 standard if available (removed since 0.3.0)
  • usecxx17: Use C++17 standard
  • check: Enable extra checks to improve security, see upstream security docs. Note that the memcpy protection is not enabled in Rust.
  • win8compat: Improve compatibility for old Windows platforms (removing usages of VirtualAlloc2 and other new APIs)

To get the crates compiled, you need to choose either 1mib or 16mib to determine the chunk configuration

To use snmalloc-rs add it as a dependency:

# Cargo.toml
[dependencies]
snmalloc-rs = "0.3.0"

To set SnMalloc as the global allocator add this to your project:

#[global_allocator]
static ALLOC: snmalloc_rs::SnMalloc = snmalloc_rs::SnMalloc;

For MinGW Users

mingw version is only tested on nightly branch with MSYS environment. We are using dynamic linking method. Hence, please make sure the following libs are in your PATH:

  • winpthread
  • atomic
  • stdc++
  • gcc_s

Notice: since version 0.2.12, we no longer require you to provide additional environment variables for mingw target.

For Android Cross-Compilation

  • ANDROID_NDK must be provided as an environment variable
  • ANDROID_PLATFORM can be passed as an optional environment variable
  • ANDROID_ABI used by CMake is detected automatically
  • feature android-lld can be used to set the linker of snmalloc to lld
  • feature android-shared-std can be used to set the STL library of snmalloc to c++_shared (it uses c++_static by default) (libstdc++ is no longer a dependency)

Changelog

0.3.0

  • Release to support snmalloc 0.6.0.

0.3.0-beta.1

  • Beta release to support snmalloc 2 0.6.0

0.2.28

  • Deprecation of cache-friendly
  • Use exposed alloc_zeroed from snmalloc
  • upstream changes of remote communication, corruption detection and compilation flag detection.

0.2.27

  • Reduction of libc dependency
  • upstream Windows 7 and windows 8 compatibility added
  • upstream Option to use C++20 standards if available
  • upstream Preparations of cherification (heavy refactors of the structure)
  • upstream Cold routine annotations

for older versions, see CHANGELOG

No runtime deps