Message passing based allocator
Перейти к файлу
David Chisnall 2ee3ba59ee Use VirtualAlloc2 on Windows.
The newer API (Windows 10 and newer) allows the allocator to ask for
strongly aligned memory.

This is enabled only if the `WINVER` macro is set to target Windows 10
or newer.  There is now a CMake option to target older versions of
Windows, so we can test both code paths.

The Azure Pipelines config now includes a test of the compatibility
version.  This runs only the release build, because it's mainly there as
a sanity check - 99% of the code is the same as the default Windows
config.
2019-02-20 17:36:39 +01:00
src Use VirtualAlloc2 on Windows. 2019-02-20 17:36:39 +01:00
.clang-format Initial commit of snmalloc 2019-01-15 14:17:55 +00:00
.gitignore Initial commit of snmalloc 2019-01-15 14:17:55 +00:00
CMakeLists.txt Use VirtualAlloc2 on Windows. 2019-02-20 17:36:39 +01:00
LICENSE Initial commit 2019-01-09 06:05:57 -08:00
README.md Update README.md 2019-01-16 17:19:22 +00:00
azure-pipelines.yml Use VirtualAlloc2 on Windows. 2019-02-20 17:36:39 +01:00
check-format.sh Initial commit of snmalloc 2019-01-15 14:17:55 +00:00

README.md

snmalloc

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.

Build Status

Building on Windows

The Windows build currently depends on Visual Studio 2017. To build with Visual Studio:

mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" ..
cmake --build . --config Debug
cmake --build . --config Release
cmake --build . --config RelWithDebInfo

You can also omit the last three steps and build from the IDE. Visual Studio builds use a separate directory to keep the binaries for each build configuration.

Alternatively, you can follow the steps in the next section to build with Ninja using the Visual Studio compiler.

Building on Linux or FreeBSD

Snmalloc has very few dependencies, CMake, Ninja, Clang 6.0 or later and a C++17 standard library. Building with GCC is currently not supported because GCC lacks support for the selectany attribute to specify variables in a COMDAT.

To build a debug configuration:

mkdir build
cd build
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Debug
ninja

To build a release configuration:

mkdir build
cd build
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release
ninja

To build with optimizations on, but with debug information:

mkdir build
cd build
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
ninja

The build produces a binary libsnmallocshim.so. This file can be LD_PRELOADed to use the allocator in place of the system allocator, for example, you can run the build script using the snmalloc as the allocator for your toolchain:

LD_PRELOAD=/usr/local/lib/libsnmallocshim.so ninja

CMake Feature Flags

These can be added to your cmake command line.

-DUSE_SNMALLOC_STATS=ON // Track allocation stats
-DUSE_MEASURE=ON // Measure performance with histograms

Contributing

This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.

When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.