Squashed 'deps/memkind/src/' content from commit bb9f19dd1
git-subtree-dir: deps/memkind/src git-subtree-split: bb9f19dd1b3ed6cc5e1b35919564ccf6f4b32f69
This commit is contained in:
commit
09a263e607
113
.gitignore
vendored
Normal file
113
.gitignore
vendored
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
.cproject
|
||||||
|
.project
|
||||||
|
autom4te.cache/
|
||||||
|
*.a
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
.deps/
|
||||||
|
.dirstamp
|
||||||
|
.libs/
|
||||||
|
/aclocal.m4
|
||||||
|
/ar-lib
|
||||||
|
/compile
|
||||||
|
/config.guess
|
||||||
|
/config.h
|
||||||
|
/config.h.in
|
||||||
|
/config.log
|
||||||
|
/config.status
|
||||||
|
/config.sub
|
||||||
|
/configure
|
||||||
|
/depcomp
|
||||||
|
/config_tls.h
|
||||||
|
/install-sh
|
||||||
|
/libtool
|
||||||
|
/ltmain.sh
|
||||||
|
/m4/
|
||||||
|
/memkind-*.spec
|
||||||
|
/memkind-*.tar.gz
|
||||||
|
/Makefile
|
||||||
|
/Makefile.in
|
||||||
|
/missing
|
||||||
|
/stamp-h1
|
||||||
|
/stamp-h2
|
||||||
|
/jemalloc/obj/
|
||||||
|
/jemalloc/configure
|
||||||
|
/src/memkind_defines.h.in
|
||||||
|
/test/all_tests
|
||||||
|
/test/.deps/
|
||||||
|
/test/.dirstamp
|
||||||
|
/test/.libs/
|
||||||
|
/test/*.o
|
||||||
|
/test/performance/.deps/
|
||||||
|
/test/*.so
|
||||||
|
/test/check.sh.log
|
||||||
|
/test/check.sh.trs
|
||||||
|
/test-suite.log
|
||||||
|
/VERSION
|
||||||
|
/examples/.deps/
|
||||||
|
/examples/.dirstamp
|
||||||
|
/examples/.libs/
|
||||||
|
/examples/*.o
|
||||||
|
/examples/*.lo
|
||||||
|
/examples/*.la
|
||||||
|
/memkind-hbw-nodes
|
||||||
|
/test/allocator_perf_tool_tests
|
||||||
|
/test/autohbw_candidates
|
||||||
|
/test/locality_test
|
||||||
|
/test/decorator_test
|
||||||
|
/test/eratosthenes
|
||||||
|
/test/environerr_hbw_malloc_test
|
||||||
|
/test/environerr_test
|
||||||
|
/test/freeing_memory_segfault_test
|
||||||
|
/test/filter_memkind
|
||||||
|
/test/gb_page_tests_bind_policy
|
||||||
|
/test/hello_hbw
|
||||||
|
/test/hello_memkind
|
||||||
|
/test/hello_memkind_debug
|
||||||
|
/test/mallocerr_test
|
||||||
|
/test/memkind_allocated
|
||||||
|
/test/new_kind
|
||||||
|
/test/perf_tool
|
||||||
|
/test/pmem_kinds
|
||||||
|
/test/pmem_malloc
|
||||||
|
/test/pmem_malloc_unlimited
|
||||||
|
/test/pmem_usable_size
|
||||||
|
/test/pmem_alignment
|
||||||
|
/test/pmem_and_default_kind
|
||||||
|
/test/pmem_multithreads
|
||||||
|
/test/pmem_multithreads_onekind
|
||||||
|
/test/pmem_free_with_unknown_kind
|
||||||
|
/test/pmem_cpp_allocator
|
||||||
|
/test/schedcpu_test
|
||||||
|
/test/tieddisterr_test
|
||||||
|
/test/alloc_benchmark_glibc
|
||||||
|
/test/alloc_benchmark_hbw
|
||||||
|
/test/alloc_benchmark_tbb
|
||||||
|
/test/alloc_benchmark_pmem
|
||||||
|
/test/autohbw_test_helper
|
||||||
|
/test/environ_err_hbw_malloc_test
|
||||||
|
/test/trace_mechanism_test_helper
|
||||||
|
/examples/autohbw_candidates
|
||||||
|
/examples/eratosthenes
|
||||||
|
/examples/filter_memkind
|
||||||
|
/examples/hello_hbw
|
||||||
|
/examples/hello_memkind
|
||||||
|
/examples/hello_memkind_debug
|
||||||
|
/examples/memkind_allocated
|
||||||
|
/examples/new_kind
|
||||||
|
/examples/numakind_test
|
||||||
|
/examples/numakind_macro.h
|
||||||
|
/examples/pmem_kinds
|
||||||
|
/examples/pmem_malloc
|
||||||
|
/examples/pmem_malloc_unlimited
|
||||||
|
/examples/pmem_usable_size
|
||||||
|
/examples/pmem_alignment
|
||||||
|
/examples/pmem_and_default_kind
|
||||||
|
/examples/pmem_multithreads
|
||||||
|
/examples/pmem_multithreads_onekind
|
||||||
|
/examples/pmem_free_with_unknown_kind
|
||||||
|
/examples/pmem_cpp_allocator
|
||||||
|
/test-driver
|
||||||
|
/vs
|
80
.travis.yml
Normal file
80
.travis.yml
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
dist: trusty
|
||||||
|
sudo: required
|
||||||
|
language: cpp
|
||||||
|
cache: ccache
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
include:
|
||||||
|
|
||||||
|
- name: "Astyle"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- g++-4.8
|
||||||
|
before_install:
|
||||||
|
- ./install_astyle.sh
|
||||||
|
script:
|
||||||
|
- ./astyle.sh
|
||||||
|
|
||||||
|
- name: "GCC 4.8"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- g++-4.8
|
||||||
|
- libnuma-dev
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc-4.8 && CXX=g++-4.8 && JEMALLOC_CC=gcc-4.8 && JEMALLOC_CXX=g++-4.8"
|
||||||
|
install:
|
||||||
|
script:
|
||||||
|
- CXX=$JEMALLOC_CXX CC=$JEMALLOC_CC LDFLAGS="-lrt -Wl,--no-as-needed" ./build_jemalloc.sh
|
||||||
|
- ./autogen.sh
|
||||||
|
- LDFLAGS="-lrt -Wl,--no-as-needed" ./configure
|
||||||
|
- make all
|
||||||
|
- make checkprogs
|
||||||
|
before_install:
|
||||||
|
- eval "${MATRIX_EVAL}"
|
||||||
|
|
||||||
|
- name: "GCC 8.0"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- g++-8
|
||||||
|
- libnuma-dev
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=gcc-8 && CXX=g++-8 && JEMALLOC_CC=gcc-8 && JEMALLOC_CXX=g++-8"
|
||||||
|
install:
|
||||||
|
script:
|
||||||
|
- CXX=$JEMALLOC_CXX CC=$JEMALLOC_CC LDFLAGS="-lrt -Wl,--no-as-needed" ./build_jemalloc.sh
|
||||||
|
- ./autogen.sh
|
||||||
|
- LDFLAGS="-lrt -Wl,--no-as-needed" ./configure
|
||||||
|
- make all
|
||||||
|
- make checkprogs
|
||||||
|
before_install:
|
||||||
|
- eval "${MATRIX_EVAL}"
|
||||||
|
|
||||||
|
- name: "Clang 7"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
- llvm-toolchain-trusty-7
|
||||||
|
packages:
|
||||||
|
- g++-4.8
|
||||||
|
- clang-7
|
||||||
|
- libnuma-dev
|
||||||
|
env:
|
||||||
|
- MATRIX_EVAL="CC=clang-7 && CXX=clang++-7 && JEMALLOC_CC=gcc-4.8 && JEMALLOC_CXX=g++-4.8"
|
||||||
|
install:
|
||||||
|
script:
|
||||||
|
- CXX=$JEMALLOC_CXX CC=$JEMALLOC_CC LDFLAGS="-lrt -Wl,--no-as-needed" ./build_jemalloc.sh
|
||||||
|
- ./autogen.sh
|
||||||
|
- LDFLAGS="-lrt -Wl,--no-as-needed" ./configure
|
||||||
|
- make all
|
||||||
|
before_install:
|
||||||
|
- eval "${MATRIX_EVAL}"
|
23
AUTHORS
Normal file
23
AUTHORS
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Christopher Cantalupo <christopher.m.cantalupo@intel.com>
|
||||||
|
Vishwanath Venkatesan <vishwanath.venkatesan@intel.com>
|
||||||
|
Steven Hampson <steven.t.hampson@intel.com>
|
||||||
|
Krzysztof Czurylo <krzysztof.czurylo@intel.com>
|
||||||
|
Leobardo Rountree <leobardo.r.rountree@intel.com>
|
||||||
|
Hector Barajas Villalobos <hector.a.barajas.villalobos@intel.com>
|
||||||
|
Ruchira Sasanka <ruchira.sasanka@intel.com>
|
||||||
|
Krzysztof Kulakowski <krzysztof.kulakowski@intel.com>
|
||||||
|
Rafael Aquini <aquini@redhat.com>
|
||||||
|
Alexandr Konovalov <alexandr.konovalov@intel.com>
|
||||||
|
Grzegorz Ozanski <grzegorz.ozanski@intel.com>
|
||||||
|
Artur Koziej <artur.koziej@intel.com>
|
||||||
|
Jakub Dlugolecki <jakub.dlugolecki@intel.com>
|
||||||
|
Lukasz Anaczkowski <lukasz.anaczkowski@intel.com>
|
||||||
|
Agata Wozniak <agata.wozniak@intel.com>
|
||||||
|
Grzegorz Andrejczuk <grzegorz.andrejczuk@intel.com>
|
||||||
|
Kamil Patelczyk <kamil.patelczyk@intel.com>
|
||||||
|
Jeff Hammond <jeff.r.hammond@intel.com>
|
||||||
|
Aleksandra Hernik <aleksandra.hernik@intel.com>
|
||||||
|
Pawel Kochanek <pawel.b.kochanek@intel.com>
|
||||||
|
Katarzyna Wasiuta <katarzyna.wasiuta@intel.com>
|
||||||
|
Krzysztof Filipek <krzysztof.filipek@intel.com>
|
||||||
|
Michal Biesek <michal.biesek@intel.com>
|
134
CONTRIBUTING
Normal file
134
CONTRIBUTING
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
CONTRIBUTING
|
||||||
|
============
|
||||||
|
|
||||||
|
This file is intended to help those interested in contributing to the
|
||||||
|
memkind library.
|
||||||
|
|
||||||
|
|
||||||
|
COMMUNICATION
|
||||||
|
=============
|
||||||
|
|
||||||
|
Please participate in the memkind mailing list:
|
||||||
|
|
||||||
|
https://lists.01.org/mailman/listinfo/memkind
|
||||||
|
|
||||||
|
There is also the option of opening an issue through github:
|
||||||
|
|
||||||
|
https://github.com/memkind/memkind/issues
|
||||||
|
|
||||||
|
The mailing list is intended for discussion and the issues are useful
|
||||||
|
for tracking progress on tasks. The TODO file lists out a number of
|
||||||
|
topics, and in order to prioritize one of them please open a github
|
||||||
|
issue with a related subject.
|
||||||
|
|
||||||
|
|
||||||
|
TESTING
|
||||||
|
=======
|
||||||
|
|
||||||
|
The tests require a Linux kernel newer than 3.11 (the details are
|
||||||
|
documented in the memkind README), and the reservation of 3000 huge
|
||||||
|
pages. The huge pages can be reserved with the following command:
|
||||||
|
|
||||||
|
$ sudo echo 3000 > /proc/sys/vm/nr_hugepages
|
||||||
|
|
||||||
|
Only in the case where gigabyte pages have been reserved will the
|
||||||
|
tests associated with gigabyte pages be executed. Reserving gigabyte
|
||||||
|
pages may require a modification to the kernel command line unless the
|
||||||
|
kernel is quite recent.
|
||||||
|
|
||||||
|
To test memkind simply execute the "make check" target after building.
|
||||||
|
This target calls memkind/test/test.sh with parameters
|
||||||
|
depending on the environment.
|
||||||
|
|
||||||
|
Most of the tests are written within the gtest framework, however, as
|
||||||
|
part of testing the example programs are also executed and the return
|
||||||
|
code of the executable determines pass or fail. The autotools test
|
||||||
|
infrastructure is used as a high level executor, but it does not track
|
||||||
|
individual tests. The consequence of this is that the autotools
|
||||||
|
output records only one high level test which passes in the case where
|
||||||
|
every underlying test was successful and fails if any underlying test
|
||||||
|
fails. The individual test results are recorded in the directory
|
||||||
|
called "gtest_output." Here you will find the log of the tests in
|
||||||
|
gtest_output/test.out and a set of junit style xml results: one for
|
||||||
|
each test. Note that a side effect of having only one autotools test
|
||||||
|
is that autotools parallel testing is disabled. We have
|
||||||
|
multi-threaded tests that use the OpenMP run-time which enables more
|
||||||
|
purposeful and deterministic testing of threading issues. Note that
|
||||||
|
the OpenMP run-time is only required for testing, it is not used by
|
||||||
|
the memkind library internally.
|
||||||
|
|
||||||
|
|
||||||
|
CODING STYLE
|
||||||
|
============
|
||||||
|
|
||||||
|
Before submitting a patch for inclusion, please run the modified
|
||||||
|
source code files through astyle with the following options
|
||||||
|
|
||||||
|
$ astyle --style=linux --indent=spaces=4 -S --max-continuation-indent=80 \
|
||||||
|
--max-code-length=80 --break-after-logical --indent-namespaces -z2 \
|
||||||
|
--align-pointer=name
|
||||||
|
|
||||||
|
More information about astyle can be found here:
|
||||||
|
|
||||||
|
http://astyle.sourceforge.net/
|
||||||
|
|
||||||
|
In C, source code constants are in all caps and everything else is in
|
||||||
|
all lower case. Underscores are used to separate words within a
|
||||||
|
symbol name. No camel case shall be used in C code. The test code is
|
||||||
|
largely written in C++. Here camel-case should be used for class
|
||||||
|
names and should always have a capitalized first letter. Other
|
||||||
|
symbols in C++ should generally follow the C style.
|
||||||
|
|
||||||
|
Most symbols with global scope shall be prefixed with "memkind_" or
|
||||||
|
"hbw_" depending on which interface they are a part of.
|
||||||
|
|
||||||
|
Any global variable shall have _g appended to the variable name and in
|
||||||
|
most cases shall be statically scoped within a single compilation
|
||||||
|
unit. The exception to that rule are static memory kinds that are
|
||||||
|
declared as extern within the associated interface header and are
|
||||||
|
constant after initialization. Global variables should be used in a
|
||||||
|
very narrow set of circumstances and in most cases modifications
|
||||||
|
should be guarded with pthread_once(3).
|
||||||
|
|
||||||
|
Functions not used outside of the compilation unit shall be declared
|
||||||
|
as static. All functions which are not declared as static shall be
|
||||||
|
documented in a man page and have an associated interface header file.
|
||||||
|
|
||||||
|
Preprocessor mark-up is discouraged when other options are possible.
|
||||||
|
Please use enum in place of #define when value control at configure or
|
||||||
|
build time is not required.
|
||||||
|
|
||||||
|
|
||||||
|
TESTS
|
||||||
|
=====
|
||||||
|
|
||||||
|
The current state of the tests is not nearly as well organized as it
|
||||||
|
could be. That being said, it is quite simple to add a new test.
|
||||||
|
Most C++ files in the test directory are associated with a single
|
||||||
|
gtest testing::Test class. These classes usually have several
|
||||||
|
associated test fixtures in the same file. If a new test can be added
|
||||||
|
as a fixture to an existing class, simply add the fixture to the file
|
||||||
|
and the test will be incorporated into the test infrastructure.
|
||||||
|
If a new class is required, create a new file and add it to the list
|
||||||
|
of "test_all_tests_SOURCES" in memkind/test/Makfile.mk and it will
|
||||||
|
be incorporated into the test infrastructure.
|
||||||
|
|
||||||
|
There are a few files which define classes which are not google test
|
||||||
|
classes. These are check.cpp, trial_generator.cpp and main.cpp. The
|
||||||
|
check.cpp file defines a class Check that can be used to validate
|
||||||
|
fundamental memkind features like NUMA node location, and page size.
|
||||||
|
The trial_generator.cpp file is used to abstract a sequence of
|
||||||
|
allocation and deallocation calls while performing checks on the
|
||||||
|
results of each call; this can be used to apply similar tests to all
|
||||||
|
of the different allocation APIs. The main.cpp file is a simple
|
||||||
|
wrapper around testing::InitGoogleTest and RUN_ALL_TESTS().
|
||||||
|
|
||||||
|
|
||||||
|
SUBMITTING A PATCH
|
||||||
|
==================
|
||||||
|
|
||||||
|
Please be sure that all tests pass before submission and that the
|
||||||
|
style conforms to the specifications given here. If a new feature is
|
||||||
|
implemented in the patch, please also include unit tests and an
|
||||||
|
example which exercises this feature. Once these requirements have
|
||||||
|
been met, please submit a pull request through github.
|
25
COPYING
Normal file
25
COPYING
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
Unless otherwise specified, files in the memkind source distribution are
|
||||||
|
subject to the following license:
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of Intel Corporation nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
219
ChangeLog
Normal file
219
ChangeLog
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
* Mon Dec 10 2018 Michal Biesek <michal.biesek@intel.com> v1.8.0
|
||||||
|
- Fixed error with realloc/free method with passing thread-specific cache flag
|
||||||
|
- Fixed error with memkind_create_pmem(), if other PMEM kind was destroyed before
|
||||||
|
- Fixed error with zeroing large allocations in PMEM kind
|
||||||
|
- Added support to create kind without maximum size limit of PMEM kind (max_size=0)
|
||||||
|
- Extended memkind API with memkind_malloc_usable_size()
|
||||||
|
- Removed EXPERIMENTAL from most methods in memkind API
|
||||||
|
- Added MEMKIND_ERROR_ARENAS_CREATE code
|
||||||
|
- Added C++ allocator for PMEM kind
|
||||||
|
- Extended PMEM examples
|
||||||
|
- Fixed integration with Travis CI
|
||||||
|
- Extended Travis CI configuration with Astyle and Coverage
|
||||||
|
- Added PMEM kind tests
|
||||||
|
|
||||||
|
* Wed Jan 24 2018 Pawel Kochanek <pawel.b.kochanek@intel.com> v1.7.0
|
||||||
|
- Updated internally used jemalloc to upstream version 5.0.
|
||||||
|
- Fixed error that has been occuring while memkind was dynamically loaded.
|
||||||
|
- Fixed MEMKIND_HBW_NODES behavior for single NUMA node system.
|
||||||
|
- Removed licenses other than BSD 3-clause from COPYING.
|
||||||
|
- Changed build instructions.
|
||||||
|
- Added configurable jemalloc prefix in build scripts.
|
||||||
|
- Upgraded gtest to version 1.8.0.
|
||||||
|
- Added memory footprint tests.
|
||||||
|
- Added locality test for MEMKIND_PREFERRED.
|
||||||
|
- Applied test parametrization in BATests.
|
||||||
|
- Fixed problems with pytest testing in Travis.
|
||||||
|
- Added huge page configuration in several tests.
|
||||||
|
- Removed several symbols that are no longer exposed in public API from man pages.
|
||||||
|
- Fixed HBW_POLICY_BIND_ALL documentation.
|
||||||
|
|
||||||
|
* Tue Jun 13 2017 Artur Koziej <artur.koziej@intel.com> v1.6.0
|
||||||
|
- Introduced new policy HBW_POLICY_BIND_ALL.
|
||||||
|
- Introduced MEMKIND_HBW_ALL, MEMKIND_HBW_ALL_HUGETLB and MEMKIND_REGULAR kinds.
|
||||||
|
- Fixed hbw_posix_memalign_psize() return value in case of unsupported policy and
|
||||||
|
page size combination.
|
||||||
|
- Documented supported policy and page size combination for
|
||||||
|
hbw_posix_memalign_psize().
|
||||||
|
- Merged libmemkind.a and libjemalloc_pic.a into a single static library.
|
||||||
|
- Fixed OOM during tcache acquisition.
|
||||||
|
- Tuned huge pages configuration in memkind tests.
|
||||||
|
- Added stress tests for allocations with large random sizes.
|
||||||
|
- Added stress tests for allocations with random kinds.
|
||||||
|
- Extended policy and NUMA node binding tests.
|
||||||
|
- Fixed several Travis build problems.
|
||||||
|
- Removed gb_page_tests_preferred_policy tests.
|
||||||
|
|
||||||
|
* Tue Feb 21 2017 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v1.5.0
|
||||||
|
- Intel(R) TBB scalable_allocator can be used as heap management alternative
|
||||||
|
to jemalloc (requires installed Intel (R) TBB package and environment variable
|
||||||
|
MEMKIND_HEAP_MANAGER=TBB)
|
||||||
|
- Updated internally used jemalloc to upstream version 4.3.1 (previously modified 3.5.1)
|
||||||
|
- Introduced new environment option MEMKIND_HOG_MEMORY. Setting it to "1" will prevent
|
||||||
|
memkind from releasing memory to OS.
|
||||||
|
- Introduced support for KNM processor from Intel(R) Xeon Phi(TM) family
|
||||||
|
- General cleanup of build scripts (e.g. fixed issues found on Ubuntu,
|
||||||
|
introduced simple build.sh script)
|
||||||
|
- Deprecated support for gigabyte-pages
|
||||||
|
- Removed number of previously deprecated symbols
|
||||||
|
|
||||||
|
* Thu Nov 17 2016 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v1.4.0
|
||||||
|
- Introduced hbw_verify_memory_region() for verifying if provided memory
|
||||||
|
region fully falls into high-bandwidth memory (for details please take a look
|
||||||
|
at man/hbwmalloc.3).
|
||||||
|
- New API for creating kinds using set of predefined attributes:
|
||||||
|
memkind_create_kind(), memkind_destroy_kind() (for details please take a look
|
||||||
|
at man/memkind.3).
|
||||||
|
- Fixed issue in autohbw where it was reporting limit error regardless of
|
||||||
|
value provided.
|
||||||
|
- Added logging on error paths.
|
||||||
|
- Test base fixes and improvements.
|
||||||
|
|
||||||
|
* Tue Sep 27 2016 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v1.3.0
|
||||||
|
- Introduced logging mechanism (for details please take a look at
|
||||||
|
man/memkind.3).
|
||||||
|
- Deprecated symbols: memkind_finalize(), memkind_get_num_kind(),
|
||||||
|
memkind_get_kind_by_partition(), memkind_get_kind_by_name(),
|
||||||
|
memkind_partition_mmap(), memkind_get_size(), MEMKIND_ERROR_MEMALIGN,
|
||||||
|
MEMKIND_ERROR_MALLCTL, MEMKIND_ERROR_GETCPU, MEMKIND_ERROR_PMTT,
|
||||||
|
MEMKIND_ERROR_TIEDISTANCE, MEMKIND_ERROR_ALIGNMENT, MEMKIND_ERROR_MALLOCX,
|
||||||
|
MEMKIND_ERROR_REPNAME, MEMKIND_ERROR_PTHREAD, MEMKIND_ERROR_BADPOLICY,
|
||||||
|
MEMKIND_ERROR_REPPOLICY.
|
||||||
|
- Added integration with hwloc (turned on with --with-hwloc).
|
||||||
|
- Cleanup of symbols exposed by libmemkind.so (e.g. no longer exposing libnuma
|
||||||
|
and jemalloc symbols).
|
||||||
|
- AutoHBW files have been moved to "memkind/autohbw" directory, code has
|
||||||
|
been refactored and tests have been added to appropriate scenarios.
|
||||||
|
- Library is now built with flags improving security (can be turned off
|
||||||
|
with --disable-secure configure time option).
|
||||||
|
- Changed configuration of jemalloc to turn off unused features.
|
||||||
|
|
||||||
|
* Thu Aug 18 2016 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v1.2.0
|
||||||
|
- memkind_create() and memkind_ops have been deprecated (moved to
|
||||||
|
memkind_deprecated.h).
|
||||||
|
- Deprecated the headers from memkind/internal and added compile-time
|
||||||
|
warnings to them (plan is to remove those from rpm packages).
|
||||||
|
- autohbw files have been moved to memkind/autohbw directory.
|
||||||
|
- API decorators (memkind_malloc_pre, memkind_malloc_post etc.) now
|
||||||
|
need to be enabled with configure-time option --enable-decorators.
|
||||||
|
- Allocation time optimizations with up to 20% improvement.
|
||||||
|
|
||||||
|
* Wed Jul 13 2016 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v1.1.1
|
||||||
|
- Performance improvement for memkind_free() in scenario where NULL
|
||||||
|
was passed as kind (reduced by 60%).
|
||||||
|
- Introduced integration with Travis CI.
|
||||||
|
- Fixed issue where memory returned from calloc was not filled with zeroes
|
||||||
|
when using memkind_pmem kinds.
|
||||||
|
- Fixed issue where interleave kinds was failing on systems without
|
||||||
|
Transparent Huge Pages module configured.
|
||||||
|
- Resolved several issues that was causing compilation errors on some systems.
|
||||||
|
- test/test.sh is now able to detect system configuration, and run only those
|
||||||
|
tests which requirements are meet.
|
||||||
|
- Added gtest to repo to avoid downloading it during build proecess.
|
||||||
|
|
||||||
|
* Mon May 23 2016 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v1.1.0
|
||||||
|
- Implemented algorithm for detecting high-bandwidth memory on Intel Xeon Phi X200
|
||||||
|
without parsing PMTT.
|
||||||
|
- PMTT-parsing service has been removed.
|
||||||
|
- memkind struct definition from memkind.h has been replaced by forward
|
||||||
|
declaration. Definition has been moved to /internal/memkind_private.h and
|
||||||
|
shouldn't be considered as part of library interface anymore.
|
||||||
|
- Performance improvment for hugetlb kinds (check_available() is no longer
|
||||||
|
parsing sysfs every time).
|
||||||
|
- Performance fix by removing --enable-safe from jemmaloc build flags.
|
||||||
|
- New tests for validating high-bandwidth memory detection has been added.
|
||||||
|
- AFTS has been split into two groups: memkind-afts.ts and memkind-afts-ext.ts,
|
||||||
|
based on amount of required memory (for details view test/README).
|
||||||
|
|
||||||
|
* Thu Mar 03 2016 Artur Koziej <artur.koziej@intel.com> v1.0.0
|
||||||
|
- hbwmalloc.h released as stable API.
|
||||||
|
- Introduce API standards: STANDARD API, NON-STANDARD API, EXPERIMENTAL API.
|
||||||
|
- Introduce memkind versioning API.
|
||||||
|
- Fix type names in hbwmalloc API.
|
||||||
|
- Change error codes to POSIX standard ones in hbwmalloc API.
|
||||||
|
- Move API headers to include directory.
|
||||||
|
- Move NON-STANDARD API, or EXPERIMENTAL API to include/memkind/internal directory.
|
||||||
|
- New man page (memkind_interleave.3) describing interleave kind.
|
||||||
|
- Significant documentation improvement.
|
||||||
|
- Performance fix for jemalloc - significantly decrease of library initialization time.
|
||||||
|
- Enforce 2MB alignment in jemalloc due to the Linux kernel bug (munmap() fails for
|
||||||
|
huge pages, when the size is not aligned).
|
||||||
|
- Move to systemd defined service (memkind.service), drop init.d script.
|
||||||
|
- New rpm layout (memkind and memkind-devel).
|
||||||
|
- Remove false dependency on OpenMP.
|
||||||
|
- Extend test base for stress, longevity and initialization performance tests.
|
||||||
|
- Fix memory leak in ctl_growk().
|
||||||
|
- Rename namespace: hbwmalloc -> hbw.
|
||||||
|
- Rename class: hbwmalloc_allocator -> allocator.
|
||||||
|
|
||||||
|
* Thu Oct 15 2015 Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> v0.3.0
|
||||||
|
- Added two new kinds: MEMKIND_INTERLEAVE and MEMKIND_HBW_INTERLEAVE
|
||||||
|
(for details please take a look at man/memkind.3)
|
||||||
|
- Added support for file-backed memory heaps
|
||||||
|
(for details please take a look at man/memkind_pmem.3)
|
||||||
|
- Added autohbw library, that intercepts the standard heap allocations,
|
||||||
|
which let use high-bandwidth memory without modifying existing codebase
|
||||||
|
(for details please take a look at examples/autohbw_README)
|
||||||
|
- jemalloc is now, staticly linked, internal component of memkind RPM
|
||||||
|
instead of rpm dependency.
|
||||||
|
- Added memkind_allocated example which demonstrates usage of memkind
|
||||||
|
with alignas() alignment specifier introduced in C++11
|
||||||
|
(for details please take a look at examples/README)
|
||||||
|
- Added support for using thread local storage to improve performance in
|
||||||
|
multithreaded applications (enabled by configure time option: --enable-tls)
|
||||||
|
- Added posibility to set number of jemalloc arenas per kind by
|
||||||
|
configure time parameter or enviromental variable
|
||||||
|
(for details please take a look at MEMKIND_ARENA_NUM_PER_KIND section
|
||||||
|
of man/memkind.3).
|
||||||
|
- Added decorators to the memkind allocation APIs.
|
||||||
|
These are weak symbols (pre and post for each API) which can modify
|
||||||
|
the input and output of each of the calls.
|
||||||
|
- Significantly extended test base (new groups of tests: performance,
|
||||||
|
multithreaded, PMTT, nagtive, stress).
|
||||||
|
|
||||||
|
* Fri Jan 9 2015 Christopher Cantalupo <christopher.m.cantalupo@intel.com> v0.2.0
|
||||||
|
- Bumped memkind ABI version to 0:1:0.
|
||||||
|
- Removed memkind_get_kind_for_free() from externally facing API's. Instead if
|
||||||
|
memkind_free() is called with zero passed for the kind then
|
||||||
|
memkind_get_kind_for_free() is called internally.
|
||||||
|
- Moved to single callback memkind_partition_mmap() to simplify
|
||||||
|
jemalloc modifications.
|
||||||
|
- Added hooks for setting file descriptor and offset for mmap enabling
|
||||||
|
file-backed memory kinds.
|
||||||
|
- Added a void pointer called "priv" to memkind structure for storing data for
|
||||||
|
user-defined kinds.
|
||||||
|
- Removed call to sched_getcpu(), now thread id is hashed to determine the arena
|
||||||
|
index.
|
||||||
|
- Added weak symbol hooks for decorating the heap management functions.
|
||||||
|
- Fixed several issues with init.d/memkind script and spec file scriptlets that
|
||||||
|
are exposed by SLES-12.
|
||||||
|
- Introduced an example library called numakind.
|
||||||
|
The numakind library will allocate from the closest NUMA node to a thread as
|
||||||
|
measured when that thread makes its first allocation call.
|
||||||
|
- Fixed error handling in memkind_gbtlb_mmap() that could cause a segfault when
|
||||||
|
gigabyte pages are not available.
|
||||||
|
- Added tests for PMTT parser.
|
||||||
|
- Removed binary mock PMTT table from source code, replaced it with a hexdump.
|
||||||
|
- Fixed a number of issues in test scripts which were suppressing errors.
|
||||||
|
- Removed unnecessary includes from header files.
|
||||||
|
- Better error checking in example code.
|
||||||
|
- Documentation update and clean up.
|
||||||
|
|
||||||
|
* Thu Nov 13 2014 Christopher Cantalupo <christopher.m.cantalupo@intel.com> v0.1.0
|
||||||
|
- Increased test code coverage significantly.
|
||||||
|
- Fixed bug in memkind_error_message() for MEMKIND_ERROR_TOOMANY.
|
||||||
|
- Removed memkind_arena_free() API since it was redundant with memkind_default_free().
|
||||||
|
- Static memkind structs are now declared as extern in the headers and defined in the
|
||||||
|
source files files rather than being statically defined in the headers.
|
||||||
|
|
||||||
|
* Thu Oct 30 2014 Christopher Cantalupo <christopher.m.cantalupo@intel.com> v0.0.9
|
||||||
|
- Now building with autotools.
|
||||||
|
- Updated documentation.
|
||||||
|
- Fixed typo in copyright.
|
||||||
|
- Fixed test scripts to properly handle return code of each test.
|
||||||
|
- Added C++03 standard allocator that uses hbw_malloc and hbw_free.
|
||||||
|
* Tue Sep 30 2014 Christopher Cantalupo <christopher.m.cantalupo@intel.com> v0.0.8
|
||||||
|
- Added GBTLB functionality, code clean up, documentation updates,
|
||||||
|
examples directory. Examples includes stream modified to use
|
||||||
|
memkind interface. Code coverage still lacking, and documentation
|
||||||
|
incomplete.
|
370
INSTALL
Normal file
370
INSTALL
Normal file
@ -0,0 +1,370 @@
|
|||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Briefly, the shell commands `./configure; make; make install' should
|
||||||
|
configure, build, and install this package. The following
|
||||||
|
more-detailed instructions are generic; see the `README' file for
|
||||||
|
instructions specific to this package. Some packages provide this
|
||||||
|
`INSTALL' file but do not implement all of the features documented
|
||||||
|
below. The lack of an optional feature in a given package is not
|
||||||
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
|
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for
|
||||||
|
various system-dependent variables used during compilation. It uses
|
||||||
|
those values to create a `Makefile' in each directory of the package.
|
||||||
|
It may also create one or more `.h' files containing system-dependent
|
||||||
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
|
you can run in the future to recreate the current configuration, and a
|
||||||
|
file `config.log' containing compiler output (useful mainly for
|
||||||
|
debugging `configure').
|
||||||
|
|
||||||
|
It can also use an optional file (typically called `config.cache'
|
||||||
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
|
the results of its tests to speed up reconfiguring. Caching is
|
||||||
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.
|
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try
|
||||||
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
|
diffs or instructions to the address given in the `README' so they can
|
||||||
|
be considered for the next release. If you are using the cache, and at
|
||||||
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
|
may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
|
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||||
|
you want to change it or regenerate `configure' using a newer version
|
||||||
|
of `autoconf'.
|
||||||
|
|
||||||
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type
|
||||||
|
`./configure' to configure the package for your system.
|
||||||
|
|
||||||
|
Running `configure' might take a while. While running, it prints
|
||||||
|
some messages telling which features it is checking for.
|
||||||
|
|
||||||
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
|
the package, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation. When installing into a prefix owned by root, it is
|
||||||
|
recommended that the package be configured and built as a regular
|
||||||
|
user, and only the `make install' phase executed with root
|
||||||
|
privileges.
|
||||||
|
|
||||||
|
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||||
|
this time using the binaries in their final installed location.
|
||||||
|
This target does not install anything. Running this target as a
|
||||||
|
regular user, particularly if the prior `make install' required
|
||||||
|
root privileges, verifies that the installation completed
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
6. You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `make clean'. To also remove the
|
||||||
|
files that `configure' created (so you can compile the package for
|
||||||
|
a different kind of computer), type `make distclean'. There is
|
||||||
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
|
for the package's developers. If you use it, you may have to get
|
||||||
|
all sorts of other programs in order to regenerate files that came
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
7. Often, you can also type `make uninstall' to remove the installed
|
||||||
|
files again. In practice, not all packages have tested that
|
||||||
|
uninstallation works correctly, even though it is required by the
|
||||||
|
GNU Coding Standards.
|
||||||
|
|
||||||
|
8. Some packages, particularly those that use Automake, provide `make
|
||||||
|
distcheck', which can by used by developers to test that all other
|
||||||
|
targets like `make install' and `make uninstall' work correctly.
|
||||||
|
This target is generally not run by end users.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that
|
||||||
|
the `configure' script does not know about. Run `./configure --help'
|
||||||
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
|
You can give `configure' initial values for configuration parameters
|
||||||
|
by setting variables in the command line or in the environment. Here
|
||||||
|
is an example:
|
||||||
|
|
||||||
|
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||||
|
|
||||||
|
*Note Defining Variables::, for more details.
|
||||||
|
|
||||||
|
Compiling For Multiple Architectures
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the
|
||||||
|
same time, by placing the object files for each architecture in their
|
||||||
|
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||||
|
directory where you want the object files and executables to go and run
|
||||||
|
the `configure' script. `configure' automatically checks for the
|
||||||
|
source code in the directory that `configure' is in and in `..'. This
|
||||||
|
is known as a "VPATH" build.
|
||||||
|
|
||||||
|
With a non-GNU `make', it is safer to compile the package for one
|
||||||
|
architecture at a time in the source code directory. After you have
|
||||||
|
installed the package for one architecture, use `make distclean' before
|
||||||
|
reconfiguring for another architecture.
|
||||||
|
|
||||||
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
|
executables that work on multiple system types--known as "fat" or
|
||||||
|
"universal" binaries--by specifying multiple `-arch' options to the
|
||||||
|
compiler but only a single `-arch' option to the preprocessor. Like
|
||||||
|
this:
|
||||||
|
|
||||||
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
|
||||||
|
This is not guaranteed to produce working output in all cases, you
|
||||||
|
may have to build one architecture at a time and combine the results
|
||||||
|
using the `lipo' tool if you have problems.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' installs the package's commands under
|
||||||
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
|
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||||
|
absolute file name.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like `--bindir=DIR' to specify different values for particular
|
||||||
|
kinds of files. Run `configure --help' for a list of the directories
|
||||||
|
you can set and what kinds of files go in them. In general, the
|
||||||
|
default for these options is expressed in terms of `${prefix}', so that
|
||||||
|
specifying just `--prefix' will affect all of the other directory
|
||||||
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
|
The most portable way to affect installation locations is to pass the
|
||||||
|
correct locations to `configure'; however, many packages provide one or
|
||||||
|
both of the following shortcuts of passing variable assignments to the
|
||||||
|
`make install' command line to change installation locations without
|
||||||
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
|
The first method involves providing an override variable for each
|
||||||
|
affected directory. For example, `make install
|
||||||
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
|
directory configuration variables that were expressed in terms of
|
||||||
|
`${prefix}'. Any directories that were specified during `configure',
|
||||||
|
but not in terms of `${prefix}', must each be overridden at install
|
||||||
|
time for the entire installation to be relocated. The approach of
|
||||||
|
makefile variable overrides for each directory variable is required by
|
||||||
|
the GNU Coding Standards, and ideally causes no recompilation.
|
||||||
|
However, some platforms have known limitations with the semantics of
|
||||||
|
shared libraries that end up requiring recompilation when using this
|
||||||
|
method, particularly noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
|
The second method involves providing the `DESTDIR' variable. For
|
||||||
|
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||||
|
`/alternate/directory' before all installation names. The approach of
|
||||||
|
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
|
it does better at avoiding recompilation issues, and works well even
|
||||||
|
when some directory options were not specified in terms of `${prefix}'
|
||||||
|
at `configure' time.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed
|
||||||
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
|
package recognizes.
|
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually
|
||||||
|
find the X include and library files automatically, but if it doesn't,
|
||||||
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
|
Some packages offer the ability to configure how verbose the
|
||||||
|
execution of `make' will be. For these packages, running `./configure
|
||||||
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
|
overridden with `make V=1'; while running `./configure
|
||||||
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
|
overridden with `make V=0'.
|
||||||
|
|
||||||
|
Particular systems
|
||||||
|
==================
|
||||||
|
|
||||||
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||||
|
CC is not installed, it is recommended to use the following options in
|
||||||
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
|
HP-UX `make' updates targets which have the same time stamps as
|
||||||
|
their prerequisites, which makes it generally unusable when shipped
|
||||||
|
generated files such as `configure' are involved. Use GNU `make'
|
||||||
|
instead.
|
||||||
|
|
||||||
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
|
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||||
|
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||||
|
to try
|
||||||
|
|
||||||
|
./configure CC="cc"
|
||||||
|
|
||||||
|
and if that doesn't work, try
|
||||||
|
|
||||||
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
|
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||||
|
directory contains several dysfunctional programs; working variants of
|
||||||
|
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||||
|
in your `PATH', put it _after_ `/usr/bin'.
|
||||||
|
|
||||||
|
On Haiku, software installed for all users goes in `/boot/common',
|
||||||
|
not `/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' cannot figure out
|
||||||
|
automatically, but needs to determine by the type of machine the package
|
||||||
|
will run on. Usually, assuming the package is built to be run on the
|
||||||
|
_same_ architectures, `configure' can figure that out, but if it prints
|
||||||
|
a message saying it cannot guess the machine type, give it the
|
||||||
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
where SYSTEM can have one of these forms:
|
||||||
|
|
||||||
|
OS
|
||||||
|
KERNEL-OS
|
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If
|
||||||
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
|
need to know the machine type.
|
||||||
|
|
||||||
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
|
produce code for.
|
||||||
|
|
||||||
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
|
platform different from the build platform, you should specify the
|
||||||
|
"host" platform (i.e., that on which the generated programs will
|
||||||
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
|
Sharing Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share,
|
||||||
|
you can create a site shell script called `config.site' that gives
|
||||||
|
default values for variables like `CC', `cache_file', and `prefix'.
|
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
|
Defining Variables
|
||||||
|
==================
|
||||||
|
|
||||||
|
Variables not defined in a site shell script can be set in the
|
||||||
|
environment passed to `configure'. However, some packages may run
|
||||||
|
configure again during the build, and the customized values of these
|
||||||
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script).
|
||||||
|
|
||||||
|
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||||
|
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||||
|
this workaround:
|
||||||
|
|
||||||
|
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
`configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
`-h'
|
||||||
|
Print a summary of all of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--help=short'
|
||||||
|
`--help=recursive'
|
||||||
|
Print a summary of the options unique to this package's
|
||||||
|
`configure', and exit. The `short' variant lists options used
|
||||||
|
only in the top level, while the `recursive' variant lists options
|
||||||
|
also present in any nested packages.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
`-V'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
|
disable caching.
|
||||||
|
|
||||||
|
`--config-cache'
|
||||||
|
`-C'
|
||||||
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made. To
|
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
|
messages will still be shown).
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`--prefix=DIR'
|
||||||
|
Use DIR as the installation prefix. *note Installation Names::
|
||||||
|
for more details, including other options available for fine-tuning
|
||||||
|
the installation locations.
|
||||||
|
|
||||||
|
`--no-create'
|
||||||
|
`-n'
|
||||||
|
Run the configure checks, but stop before creating any output
|
||||||
|
files.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
|
`configure --help' for more details.
|
469
MANIFEST
Normal file
469
MANIFEST
Normal file
@ -0,0 +1,469 @@
|
|||||||
|
AUTHORS
|
||||||
|
COPYING
|
||||||
|
CONTRIBUTING
|
||||||
|
ChangeLog
|
||||||
|
INSTALL
|
||||||
|
Makefile.am
|
||||||
|
NEWS
|
||||||
|
PULL_REQUEST_TEMPLATE.md
|
||||||
|
README
|
||||||
|
.travis.yml
|
||||||
|
astyle.sh
|
||||||
|
autogen.sh
|
||||||
|
build.sh
|
||||||
|
build_jemalloc.sh
|
||||||
|
configure.ac
|
||||||
|
autohbw/Makefile.mk
|
||||||
|
autohbw/autohbw.c
|
||||||
|
autohbw/autohbw_get_src_lines.pl
|
||||||
|
autohbw/autohbw_README
|
||||||
|
autohbw/autohbw_test.sh
|
||||||
|
examples/autohbw_candidates.c
|
||||||
|
examples/filter_example.c
|
||||||
|
examples/hello_memkind_example.c
|
||||||
|
examples/README
|
||||||
|
examples/Makefile.mk
|
||||||
|
examples/hello_hbw_example.c
|
||||||
|
examples/memkind_allocated_example.cpp
|
||||||
|
examples/memkind_allocated.hpp
|
||||||
|
examples/memkind_decorator_debug.c
|
||||||
|
examples/pmem_kinds.c
|
||||||
|
examples/pmem_malloc.c
|
||||||
|
examples/pmem_malloc_unlimited.c
|
||||||
|
examples/pmem_usable_size.c
|
||||||
|
examples/pmem_alignment.c
|
||||||
|
examples/pmem_and_default_kind.c
|
||||||
|
examples/pmem_multithreads.c
|
||||||
|
examples/pmem_multithreads_onekind.c
|
||||||
|
examples/pmem_free_with_unknown_kind.c
|
||||||
|
examples/pmem_cpp_allocator.cpp
|
||||||
|
install_astyle.sh
|
||||||
|
m4/ax_cxx_compile_stdcxx.m4
|
||||||
|
m4/ax_cxx_compile_stdcxx_11.m4
|
||||||
|
m4/ax_pthread.m4
|
||||||
|
man/memkind-hbw-nodes.1
|
||||||
|
man/hbwmalloc.3
|
||||||
|
man/memkind.3
|
||||||
|
man/memkind_arena.3
|
||||||
|
man/memkind_default.3
|
||||||
|
man/memkind_hbw.3
|
||||||
|
man/memkind_hugetlb.3
|
||||||
|
man/memkind_pmem.3
|
||||||
|
man/hbwallocator.3
|
||||||
|
man/pmemallocator.3
|
||||||
|
man/autohbw.7
|
||||||
|
memkind.spec.mk
|
||||||
|
src/heap_manager.c
|
||||||
|
src/hbwmalloc.c
|
||||||
|
src/memkind.c
|
||||||
|
src/memkind_arena.c
|
||||||
|
src/memkind_default.c
|
||||||
|
src/memkind_gbtlb.c
|
||||||
|
src/memkind_hbw.c
|
||||||
|
src/memkind_regular.c
|
||||||
|
src/memkind_hugetlb.c
|
||||||
|
src/memkind_interleave.c
|
||||||
|
src/memkind_pmem.c
|
||||||
|
src/memkind_log.c
|
||||||
|
src/memkind-hbw-nodes.c
|
||||||
|
src/tbb_wrapper.c
|
||||||
|
src/Makefile.mk
|
||||||
|
include/hbwmalloc.h
|
||||||
|
include/memkind.h
|
||||||
|
include/memkind_deprecated.h
|
||||||
|
include/hbw_allocator.h
|
||||||
|
include/pmem_allocator.h
|
||||||
|
include/memkind/internal/heap_manager.h
|
||||||
|
include/memkind/internal/memkind_arena.h
|
||||||
|
include/memkind/internal/memkind_default.h
|
||||||
|
include/memkind/internal/memkind_gbtlb.h
|
||||||
|
include/memkind/internal/memkind_hbw.h
|
||||||
|
include/memkind/internal/memkind_regular.h
|
||||||
|
include/memkind/internal/memkind_hugetlb.h
|
||||||
|
include/memkind/internal/memkind_interleave.h
|
||||||
|
include/memkind/internal/memkind_pmem.h
|
||||||
|
include/memkind/internal/memkind_private.h
|
||||||
|
include/memkind/internal/memkind_log.h
|
||||||
|
include/memkind/internal/tbb_wrapper.h
|
||||||
|
include/memkind/internal/tbb_mem_pool_policy.h
|
||||||
|
test/Makefile.mk
|
||||||
|
test/Allocator.hpp
|
||||||
|
test/TestPolicy.hpp
|
||||||
|
test/test.sh
|
||||||
|
test/multithreaded_tests.cpp
|
||||||
|
test/gb_page_tests_bind_policy.cpp
|
||||||
|
test/environ_err_hbw_malloc_test.cpp
|
||||||
|
test/negative_tests.cpp
|
||||||
|
test/trial_generator.cpp
|
||||||
|
test/check.h
|
||||||
|
test/trial_generator.h
|
||||||
|
test/bat_tests.cpp
|
||||||
|
test/main.cpp
|
||||||
|
test/common.h
|
||||||
|
test/static_kinds_list.h
|
||||||
|
test/check.cpp
|
||||||
|
test/error_message_tests.cpp
|
||||||
|
test/get_arena_test.cpp
|
||||||
|
test/locality_test.cpp
|
||||||
|
test/memkind_pmem_tests.cpp
|
||||||
|
test/memkind_pmem_long_time_tests.cpp
|
||||||
|
test/memory_footprint_test.cpp
|
||||||
|
test/memory_manager.h
|
||||||
|
test/random_sizes_allocator.h
|
||||||
|
test/proc_stat.h
|
||||||
|
test/static_kinds_tests.cpp
|
||||||
|
test/huge_page_test.cpp
|
||||||
|
test/hbw_verify_function_test.cpp
|
||||||
|
test/hbw_detection_test.py
|
||||||
|
test/autohbw_test.py
|
||||||
|
test/trace_mechanism_test.py
|
||||||
|
test/memkind-afts.ts
|
||||||
|
test/memkind-afts-ext.ts
|
||||||
|
test/memkind-slts.ts
|
||||||
|
test/memkind-perf.ts
|
||||||
|
test/memkind-perf-ext.ts
|
||||||
|
test/memkind-pytests.ts
|
||||||
|
test/performance/framework.hpp
|
||||||
|
test/performance/framework.cpp
|
||||||
|
test/performance/operations.hpp
|
||||||
|
test/performance/perf_tests.hpp
|
||||||
|
test/performance/perf_tests.cpp
|
||||||
|
test/hbw_allocator_tests.cpp
|
||||||
|
test/decorator_test.cpp
|
||||||
|
test/decorator_test.h
|
||||||
|
test/alloc_performance_tests.cpp
|
||||||
|
test/allocator_perf_tool/AllocationSizes.hpp
|
||||||
|
test/allocator_perf_tool/Allocation_info.hpp
|
||||||
|
test/allocator_perf_tool/Allocation_info.cpp
|
||||||
|
test/allocator_perf_tool/Allocator.hpp
|
||||||
|
test/allocator_perf_tool/AllocatorFactory.hpp
|
||||||
|
test/allocator_perf_tool/CSVLogger.hpp
|
||||||
|
test/allocator_perf_tool/CommandLine.hpp
|
||||||
|
test/allocator_perf_tool/Configuration.hpp
|
||||||
|
test/allocator_perf_tool/ConsoleLog.hpp
|
||||||
|
test/allocator_perf_tool/FunctionCalls.hpp
|
||||||
|
test/allocator_perf_tool/FunctionCallsPerformanceTask.cpp
|
||||||
|
test/allocator_perf_tool/FunctionCallsPerformanceTask.h
|
||||||
|
test/allocator_perf_tool/GTestAdapter.hpp
|
||||||
|
test/allocator_perf_tool/Iterator.hpp
|
||||||
|
test/allocator_perf_tool/JemallocAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/Makefile
|
||||||
|
test/allocator_perf_tool/MemkindAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/Numastat.hpp
|
||||||
|
test/allocator_perf_tool/Runnable.hpp
|
||||||
|
test/allocator_perf_tool/PmemMockup.cpp
|
||||||
|
test/allocator_perf_tool/PmemMockup.hpp
|
||||||
|
test/allocator_perf_tool/ScenarioWorkload.cpp
|
||||||
|
test/allocator_perf_tool/ScenarioWorkload.h
|
||||||
|
test/allocator_perf_tool/StandardAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/Stats.hpp
|
||||||
|
test/allocator_perf_tool/StressIncreaseToMax.cpp
|
||||||
|
test/allocator_perf_tool/StressIncreaseToMax.h
|
||||||
|
test/allocator_perf_tool/Task.hpp
|
||||||
|
test/allocator_perf_tool/TaskFactory.hpp
|
||||||
|
test/allocator_perf_tool/Tests.hpp
|
||||||
|
test/allocator_perf_tool/Thread.hpp
|
||||||
|
test/allocator_perf_tool/TimerSysTime.hpp
|
||||||
|
test/allocator_perf_tool/VectorIterator.hpp
|
||||||
|
test/allocator_perf_tool/Workload.hpp
|
||||||
|
test/allocator_perf_tool/WrappersMacros.hpp
|
||||||
|
test/allocator_perf_tool/HugePageUnmap.hpp
|
||||||
|
test/allocator_perf_tool/HugePageOrganizer.hpp
|
||||||
|
test/allocator_perf_tool/HBWmallocAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/main.cpp
|
||||||
|
test/allocate_to_max_stress_test.cpp
|
||||||
|
test/memkind_versioning_tests.cpp
|
||||||
|
test/heap_manager_init_perf_test.cpp
|
||||||
|
test/autohbw_test_helper.c
|
||||||
|
test/trace_mechanism_test_helper.c
|
||||||
|
test/python_framework/cmd_helper.py
|
||||||
|
test/python_framework/huge_page_organizer.py
|
||||||
|
test/python_framework/__init__.py
|
||||||
|
test/draw_plots.py
|
||||||
|
test/run_alloc_benchmark.sh
|
||||||
|
test/alloc_benchmark.c
|
||||||
|
test/load_tbbmalloc_symbols.c
|
||||||
|
test/tbbmalloc.h
|
||||||
|
test/freeing_memory_segfault_test.cpp
|
||||||
|
test/dlopen_test.cpp
|
||||||
|
test/gtest_fused/gtest/gtest-all.cc
|
||||||
|
test/gtest_fused/gtest/gtest.h
|
||||||
|
test/pmem_allocator_tests.cpp
|
||||||
|
jemalloc/.appveyor.yml
|
||||||
|
jemalloc/.autom4te.cfg
|
||||||
|
jemalloc/.gitattributes
|
||||||
|
jemalloc/.gitignore
|
||||||
|
jemalloc/.travis.yml
|
||||||
|
jemalloc/COPYING
|
||||||
|
jemalloc/ChangeLog
|
||||||
|
jemalloc/INSTALL.md
|
||||||
|
jemalloc/Makefile.in
|
||||||
|
jemalloc/README
|
||||||
|
jemalloc/autogen.sh
|
||||||
|
jemalloc/bin/jemalloc-config.in
|
||||||
|
jemalloc/bin/jemalloc.sh.in
|
||||||
|
jemalloc/bin/jeprof.in
|
||||||
|
jemalloc/build-aux/config.guess
|
||||||
|
jemalloc/build-aux/config.sub
|
||||||
|
jemalloc/build-aux/install-sh
|
||||||
|
jemalloc/config.stamp.in
|
||||||
|
jemalloc/configure.ac
|
||||||
|
jemalloc/doc/html.xsl.in
|
||||||
|
jemalloc/doc/jemalloc.xml.in
|
||||||
|
jemalloc/doc/manpages.xsl.in
|
||||||
|
jemalloc/doc/stylesheet.xsl
|
||||||
|
jemalloc/include/jemalloc/internal/arena_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_inlines_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_inlines_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_structs_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_structs_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/assert.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_c11.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_gcc_sync.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_msvc.h
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/bit_util.h
|
||||||
|
jemalloc/include/jemalloc/internal/bitmap.h
|
||||||
|
jemalloc/include/jemalloc/internal/ckh.h
|
||||||
|
jemalloc/include/jemalloc/internal/ctl.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_dss.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_mmap.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/hash.h
|
||||||
|
jemalloc/include/jemalloc/internal/hooks.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_includes.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in
|
||||||
|
jemalloc/include/jemalloc/internal/large_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/malloc_io.h
|
||||||
|
jemalloc/include/jemalloc/internal/mutex.h
|
||||||
|
jemalloc/include/jemalloc/internal/mutex_pool.h
|
||||||
|
jemalloc/include/jemalloc/internal/mutex_prof.h
|
||||||
|
jemalloc/include/jemalloc/internal/nstime.h
|
||||||
|
jemalloc/include/jemalloc/internal/pages.h
|
||||||
|
jemalloc/include/jemalloc/internal/ph.h
|
||||||
|
jemalloc/include/jemalloc/internal/private_namespace.sh
|
||||||
|
jemalloc/include/jemalloc/internal/private_symbols.sh
|
||||||
|
jemalloc/include/jemalloc/internal/prng.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_inlines_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_inlines_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/public_namespace.sh
|
||||||
|
jemalloc/include/jemalloc/internal/public_unnamespace.sh
|
||||||
|
jemalloc/include/jemalloc/internal/ql.h
|
||||||
|
jemalloc/include/jemalloc/internal/qr.h
|
||||||
|
jemalloc/include/jemalloc/internal/rb.h
|
||||||
|
jemalloc/include/jemalloc/internal/rtree.h
|
||||||
|
jemalloc/include/jemalloc/internal/rtree_tsd.h
|
||||||
|
jemalloc/include/jemalloc/internal/size_classes.sh
|
||||||
|
jemalloc/include/jemalloc/internal/smoothstep.h
|
||||||
|
jemalloc/include/jemalloc/internal/smoothstep.sh
|
||||||
|
jemalloc/include/jemalloc/internal/spin.h
|
||||||
|
jemalloc/include/jemalloc/internal/stats.h
|
||||||
|
jemalloc/include/jemalloc/internal/stats_tsd.h
|
||||||
|
jemalloc/include/jemalloc/internal/sz.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/ticker.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_generic.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_malloc_thread_cleanup.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_tls.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_win.h
|
||||||
|
jemalloc/include/jemalloc/internal/util.h
|
||||||
|
jemalloc/include/jemalloc/internal/witness.h
|
||||||
|
jemalloc/include/jemalloc/jemalloc.sh
|
||||||
|
jemalloc/include/jemalloc/jemalloc_defs.h.in
|
||||||
|
jemalloc/include/jemalloc/jemalloc_macros.h.in
|
||||||
|
jemalloc/include/jemalloc/jemalloc_mangle.sh
|
||||||
|
jemalloc/include/jemalloc/jemalloc_protos.h.in
|
||||||
|
jemalloc/include/jemalloc/jemalloc_rename.sh
|
||||||
|
jemalloc/include/jemalloc/jemalloc_typedefs.h.in
|
||||||
|
jemalloc/include/msvc_compat/C99/stdbool.h
|
||||||
|
jemalloc/include/msvc_compat/C99/stdint.h
|
||||||
|
jemalloc/include/msvc_compat/strings.h
|
||||||
|
jemalloc/include/msvc_compat/windows_extra.h
|
||||||
|
jemalloc/jemalloc.pc.in
|
||||||
|
jemalloc/m4/ax_cxx_compile_stdcxx.m4
|
||||||
|
jemalloc/msvc/ReadMe.txt
|
||||||
|
jemalloc/msvc/jemalloc_vc2015.sln
|
||||||
|
jemalloc/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj
|
||||||
|
jemalloc/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.cpp
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.h
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.vcxproj
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.vcxproj.filters
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads_main.cpp
|
||||||
|
jemalloc/run_tests.sh
|
||||||
|
jemalloc/scripts/gen_run_tests.py
|
||||||
|
jemalloc/scripts/gen_travis.py
|
||||||
|
jemalloc/src/arena.c
|
||||||
|
jemalloc/src/background_thread.c
|
||||||
|
jemalloc/src/base.c
|
||||||
|
jemalloc/src/bitmap.c
|
||||||
|
jemalloc/src/ckh.c
|
||||||
|
jemalloc/src/ctl.c
|
||||||
|
jemalloc/src/extent.c
|
||||||
|
jemalloc/src/extent_dss.c
|
||||||
|
jemalloc/src/extent_mmap.c
|
||||||
|
jemalloc/src/hash.c
|
||||||
|
jemalloc/src/hooks.c
|
||||||
|
jemalloc/src/jemalloc.c
|
||||||
|
jemalloc/src/jemalloc_cpp.cpp
|
||||||
|
jemalloc/src/large.c
|
||||||
|
jemalloc/src/malloc_io.c
|
||||||
|
jemalloc/src/mutex.c
|
||||||
|
jemalloc/src/mutex_pool.c
|
||||||
|
jemalloc/src/nstime.c
|
||||||
|
jemalloc/src/pages.c
|
||||||
|
jemalloc/src/prng.c
|
||||||
|
jemalloc/src/prof.c
|
||||||
|
jemalloc/src/rtree.c
|
||||||
|
jemalloc/src/spin.c
|
||||||
|
jemalloc/src/stats.c
|
||||||
|
jemalloc/src/sz.c
|
||||||
|
jemalloc/src/tcache.c
|
||||||
|
jemalloc/src/ticker.c
|
||||||
|
jemalloc/src/tsd.c
|
||||||
|
jemalloc/src/witness.c
|
||||||
|
jemalloc/src/zone.c
|
||||||
|
jemalloc/test/include/test/SFMT-alti.h
|
||||||
|
jemalloc/test/include/test/SFMT-params.h
|
||||||
|
jemalloc/test/include/test/SFMT-params11213.h
|
||||||
|
jemalloc/test/include/test/SFMT-params1279.h
|
||||||
|
jemalloc/test/include/test/SFMT-params132049.h
|
||||||
|
jemalloc/test/include/test/SFMT-params19937.h
|
||||||
|
jemalloc/test/include/test/SFMT-params216091.h
|
||||||
|
jemalloc/test/include/test/SFMT-params2281.h
|
||||||
|
jemalloc/test/include/test/SFMT-params4253.h
|
||||||
|
jemalloc/test/include/test/SFMT-params44497.h
|
||||||
|
jemalloc/test/include/test/SFMT-params607.h
|
||||||
|
jemalloc/test/include/test/SFMT-params86243.h
|
||||||
|
jemalloc/test/include/test/SFMT-sse2.h
|
||||||
|
jemalloc/test/include/test/SFMT.h
|
||||||
|
jemalloc/test/include/test/btalloc.h
|
||||||
|
jemalloc/test/include/test/extent_hooks.h
|
||||||
|
jemalloc/test/include/test/jemalloc_test.h.in
|
||||||
|
jemalloc/test/include/test/jemalloc_test_defs.h.in
|
||||||
|
jemalloc/test/include/test/math.h
|
||||||
|
jemalloc/test/include/test/mq.h
|
||||||
|
jemalloc/test/include/test/mtx.h
|
||||||
|
jemalloc/test/include/test/test.h
|
||||||
|
jemalloc/test/include/test/thd.h
|
||||||
|
jemalloc/test/include/test/timer.h
|
||||||
|
jemalloc/test/integration/MALLOCX_ARENA.c
|
||||||
|
jemalloc/test/integration/aligned_alloc.c
|
||||||
|
jemalloc/test/integration/allocated.c
|
||||||
|
jemalloc/test/integration/extent.c
|
||||||
|
jemalloc/test/integration/extent.sh
|
||||||
|
jemalloc/test/integration/mallocx.c
|
||||||
|
jemalloc/test/integration/mallocx.sh
|
||||||
|
jemalloc/test/integration/overflow.c
|
||||||
|
jemalloc/test/integration/posix_memalign.c
|
||||||
|
jemalloc/test/integration/rallocx.c
|
||||||
|
jemalloc/test/integration/sdallocx.c
|
||||||
|
jemalloc/test/integration/thread_arena.c
|
||||||
|
jemalloc/test/integration/thread_tcache_enabled.c
|
||||||
|
jemalloc/test/integration/xallocx.c
|
||||||
|
jemalloc/test/integration/xallocx.sh
|
||||||
|
jemalloc/test/src/SFMT.c
|
||||||
|
jemalloc/test/src/btalloc.c
|
||||||
|
jemalloc/test/src/btalloc_0.c
|
||||||
|
jemalloc/test/src/btalloc_1.c
|
||||||
|
jemalloc/test/src/math.c
|
||||||
|
jemalloc/test/src/mq.c
|
||||||
|
jemalloc/test/src/mtx.c
|
||||||
|
jemalloc/test/src/test.c
|
||||||
|
jemalloc/test/src/thd.c
|
||||||
|
jemalloc/test/src/timer.c
|
||||||
|
jemalloc/test/stress/microbench.c
|
||||||
|
jemalloc/test/test.sh.in
|
||||||
|
jemalloc/test/unit/SFMT.c
|
||||||
|
jemalloc/test/unit/a0.c
|
||||||
|
jemalloc/test/unit/arena_reset.c
|
||||||
|
jemalloc/test/unit/arena_reset_prof.c
|
||||||
|
jemalloc/test/unit/arena_reset_prof.sh
|
||||||
|
jemalloc/test/unit/atomic.c
|
||||||
|
jemalloc/test/unit/background_thread.c
|
||||||
|
jemalloc/test/unit/base.c
|
||||||
|
jemalloc/test/unit/bit_util.c
|
||||||
|
jemalloc/test/unit/bitmap.c
|
||||||
|
jemalloc/test/unit/ckh.c
|
||||||
|
jemalloc/test/unit/decay.c
|
||||||
|
jemalloc/test/unit/decay.sh
|
||||||
|
jemalloc/test/unit/extent_quantize.c
|
||||||
|
jemalloc/test/unit/fork.c
|
||||||
|
jemalloc/test/unit/hash.c
|
||||||
|
jemalloc/test/unit/hooks.c
|
||||||
|
jemalloc/test/unit/junk.c
|
||||||
|
jemalloc/test/unit/junk.sh
|
||||||
|
jemalloc/test/unit/junk_alloc.c
|
||||||
|
jemalloc/test/unit/junk_alloc.sh
|
||||||
|
jemalloc/test/unit/junk_free.c
|
||||||
|
jemalloc/test/unit/junk_free.sh
|
||||||
|
jemalloc/test/unit/mallctl.c
|
||||||
|
jemalloc/test/unit/malloc_io.c
|
||||||
|
jemalloc/test/unit/math.c
|
||||||
|
jemalloc/test/unit/mq.c
|
||||||
|
jemalloc/test/unit/mtx.c
|
||||||
|
jemalloc/test/unit/nstime.c
|
||||||
|
jemalloc/test/unit/pack.c
|
||||||
|
jemalloc/test/unit/pack.sh
|
||||||
|
jemalloc/test/unit/pages.c
|
||||||
|
jemalloc/test/unit/ph.c
|
||||||
|
jemalloc/test/unit/prng.c
|
||||||
|
jemalloc/test/unit/prof_accum.c
|
||||||
|
jemalloc/test/unit/prof_accum.sh
|
||||||
|
jemalloc/test/unit/prof_active.c
|
||||||
|
jemalloc/test/unit/prof_active.sh
|
||||||
|
jemalloc/test/unit/prof_gdump.c
|
||||||
|
jemalloc/test/unit/prof_gdump.sh
|
||||||
|
jemalloc/test/unit/prof_idump.c
|
||||||
|
jemalloc/test/unit/prof_idump.sh
|
||||||
|
jemalloc/test/unit/prof_reset.c
|
||||||
|
jemalloc/test/unit/prof_reset.sh
|
||||||
|
jemalloc/test/unit/prof_tctx.c
|
||||||
|
jemalloc/test/unit/prof_tctx.sh
|
||||||
|
jemalloc/test/unit/prof_thread_name.c
|
||||||
|
jemalloc/test/unit/prof_thread_name.sh
|
||||||
|
jemalloc/test/unit/ql.c
|
||||||
|
jemalloc/test/unit/qr.c
|
||||||
|
jemalloc/test/unit/rb.c
|
||||||
|
jemalloc/test/unit/retained.c
|
||||||
|
jemalloc/test/unit/rtree.c
|
||||||
|
jemalloc/test/unit/size_classes.c
|
||||||
|
jemalloc/test/unit/slab.c
|
||||||
|
jemalloc/test/unit/smoothstep.c
|
||||||
|
jemalloc/test/unit/spin.c
|
||||||
|
jemalloc/test/unit/stats.c
|
||||||
|
jemalloc/test/unit/stats_print.c
|
||||||
|
jemalloc/test/unit/ticker.c
|
||||||
|
jemalloc/test/unit/tsd.c
|
||||||
|
jemalloc/test/unit/witness.c
|
||||||
|
jemalloc/test/unit/zero.c
|
||||||
|
jemalloc/test/unit/zero.sh
|
||||||
|
build_jemalloc.sh
|
435
Makefile.am
Normal file
435
Makefile.am
Normal file
@ -0,0 +1,435 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/jemalloc/obj/include
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libmemkind.la
|
||||||
|
|
||||||
|
libmemkind_la_SOURCES = src/hbwmalloc.c \
|
||||||
|
src/heap_manager.c \
|
||||||
|
src/memkind_arena.c \
|
||||||
|
src/memkind.c \
|
||||||
|
src/memkind_default.c \
|
||||||
|
src/memkind_gbtlb.c \
|
||||||
|
src/memkind_hbw.c \
|
||||||
|
src/memkind_regular.c \
|
||||||
|
src/memkind_hugetlb.c \
|
||||||
|
src/memkind_pmem.c \
|
||||||
|
src/memkind_interleave.c \
|
||||||
|
src/memkind_log.c \
|
||||||
|
src/tbb_wrapper.c \
|
||||||
|
# end
|
||||||
|
|
||||||
|
|
||||||
|
libmemkind_la_LIBADD = jemalloc/obj/lib/libjemalloc_pic.a
|
||||||
|
libmemkind_la_LDFLAGS = -version-info 0:1:0 -ldl
|
||||||
|
include_HEADERS = include/hbwmalloc.h \
|
||||||
|
include/hbw_allocator.h \
|
||||||
|
include/pmem_allocator.h \
|
||||||
|
include/memkind.h \
|
||||||
|
include/memkind_deprecated.h \
|
||||||
|
# end
|
||||||
|
|
||||||
|
nonstandardincludedir = $(includedir)/memkind/internal
|
||||||
|
nonstandardinclude_HEADERS = include/memkind/internal/memkind_arena.h \
|
||||||
|
include/memkind/internal/heap_manager.h \
|
||||||
|
include/memkind/internal/memkind_default.h \
|
||||||
|
include/memkind/internal/memkind_gbtlb.h \
|
||||||
|
include/memkind/internal/memkind_hbw.h \
|
||||||
|
include/memkind/internal/memkind_regular.h \
|
||||||
|
include/memkind/internal/memkind_hugetlb.h \
|
||||||
|
include/memkind/internal/memkind_interleave.h \
|
||||||
|
include/memkind/internal/memkind_pmem.h \
|
||||||
|
include/memkind/internal/memkind_private.h \
|
||||||
|
include/memkind/internal/memkind_log.h \
|
||||||
|
include/memkind/internal/tbb_wrapper.h \
|
||||||
|
include/memkind/internal/tbb_mem_pool_policy.h \
|
||||||
|
# end
|
||||||
|
|
||||||
|
EXTRA_DIST = astyle.sh \
|
||||||
|
autogen.sh \
|
||||||
|
build.sh \
|
||||||
|
build_jemalloc.sh \
|
||||||
|
examples/README \
|
||||||
|
test/test.sh \
|
||||||
|
VERSION \
|
||||||
|
CONTRIBUTING \
|
||||||
|
memkind-$(VERSION).spec \
|
||||||
|
memkind.spec.mk \
|
||||||
|
jemalloc/.appveyor.yml \
|
||||||
|
jemalloc/.autom4te.cfg \
|
||||||
|
jemalloc/.gitattributes \
|
||||||
|
jemalloc/.gitignore \
|
||||||
|
jemalloc/.travis.yml \
|
||||||
|
jemalloc/COPYING \
|
||||||
|
jemalloc/ChangeLog \
|
||||||
|
jemalloc/INSTALL.md \
|
||||||
|
jemalloc/Makefile.in \
|
||||||
|
jemalloc/README \
|
||||||
|
jemalloc/autogen.sh \
|
||||||
|
jemalloc/bin/jemalloc-config.in \
|
||||||
|
jemalloc/bin/jemalloc.sh.in \
|
||||||
|
jemalloc/bin/jeprof.in \
|
||||||
|
jemalloc/build-aux/config.guess \
|
||||||
|
jemalloc/build-aux/config.sub \
|
||||||
|
jemalloc/build-aux/install-sh \
|
||||||
|
jemalloc/config.stamp.in \
|
||||||
|
jemalloc/configure.ac \
|
||||||
|
jemalloc/doc/html.xsl.in \
|
||||||
|
jemalloc/doc/jemalloc.xml.in \
|
||||||
|
jemalloc/doc/manpages.xsl.in \
|
||||||
|
jemalloc/doc/stylesheet.xsl \
|
||||||
|
jemalloc/include/jemalloc/internal/arena_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/arena_inlines_a.h \
|
||||||
|
jemalloc/include/jemalloc/internal/arena_inlines_b.h \
|
||||||
|
jemalloc/include/jemalloc/internal/arena_structs_a.h \
|
||||||
|
jemalloc/include/jemalloc/internal/arena_structs_b.h \
|
||||||
|
jemalloc/include/jemalloc/internal/arena_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/assert.h \
|
||||||
|
jemalloc/include/jemalloc/internal/atomic.h \
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_c11.h \
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h \
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_gcc_sync.h \
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_msvc.h \
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_inlines.h \
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_structs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/base_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/base_inlines.h \
|
||||||
|
jemalloc/include/jemalloc/internal/base_structs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/base_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/bit_util.h \
|
||||||
|
jemalloc/include/jemalloc/internal/bitmap.h \
|
||||||
|
jemalloc/include/jemalloc/internal/ckh.h \
|
||||||
|
jemalloc/include/jemalloc/internal/ctl.h \
|
||||||
|
jemalloc/include/jemalloc/internal/extent_dss.h \
|
||||||
|
jemalloc/include/jemalloc/internal/extent_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/extent_inlines.h \
|
||||||
|
jemalloc/include/jemalloc/internal/extent_mmap.h \
|
||||||
|
jemalloc/include/jemalloc/internal/extent_structs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/extent_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/hash.h \
|
||||||
|
jemalloc/include/jemalloc/internal/hooks.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h.in \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_includes.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in \
|
||||||
|
jemalloc/include/jemalloc/internal/large_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/malloc_io.h \
|
||||||
|
jemalloc/include/jemalloc/internal/mutex.h \
|
||||||
|
jemalloc/include/jemalloc/internal/mutex_pool.h \
|
||||||
|
jemalloc/include/jemalloc/internal/mutex_prof.h \
|
||||||
|
jemalloc/include/jemalloc/internal/nstime.h \
|
||||||
|
jemalloc/include/jemalloc/internal/pages.h \
|
||||||
|
jemalloc/include/jemalloc/internal/ph.h \
|
||||||
|
jemalloc/include/jemalloc/internal/private_namespace.sh \
|
||||||
|
jemalloc/include/jemalloc/internal/private_symbols.sh \
|
||||||
|
jemalloc/include/jemalloc/internal/prng.h \
|
||||||
|
jemalloc/include/jemalloc/internal/prof_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/prof_inlines_a.h \
|
||||||
|
jemalloc/include/jemalloc/internal/prof_inlines_b.h \
|
||||||
|
jemalloc/include/jemalloc/internal/prof_structs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/prof_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/public_namespace.sh \
|
||||||
|
jemalloc/include/jemalloc/internal/public_unnamespace.sh \
|
||||||
|
jemalloc/include/jemalloc/internal/ql.h \
|
||||||
|
jemalloc/include/jemalloc/internal/qr.h \
|
||||||
|
jemalloc/include/jemalloc/internal/rb.h \
|
||||||
|
jemalloc/include/jemalloc/internal/rtree.h \
|
||||||
|
jemalloc/include/jemalloc/internal/rtree_tsd.h \
|
||||||
|
jemalloc/include/jemalloc/internal/size_classes.sh \
|
||||||
|
jemalloc/include/jemalloc/internal/smoothstep.h \
|
||||||
|
jemalloc/include/jemalloc/internal/smoothstep.sh \
|
||||||
|
jemalloc/include/jemalloc/internal/spin.h \
|
||||||
|
jemalloc/include/jemalloc/internal/stats.h \
|
||||||
|
jemalloc/include/jemalloc/internal/stats_tsd.h \
|
||||||
|
jemalloc/include/jemalloc/internal/sz.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_externs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_inlines.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_structs.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/ticker.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tsd.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_generic.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_malloc_thread_cleanup.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_tls.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_types.h \
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_win.h \
|
||||||
|
jemalloc/include/jemalloc/internal/util.h \
|
||||||
|
jemalloc/include/jemalloc/internal/witness.h \
|
||||||
|
jemalloc/include/jemalloc/jemalloc.sh \
|
||||||
|
jemalloc/include/jemalloc/jemalloc_defs.h.in \
|
||||||
|
jemalloc/include/jemalloc/jemalloc_macros.h.in \
|
||||||
|
jemalloc/include/jemalloc/jemalloc_mangle.sh \
|
||||||
|
jemalloc/include/jemalloc/jemalloc_protos.h.in \
|
||||||
|
jemalloc/include/jemalloc/jemalloc_rename.sh \
|
||||||
|
jemalloc/include/jemalloc/jemalloc_typedefs.h.in \
|
||||||
|
jemalloc/include/msvc_compat/C99/stdbool.h \
|
||||||
|
jemalloc/include/msvc_compat/C99/stdint.h \
|
||||||
|
jemalloc/include/msvc_compat/strings.h \
|
||||||
|
jemalloc/include/msvc_compat/windows_extra.h \
|
||||||
|
jemalloc/jemalloc.pc.in \
|
||||||
|
jemalloc/m4/ax_cxx_compile_stdcxx.m4 \
|
||||||
|
jemalloc/msvc/ReadMe.txt \
|
||||||
|
jemalloc/msvc/jemalloc_vc2015.sln \
|
||||||
|
jemalloc/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj \
|
||||||
|
jemalloc/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters \
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.cpp \
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.h \
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.vcxproj \
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.vcxproj.filters \
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads_main.cpp \
|
||||||
|
jemalloc/run_tests.sh \
|
||||||
|
jemalloc/scripts/gen_run_tests.py \
|
||||||
|
jemalloc/scripts/gen_travis.py \
|
||||||
|
jemalloc/src/arena.c \
|
||||||
|
jemalloc/src/background_thread.c \
|
||||||
|
jemalloc/src/base.c \
|
||||||
|
jemalloc/src/bitmap.c \
|
||||||
|
jemalloc/src/ckh.c \
|
||||||
|
jemalloc/src/ctl.c \
|
||||||
|
jemalloc/src/extent.c \
|
||||||
|
jemalloc/src/extent_dss.c \
|
||||||
|
jemalloc/src/extent_mmap.c \
|
||||||
|
jemalloc/src/hash.c \
|
||||||
|
jemalloc/src/hooks.c \
|
||||||
|
jemalloc/src/jemalloc.c \
|
||||||
|
jemalloc/src/jemalloc_cpp.cpp \
|
||||||
|
jemalloc/src/large.c \
|
||||||
|
jemalloc/src/malloc_io.c \
|
||||||
|
jemalloc/src/mutex.c \
|
||||||
|
jemalloc/src/mutex_pool.c \
|
||||||
|
jemalloc/src/nstime.c \
|
||||||
|
jemalloc/src/pages.c \
|
||||||
|
jemalloc/src/prng.c \
|
||||||
|
jemalloc/src/prof.c \
|
||||||
|
jemalloc/src/rtree.c \
|
||||||
|
jemalloc/src/spin.c \
|
||||||
|
jemalloc/src/stats.c \
|
||||||
|
jemalloc/src/sz.c \
|
||||||
|
jemalloc/src/tcache.c \
|
||||||
|
jemalloc/src/ticker.c \
|
||||||
|
jemalloc/src/tsd.c \
|
||||||
|
jemalloc/src/witness.c \
|
||||||
|
jemalloc/src/zone.c \
|
||||||
|
jemalloc/test/include/test/SFMT-alti.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params11213.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params1279.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params132049.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params19937.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params216091.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params2281.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params4253.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params44497.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params607.h \
|
||||||
|
jemalloc/test/include/test/SFMT-params86243.h \
|
||||||
|
jemalloc/test/include/test/SFMT-sse2.h \
|
||||||
|
jemalloc/test/include/test/SFMT.h \
|
||||||
|
jemalloc/test/include/test/btalloc.h \
|
||||||
|
jemalloc/test/include/test/extent_hooks.h \
|
||||||
|
jemalloc/test/include/test/jemalloc_test.h.in \
|
||||||
|
jemalloc/test/include/test/jemalloc_test_defs.h.in \
|
||||||
|
jemalloc/test/include/test/math.h \
|
||||||
|
jemalloc/test/include/test/mq.h \
|
||||||
|
jemalloc/test/include/test/mtx.h \
|
||||||
|
jemalloc/test/include/test/test.h \
|
||||||
|
jemalloc/test/include/test/thd.h \
|
||||||
|
jemalloc/test/include/test/timer.h \
|
||||||
|
jemalloc/test/integration/MALLOCX_ARENA.c \
|
||||||
|
jemalloc/test/integration/aligned_alloc.c \
|
||||||
|
jemalloc/test/integration/allocated.c \
|
||||||
|
jemalloc/test/integration/extent.c \
|
||||||
|
jemalloc/test/integration/extent.sh \
|
||||||
|
jemalloc/test/integration/mallocx.c \
|
||||||
|
jemalloc/test/integration/mallocx.sh \
|
||||||
|
jemalloc/test/integration/overflow.c \
|
||||||
|
jemalloc/test/integration/posix_memalign.c \
|
||||||
|
jemalloc/test/integration/rallocx.c \
|
||||||
|
jemalloc/test/integration/sdallocx.c \
|
||||||
|
jemalloc/test/integration/thread_arena.c \
|
||||||
|
jemalloc/test/integration/thread_tcache_enabled.c \
|
||||||
|
jemalloc/test/integration/xallocx.c \
|
||||||
|
jemalloc/test/integration/xallocx.sh \
|
||||||
|
jemalloc/test/src/SFMT.c \
|
||||||
|
jemalloc/test/src/btalloc.c \
|
||||||
|
jemalloc/test/src/btalloc_0.c \
|
||||||
|
jemalloc/test/src/btalloc_1.c \
|
||||||
|
jemalloc/test/src/math.c \
|
||||||
|
jemalloc/test/src/mq.c \
|
||||||
|
jemalloc/test/src/mtx.c \
|
||||||
|
jemalloc/test/src/test.c \
|
||||||
|
jemalloc/test/src/thd.c \
|
||||||
|
jemalloc/test/src/timer.c \
|
||||||
|
jemalloc/test/stress/microbench.c \
|
||||||
|
jemalloc/test/test.sh.in \
|
||||||
|
jemalloc/test/unit/SFMT.c \
|
||||||
|
jemalloc/test/unit/a0.c \
|
||||||
|
jemalloc/test/unit/arena_reset.c \
|
||||||
|
jemalloc/test/unit/arena_reset_prof.c \
|
||||||
|
jemalloc/test/unit/arena_reset_prof.sh \
|
||||||
|
jemalloc/test/unit/atomic.c \
|
||||||
|
jemalloc/test/unit/background_thread.c \
|
||||||
|
jemalloc/test/unit/base.c \
|
||||||
|
jemalloc/test/unit/bit_util.c \
|
||||||
|
jemalloc/test/unit/bitmap.c \
|
||||||
|
jemalloc/test/unit/ckh.c \
|
||||||
|
jemalloc/test/unit/decay.c \
|
||||||
|
jemalloc/test/unit/decay.sh \
|
||||||
|
jemalloc/test/unit/extent_quantize.c \
|
||||||
|
jemalloc/test/unit/fork.c \
|
||||||
|
jemalloc/test/unit/hash.c \
|
||||||
|
jemalloc/test/unit/hooks.c \
|
||||||
|
jemalloc/test/unit/junk.c \
|
||||||
|
jemalloc/test/unit/junk.sh \
|
||||||
|
jemalloc/test/unit/junk_alloc.c \
|
||||||
|
jemalloc/test/unit/junk_alloc.sh \
|
||||||
|
jemalloc/test/unit/junk_free.c \
|
||||||
|
jemalloc/test/unit/junk_free.sh \
|
||||||
|
jemalloc/test/unit/mallctl.c \
|
||||||
|
jemalloc/test/unit/malloc_io.c \
|
||||||
|
jemalloc/test/unit/math.c \
|
||||||
|
jemalloc/test/unit/mq.c \
|
||||||
|
jemalloc/test/unit/mtx.c \
|
||||||
|
jemalloc/test/unit/nstime.c \
|
||||||
|
jemalloc/test/unit/pack.c \
|
||||||
|
jemalloc/test/unit/pack.sh \
|
||||||
|
jemalloc/test/unit/pages.c \
|
||||||
|
jemalloc/test/unit/ph.c \
|
||||||
|
jemalloc/test/unit/prng.c \
|
||||||
|
jemalloc/test/unit/prof_accum.c \
|
||||||
|
jemalloc/test/unit/prof_accum.sh \
|
||||||
|
jemalloc/test/unit/prof_active.c \
|
||||||
|
jemalloc/test/unit/prof_active.sh \
|
||||||
|
jemalloc/test/unit/prof_gdump.c \
|
||||||
|
jemalloc/test/unit/prof_gdump.sh \
|
||||||
|
jemalloc/test/unit/prof_idump.c \
|
||||||
|
jemalloc/test/unit/prof_idump.sh \
|
||||||
|
jemalloc/test/unit/prof_reset.c \
|
||||||
|
jemalloc/test/unit/prof_reset.sh \
|
||||||
|
jemalloc/test/unit/prof_tctx.c \
|
||||||
|
jemalloc/test/unit/prof_tctx.sh \
|
||||||
|
jemalloc/test/unit/prof_thread_name.c \
|
||||||
|
jemalloc/test/unit/prof_thread_name.sh \
|
||||||
|
jemalloc/test/unit/ql.c \
|
||||||
|
jemalloc/test/unit/qr.c \
|
||||||
|
jemalloc/test/unit/rb.c \
|
||||||
|
jemalloc/test/unit/retained.c \
|
||||||
|
jemalloc/test/unit/rtree.c \
|
||||||
|
jemalloc/test/unit/size_classes.c \
|
||||||
|
jemalloc/test/unit/slab.c \
|
||||||
|
jemalloc/test/unit/smoothstep.c \
|
||||||
|
jemalloc/test/unit/spin.c \
|
||||||
|
jemalloc/test/unit/stats.c \
|
||||||
|
jemalloc/test/unit/stats_print.c \
|
||||||
|
jemalloc/test/unit/ticker.c \
|
||||||
|
jemalloc/test/unit/tsd.c \
|
||||||
|
jemalloc/test/unit/witness.c \
|
||||||
|
jemalloc/test/unit/zero.c \
|
||||||
|
jemalloc/test/unit/zero.sh \
|
||||||
|
build_jemalloc.sh \
|
||||||
|
# end
|
||||||
|
|
||||||
|
dist_doc_DATA = README COPYING VERSION
|
||||||
|
dist_man_MANS = man/memkind-hbw-nodes.1 \
|
||||||
|
man/hbwmalloc.3 \
|
||||||
|
man/memkind.3 \
|
||||||
|
man/memkind_arena.3 \
|
||||||
|
man/memkind_default.3 \
|
||||||
|
man/memkind_hbw.3 \
|
||||||
|
man/memkind_hugetlb.3 \
|
||||||
|
man/memkind_pmem.3 \
|
||||||
|
man/hbwallocator.3 \
|
||||||
|
man/pmemallocator.3 \
|
||||||
|
man/autohbw.7 \
|
||||||
|
# end
|
||||||
|
|
||||||
|
CLEANFILES = memkind-$(VERSION).spec
|
||||||
|
DISTCLEANFILES = VERSION
|
||||||
|
|
||||||
|
bin_PROGRAMS = memkind-hbw-nodes
|
||||||
|
|
||||||
|
memkind_hbw_nodes_SOURCES = src/memkind-hbw-nodes.c
|
||||||
|
memkind_hbw_nodes_LDADD = libmemkind.la
|
||||||
|
|
||||||
|
bin_SCRIPTS =
|
||||||
|
check_PROGRAMS =
|
||||||
|
noinst_PROGRAMS =
|
||||||
|
noinst_LTLIBRARIES =
|
||||||
|
noinst_HEADERS =
|
||||||
|
TESTS =
|
||||||
|
|
||||||
|
req_flags = -fvisibility=hidden -Wall -Werror -msse4.2 -D_GNU_SOURCE -DMEMKIND_INTERNAL_API -DJE_PREFIX=$(JE_PREFIX)
|
||||||
|
|
||||||
|
AM_CFLAGS = $(req_flags)
|
||||||
|
AM_CXXFLAGS = $(req_flags)
|
||||||
|
|
||||||
|
.PHONY: checkprogs
|
||||||
|
|
||||||
|
# create libtool .lo files from jemalloc objects
|
||||||
|
$(jemalloc_objects): jemalloc/obj/src/%.lo: jemalloc/obj/src/%.pic.o jemalloc/obj/src/%.o
|
||||||
|
@echo "# $@ - a libtool object file" > $@
|
||||||
|
@echo "# Generated by "`libtool --version | head -n 1` >> $@
|
||||||
|
@echo "# Actually generated by memkind build system spoofing libtool" >> $@
|
||||||
|
@echo "pic_object='$*.pic.o'" >> $@
|
||||||
|
@echo "non_pic_object='$*.o'" >> $@
|
||||||
|
|
||||||
|
# build check programs without running tests
|
||||||
|
checkprogs: libmemkind.la $(check_PROGRAMS)
|
||||||
|
|
||||||
|
memkind-$(VERSION).spec:
|
||||||
|
$(MAKE) version="$(VERSION)" -f memkind.spec.mk $@
|
||||||
|
|
||||||
|
rpm: dist
|
||||||
|
$(MAKE) version="$(VERSION)" CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" \
|
||||||
|
-f memkind.spec.mk $@
|
||||||
|
|
||||||
|
all: static_lib
|
||||||
|
|
||||||
|
# the script merge memkind and jemalloc libraries into one static library.
|
||||||
|
define ar_prog
|
||||||
|
create libmemkind.a\n\
|
||||||
|
addlib .libs/libmemkind.a\n\
|
||||||
|
addlib jemalloc/obj/lib/libjemalloc_pic.a\n\
|
||||||
|
save\n\
|
||||||
|
end
|
||||||
|
endef
|
||||||
|
|
||||||
|
static_lib: jemalloc/obj/lib/libjemalloc_pic.a libmemkind.la
|
||||||
|
bash -c "ar -M < <(echo -e '$(ar_prog)')"
|
||||||
|
cp libmemkind.a .libs/
|
||||||
|
rm libmemkind.a
|
||||||
|
|
||||||
|
|
||||||
|
include autohbw/Makefile.mk
|
||||||
|
include test/Makefile.mk
|
||||||
|
include examples/Makefile.mk
|
||||||
|
include src/Makefile.mk
|
42
NEWS
Normal file
42
NEWS
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
OPEN DEVELOPMENT
|
||||||
|
================
|
||||||
|
|
||||||
|
We are moving to a more open development model with memkind.
|
||||||
|
|
||||||
|
- The memkind github organization:
|
||||||
|
https://github.com/memkind
|
||||||
|
|
||||||
|
- Rather than posting bulk patches at time of tag, we are posting more
|
||||||
|
incremental patches with finer grain commit details.
|
||||||
|
|
||||||
|
- There is now a "dev" branch in the memkind repository and a
|
||||||
|
"memkind-dev" branch in the memkind fork of the jemalloc repository.
|
||||||
|
These will be used for open development work.
|
||||||
|
|
||||||
|
- There is a memkind web page here:
|
||||||
|
http://memkind.github.io/memkind
|
||||||
|
|
||||||
|
- We have posted an architecture document here:
|
||||||
|
http://memkind.github.io/memkind/memkind_arch_20150318.pdf
|
||||||
|
|
||||||
|
- We invite you to join the memkind mailing list:
|
||||||
|
https://lists.01.org/mailman/listinfo/memkind
|
||||||
|
|
||||||
|
- Feel free to open a github issue, especially if there is a TODO item
|
||||||
|
that you would like to prioritize.
|
||||||
|
|
||||||
|
- We have posted source and binary RPMs for several distributions here:
|
||||||
|
http://download.opensuse.org/repositories/home:/cmcantalupo/
|
||||||
|
|
||||||
|
- memkind is also avaiable in Fedora package repository (devel, EPEL7):
|
||||||
|
https://admin.fedoraproject.org/pkgdb/package/memkind/
|
||||||
|
|
||||||
|
- Pull requests are welcome.
|
||||||
|
|
||||||
|
- White space formatting generally conforms to
|
||||||
|
$ astyle --style=linux --indent=spaces=4 -S --max-continuation-indent=80 \
|
||||||
|
--max-code-length=80 --break-after-logical --indent-namespaces -z2 \
|
||||||
|
--align-pointer=name
|
||||||
|
|
||||||
|
- For more information about astyle:
|
||||||
|
http://astyle.sourceforge.net/
|
29
PULL_REQUEST_TEMPLATE.md
Normal file
29
PULL_REQUEST_TEMPLATE.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<!--- Provide a general summary of your changes in the Title above -->
|
||||||
|
|
||||||
|
### Description
|
||||||
|
<!--- Describe your changes in detail -->
|
||||||
|
<!--- If it fixes an open issue, please link to the issue here. -->
|
||||||
|
|
||||||
|
### Types of changes
|
||||||
|
<!--- Put an `x` in the box(es) that apply -->
|
||||||
|
|
||||||
|
- [ ] Bugfix (non-breaking change which fixes issue linked in Description above)
|
||||||
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
|
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||||
|
- [ ] Documentation (correction or otherwise)
|
||||||
|
- [ ] Cosmetics (whitespace, appearance)
|
||||||
|
- [ ] Other
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
<!--- Put an `x` in the box(es) that apply -->
|
||||||
|
|
||||||
|
- [ ] Code compiles without errors
|
||||||
|
- [ ] All tests pass locally with my changes (see TESTING section in CONTRIBUTING file)
|
||||||
|
- [ ] Created tests which will fail without the change (if possible)
|
||||||
|
- [ ] Extended the README/documentation (if necessary)
|
||||||
|
- [ ] All newly added files have proprietary license (if necessary)
|
||||||
|
- [ ] All newly added files are referenced in MANIFEST files (if necessary)
|
||||||
|
|
||||||
|
## Further comments
|
||||||
|
<!--- If this is a relatively large or complex change, kick off the discussion by explaining why you -->
|
||||||
|
<!--- choose the solution you did and what alternatives you considered, etc... -->
|
251
README
Normal file
251
README
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
MEMKIND
|
||||||
|
=======
|
||||||
|
|
||||||
|
[](https://travis-ci.org/memkind/memkind)
|
||||||
|
[](https://github.com/memkind/memkind/releases/latest)
|
||||||
|
[](http://codecov.io/gh/memkind/memkind?branch=master)
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
----------
|
||||||
|
SEE COPYING FILE FOR LICENSE INFORMATION.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED AS A DEVELOPMENT SNAPSHOT TO AID
|
||||||
|
COLLABORATION AND WAS NOT ISSUED AS A RELEASED PRODUCT BY INTEL.
|
||||||
|
|
||||||
|
|
||||||
|
LAST UPDATE
|
||||||
|
-----------
|
||||||
|
Krzysztof Kulakowski <krzysztof.kulakowski@intel.com>
|
||||||
|
Tuesday Mar 1 2016
|
||||||
|
|
||||||
|
SUMMARY
|
||||||
|
-------
|
||||||
|
The memkind library is a user extensible heap manager built on top of
|
||||||
|
jemalloc which enables control of memory characteristics and a
|
||||||
|
partitioning of the heap between kinds of memory. The kinds of memory
|
||||||
|
are defined by operating system memory policies that have been applied
|
||||||
|
to virtual address ranges. Memory characteristics supported by
|
||||||
|
memkind without user extension include control of NUMA and page size
|
||||||
|
features. The jemalloc non-standard interface has been extended to
|
||||||
|
enable specialized arenas to make requests for virtual memory from the
|
||||||
|
operating system through the memkind partition interface. Through the
|
||||||
|
other memkind interfaces the user can control and extend memory
|
||||||
|
partition features and allocate memory while selecting enabled
|
||||||
|
features.
|
||||||
|
|
||||||
|
API
|
||||||
|
---
|
||||||
|
The memkind library delivers two interfaces:
|
||||||
|
* hbwmalloc.h - recommended for high-bandwidth memory use cases (stable)
|
||||||
|
* memkind.h - generic interface for more complex use cases (partially unstable)
|
||||||
|
|
||||||
|
For more detailed information about those interfaces see
|
||||||
|
corresponding manpages (located in man/ subdir):
|
||||||
|
|
||||||
|
man memkind
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
man hbwmalloc
|
||||||
|
|
||||||
|
BUILD REQUIREMENTS
|
||||||
|
------------------
|
||||||
|
To build the memkind libraries on a RHEL Linux system first install
|
||||||
|
the required packages with the following command:
|
||||||
|
|
||||||
|
sudo yum install numactl-devel gcc-c++ unzip
|
||||||
|
|
||||||
|
On a SLES Linux system install the dependencies with the following
|
||||||
|
command:
|
||||||
|
|
||||||
|
sudo zypper install libnuma-devel gcc-c++ unzip
|
||||||
|
|
||||||
|
The memkind library uses the GNU autotools (Autoconf, Automake,
|
||||||
|
Libtool and m4) for configuration and build. The configure scripts
|
||||||
|
and gtest source code are distributed with the source tarball included
|
||||||
|
in the source RPM, and this tarball is created with the memkind "make
|
||||||
|
dist" target. In contrast to the distributed source tarball, the git
|
||||||
|
repository does not include any generated files nor the gtest source
|
||||||
|
code. For this reason some additional steps are required when
|
||||||
|
building from a checkout of the git repo. Those steps include running
|
||||||
|
the bash script called "autogen.sh" prior to configure. This script
|
||||||
|
will populate a VERSION file based on "git describe", and use
|
||||||
|
autoreconf to generate a configure script. The gtest library is
|
||||||
|
required for building the test content. This is downloaded
|
||||||
|
automatically prior to building the test content from the googlecode
|
||||||
|
website based on a target describe in memkind/test/Makefile.mk.
|
||||||
|
|
||||||
|
BUILDING
|
||||||
|
--------
|
||||||
|
|
||||||
|
a) Building jemalloc
|
||||||
|
|
||||||
|
The memkind library has a dependency on a related fork of jemalloc.
|
||||||
|
|
||||||
|
The jemalloc source was forked from jemalloc version 5.0. This source tree
|
||||||
|
is located within the jemalloc subdirectory of the memkind source. The jemalloc
|
||||||
|
source code has been kept close to the original form, and in particular
|
||||||
|
the build system has been lightly modified.
|
||||||
|
The developer must configure and build jemalloc prior to configuring
|
||||||
|
and building memkind. You can do that using included shell script:
|
||||||
|
|
||||||
|
export JE_PREFIX=jemk_
|
||||||
|
./build_jemalloc.sh
|
||||||
|
|
||||||
|
Alternatively you can follow this step-by-step instruction:
|
||||||
|
|
||||||
|
cd jemalloc
|
||||||
|
autoconf
|
||||||
|
mkdir obj
|
||||||
|
cd obj
|
||||||
|
../configure --enable-autogen --with-jemalloc-prefix=jemk_ --without-export \
|
||||||
|
--disable-stats --disable-fill \
|
||||||
|
--with-malloc-conf="narenas:256,lg_tcache_max:12"
|
||||||
|
make
|
||||||
|
cd ../..
|
||||||
|
|
||||||
|
Note: JE_PREFIX can be set to arbitrary value, including empty one.
|
||||||
|
|
||||||
|
b) Building memkind
|
||||||
|
|
||||||
|
Building and installing memkind can be as simple as typing the following while
|
||||||
|
in the root directory of the source tree:
|
||||||
|
|
||||||
|
./build.sh
|
||||||
|
make install
|
||||||
|
|
||||||
|
Alternatively you can follow this step-by-step instruction:
|
||||||
|
|
||||||
|
export JE_PREFIX=jemk_
|
||||||
|
./autogen.sh
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
this should configure, build, and install this package.
|
||||||
|
|
||||||
|
See the output of:
|
||||||
|
|
||||||
|
./configure --help
|
||||||
|
|
||||||
|
for more information about either the memkind or the jemalloc
|
||||||
|
configuration options. Some useful information about building with autotools
|
||||||
|
can also be found in the INSTALL file.
|
||||||
|
|
||||||
|
**Important Notes:**
|
||||||
|
|
||||||
|
If you are using build.sh script and later want to call 'make' command directly,
|
||||||
|
then you need to call firstly:
|
||||||
|
|
||||||
|
export JE_PREFIX=jemk_
|
||||||
|
|
||||||
|
otherwise you will get an error like:
|
||||||
|
|
||||||
|
undefined reference to mallocx
|
||||||
|
|
||||||
|
RUN REQUIREMENTS
|
||||||
|
----------------
|
||||||
|
Requires kernel patch introduced in Linux v3.11 that impacts
|
||||||
|
functionality of the NUMA system calls. This is patch is commit
|
||||||
|
3964acd0dbec123aa0a621973a2a0580034b4788 in the linux-stable git
|
||||||
|
repository from kernel.org. Red Hat has back-ported this patch to the
|
||||||
|
v3.10 kernel in the RHEL 7.0 GA release, so RHEL 7.0 onward supports
|
||||||
|
memkind even though this kernel version predates v3.11.
|
||||||
|
|
||||||
|
Functionality related to hugepages allocation require patches
|
||||||
|
e0ec90ee7e6f6cbaa6d59ffb48d2a7af5e80e61d and
|
||||||
|
099730d67417dfee273e9b10ac2560ca7fac7eb9 from kernel org. Without them
|
||||||
|
physical memory may end up being located on incorrect NUMA node.
|
||||||
|
|
||||||
|
Applications using the memkind library require that libnuma and
|
||||||
|
libpthread be available for dynamic linking at run time. Both of
|
||||||
|
these libraries should be available by default, but they can be
|
||||||
|
installed on RHEL Linux with the following command:
|
||||||
|
|
||||||
|
sudo yum install pthread numactl
|
||||||
|
|
||||||
|
and on a SLES Linux system with:
|
||||||
|
|
||||||
|
sudo zypper install pthread libnuma
|
||||||
|
|
||||||
|
To use the interfaces for obtaining 2MB pages please be sure
|
||||||
|
to follow the instructions here:
|
||||||
|
https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
|
||||||
|
and pay particular attention to the use of the procfs files:
|
||||||
|
/proc/sys/vm/nr_hugepages
|
||||||
|
/proc/sys/vm/nr_overcommit_hugepages
|
||||||
|
for enabling the kernel's huge page pool.
|
||||||
|
|
||||||
|
To use the file-backed kind of memory (PMEM), please be sure that
|
||||||
|
filesystem which is used for PMEM kind supports FALLOC_FL_PUNCH_HOLE flag:
|
||||||
|
http://man7.org/linux/man-pages/man2/fallocate.2.html
|
||||||
|
|
||||||
|
SETTING LOGGING MECHANISM
|
||||||
|
-------------------------
|
||||||
|
In memkind library logging mechanism could be enabled by setting MEMKIND_DEBUG
|
||||||
|
environment variable. Setting MEMKIND_DEBUG to "1" enables printing messages
|
||||||
|
like errors and general information about environment to stderr.
|
||||||
|
|
||||||
|
SETTING HEAP MANAGER
|
||||||
|
--------------------
|
||||||
|
In memkind library heap management can be adjusted with MEMKIND_HEAP_MANAGER
|
||||||
|
environment variable, which allows for switching to one of the available
|
||||||
|
heap managers.
|
||||||
|
Values:
|
||||||
|
JEMALLOC – sets the jemalloc heap manager
|
||||||
|
TBB – sets Intel Threading Building Blocks heap manager. This option requires installed
|
||||||
|
Intel Threading Building Blocks library.
|
||||||
|
If the MEMKIND_HEAP_MANAGER is not set then the jemalloc heap manager will be used by default.
|
||||||
|
|
||||||
|
TESTING
|
||||||
|
-------
|
||||||
|
All existing tests pass. For more information on how to execute tests
|
||||||
|
see the CONTRIBUTING file.
|
||||||
|
|
||||||
|
When tests are run on a NUMA platform without high bandwidth memory
|
||||||
|
the MEMKIND_HBW_NODES environment variable is used in conjunction with
|
||||||
|
"numactl --membind" to force standard allocations to one NUMA node and
|
||||||
|
high bandwidth allocations through a different NUMA node. See next
|
||||||
|
section for more details.
|
||||||
|
|
||||||
|
|
||||||
|
SIMULATE HIGH BANDWIDTH MEMORY
|
||||||
|
------------------------------
|
||||||
|
A method for testing for the benefit of high bandwidth memory on a
|
||||||
|
dual socket Intel(R) Xeon(TM) system is to use the QPI bus to simulate
|
||||||
|
slow memory. This is not an accurate model of the bandwidth and
|
||||||
|
latency characteristics of the Intel's 2nd generation Intel(R) Xeon Phi(TM)
|
||||||
|
Product Family on package memory, but is a reasonable way to determine
|
||||||
|
which data structures rely critically on bandwidth.
|
||||||
|
|
||||||
|
If the application a.out has been modified to use high bandwidth
|
||||||
|
memory with the memkind library then this can be done with numactl as
|
||||||
|
follows with the bash shell:
|
||||||
|
|
||||||
|
export MEMKIND_HBW_NODES=0
|
||||||
|
numactl --membind=1 --cpunodebind=0 a.out
|
||||||
|
|
||||||
|
or with csh:
|
||||||
|
|
||||||
|
setenv MEMKIND_HBW_NODES 0
|
||||||
|
numactl --membind=1 --cpunodebind=0 a.out
|
||||||
|
|
||||||
|
The MEMKIND_HBW_NODES environment variable set to zero will bind high
|
||||||
|
bandwidth allocations to NUMA node 0. The --membind=1 flag to numactl
|
||||||
|
will bind standard allocations, static and stack variables to NUMA
|
||||||
|
node 1. The --cpunodebind=0 option to numactl will bind the process
|
||||||
|
threads to CPUs associated with NUMA node 0. With this configuration
|
||||||
|
standard allocations will be fetched across the QPI bus, and high
|
||||||
|
bandwidth allocations will be local to the process CPU.
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
-----
|
||||||
|
* Using memkind with Transparent Huge Pages enabled may result in
|
||||||
|
undesirably high memory footprint. To avoid that disable THP using following
|
||||||
|
instruction: https://www.kernel.org/doc/Documentation/vm/transhuge.txt
|
||||||
|
|
||||||
|
STATUS
|
||||||
|
------
|
||||||
|
Different interfaces can represent different maturity level
|
||||||
|
(as described in corresponding man pages).
|
||||||
|
Feedback on design and implementation is greatly appreciated.
|
51
astyle.sh
Executable file
51
astyle.sh
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
ASTYLE_MIN_VER="3.1"
|
||||||
|
ASTYLE_OPT="--style=linux --indent=spaces=4 -S -r --max-continuation-indent=80 "
|
||||||
|
ASTYLE_OPT+="--max-code-length=80 --break-after-logical --indent-namespaces -z2 "
|
||||||
|
ASTYLE_OPT+="--align-pointer=name"
|
||||||
|
if ! ASTYLE=$(which astyle)
|
||||||
|
then
|
||||||
|
echo "Package astyle was not found. Unable to check source files format policy." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ASTYLE_VER=$(astyle --version 2>&1 | awk '{print $NF}')
|
||||||
|
if (( $(echo "$ASTYLE_VER < $ASTYLE_MIN_VER" | bc -l) ));
|
||||||
|
then
|
||||||
|
echo "Minimal required version of astyle is $ASTYLE_MIN_VER. Detected version is $ASTYLE_VER" >&2
|
||||||
|
echo "Unable to check source files format policy." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
$ASTYLE $ASTYLE_OPT ./*.c,*.cpp,*.h,*.hpp --exclude=jemalloc > astyle.out
|
||||||
|
if TEST=$(cat astyle.out | grep -c Formatted)
|
||||||
|
then
|
||||||
|
cat astyle.out
|
||||||
|
git --no-pager diff
|
||||||
|
echo "Please fix style issues as shown above"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Source code is compliant with format policy. No style issues were found."
|
||||||
|
exit 0
|
||||||
|
fi
|
48
autogen.sh
Executable file
48
autogen.sh
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2014-2017 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# If the VERSION file does not exist, then create it based on git
|
||||||
|
# describe or if not in a git repo just set VERSION to 0.0.0.
|
||||||
|
if [ ! -f VERSION ]; then
|
||||||
|
if [ -f .git/config ]; then
|
||||||
|
sha=$(git describe --long --always | awk -F- '{print $(NF)}')
|
||||||
|
release=$(git describe --long | awk -F- '{print $(NF-1)}')
|
||||||
|
version=$(git describe --long | sed -e "s|\(.*\)-$release-$sha|\1|" -e "s|-|+|g" -e "s|^v||")
|
||||||
|
if [ "$release" == "" ]; then
|
||||||
|
version=${sha}
|
||||||
|
else
|
||||||
|
version=${version}+dev${release}-${sha}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "WARNING: VERSION file does not exist and working directory is not a git repository, setting verison to 0.0.0" 2>&1
|
||||||
|
version=0.0.0
|
||||||
|
fi
|
||||||
|
echo $version > VERSION
|
||||||
|
fi
|
||||||
|
|
||||||
|
autoreconf --install
|
||||||
|
|
37
autohbw/Makefile.mk
Normal file
37
autohbw/Makefile.mk
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2014 - 2016 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
lib_LTLIBRARIES += autohbw/libautohbw.la \
|
||||||
|
# end
|
||||||
|
|
||||||
|
EXTRA_DIST += autohbw/autohbw_get_src_lines.pl
|
||||||
|
|
||||||
|
autohbw_libautohbw_la_LIBADD = libmemkind.la
|
||||||
|
|
||||||
|
autohbw_libautohbw_la_SOURCES = autohbw/autohbw.c
|
||||||
|
|
||||||
|
clean-local: autohbw-clean
|
||||||
|
|
||||||
|
autohbw-clean:
|
||||||
|
rm -f autohbw/*.gcno
|
457
autohbw/autohbw.c
Normal file
457
autohbw/autohbw.c
Normal file
@ -0,0 +1,457 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// File : autohbw.c
|
||||||
|
// Purpose: Library to automatically allocate HBW (MCDRAM)
|
||||||
|
// Author : Ruchira Sasanka (ruchira DOT sasanka AT intel DOT com)
|
||||||
|
// Date : Jan 30, 2015
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define AUTOHBW_EXPORT __attribute__((visibility("default")))
|
||||||
|
#define AUTOHBW_INIT __attribute__((constructor))
|
||||||
|
|
||||||
|
//-2 = nothing is printed
|
||||||
|
//-1 = critical messages are printed
|
||||||
|
// 0 = no log messages for allocations are printed but INFO messages are printed
|
||||||
|
// 1 = a log message is printed for each allocation (Default)
|
||||||
|
// 2 = a log message is printed for each allocation with a backtrace
|
||||||
|
enum {
|
||||||
|
ALWAYS = -1,
|
||||||
|
INFO,
|
||||||
|
ALLOC,
|
||||||
|
VERBOSE
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default is to print allocations
|
||||||
|
static int LogLevel = ALLOC;
|
||||||
|
|
||||||
|
// Allocations of size greater than low limit promoted to HBW memory.
|
||||||
|
// If there is a high limit specified, allocations larger than this limit
|
||||||
|
// will not be allocated in HBW.
|
||||||
|
static size_t HBWLowLimit = 1 * 1024 * 1024;
|
||||||
|
static size_t HBWHighLimit = -1ull;
|
||||||
|
|
||||||
|
// Whether we have initialized HBW arena of memkind library -- by making
|
||||||
|
// a dummy call to it. HBW arena (and hence any memkind_* call with kind
|
||||||
|
// HBW) must NOT be used until this flag is set true.
|
||||||
|
static bool MemkindInitDone = false;
|
||||||
|
|
||||||
|
// Following is the type of HBW memory that is allocated using memkind.
|
||||||
|
// By changing this type, this library can be used to allocate other
|
||||||
|
// types of memory types (e.g., MEMKIND_HUGETLB, MEMKIND_GBTLB,
|
||||||
|
// MEMKIND_HBW_HUGETLB etc.)
|
||||||
|
static memkind_t hbw_kind;
|
||||||
|
|
||||||
|
// API control for HBW allocations.
|
||||||
|
static bool isAutoHBWEnabled = true;
|
||||||
|
|
||||||
|
#define LOG(level, ...) \
|
||||||
|
do { \
|
||||||
|
if (LogLevel >= level) { \
|
||||||
|
fprintf(stderr, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static bool isAllocInHBW(size_t size)
|
||||||
|
{
|
||||||
|
if (!MemkindInitDone)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!isAutoHBWEnabled)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (size < HBWLowLimit)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (size > HBWHighLimit)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the limit in bytes using a limit value and a multiplier
|
||||||
|
// character like K, M, G
|
||||||
|
static size_t getLimit(size_t limit, char lchar)
|
||||||
|
{
|
||||||
|
// Now read the trailing character (e.g., K, M, G)
|
||||||
|
// Based on the character, determine the multiplier
|
||||||
|
if ((limit > 0) && isalpha(lchar)) {
|
||||||
|
long mult = 1;
|
||||||
|
|
||||||
|
switch (toupper(lchar)) {
|
||||||
|
case 'G':
|
||||||
|
mult *= 1024;
|
||||||
|
case 'M':
|
||||||
|
mult *= 1024;
|
||||||
|
case 'K':
|
||||||
|
mult *= 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for overflow, saturate at max
|
||||||
|
if (limit >= -1ull / mult)
|
||||||
|
return -1ull;
|
||||||
|
|
||||||
|
return limit * mult;
|
||||||
|
}
|
||||||
|
|
||||||
|
return limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Once HBWLowLimit (and HBWHighLimit) are set, call this method to
|
||||||
|
// inform the user about the size range of arrays that will be allocated
|
||||||
|
// in HBW
|
||||||
|
static void printLimits()
|
||||||
|
{
|
||||||
|
// Inform according to the limits set
|
||||||
|
if ((HBWLowLimit > 0) && (HBWHighLimit < -1ull)) {
|
||||||
|
// if both high and low limits are specified, we use a range
|
||||||
|
LOG(INFO, "INFO: Allocations between %ldK - %ldK will be allocated in "
|
||||||
|
"HBW. Set AUTO_HBW_SIZE=X:Y to change this limit.\n",
|
||||||
|
HBWLowLimit / 1024, HBWHighLimit / 1024);
|
||||||
|
} else if (HBWLowLimit > 0) {
|
||||||
|
// if only a low limit is provided, use that
|
||||||
|
LOG(INFO, "INFO: Allocations greater than %ldK will be allocated in HBW."
|
||||||
|
" Set AUTO_HBW_SIZE=X:Y to change this limit.\n",
|
||||||
|
HBWLowLimit / 1024);
|
||||||
|
} else if (HBWHighLimit < -1ull) {
|
||||||
|
// if only a high limit is provided, use that
|
||||||
|
LOG(INFO, "INFO: Allocations smaller than %ldK will be allocated in HBW. "
|
||||||
|
"Set AUTO_HBW_SIZE=X:Y to change this limit.\n",
|
||||||
|
HBWHighLimit / 1024);
|
||||||
|
} else {
|
||||||
|
// none of limits is set to non-edge value, everything goes to HBW
|
||||||
|
LOG(INFO, "INFO: All allocation will be done in HBW.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct kind_name_t {
|
||||||
|
memkind_t *kind;
|
||||||
|
const char *name;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct kind_name_t named_kinds[] = {
|
||||||
|
{ &MEMKIND_DEFAULT, "memkind_default" },
|
||||||
|
{ &MEMKIND_HUGETLB, "memkind_hugetlb" },
|
||||||
|
{ &MEMKIND_INTERLEAVE, "memkind_interleave" },
|
||||||
|
{ &MEMKIND_HBW, "memkind_hbw" },
|
||||||
|
{ &MEMKIND_HBW_PREFERRED, "memkind_hbw_preferred" },
|
||||||
|
{ &MEMKIND_HBW_HUGETLB, "memkind_hbw_hugetlb" },
|
||||||
|
{ &MEMKIND_HBW_PREFERRED_HUGETLB, "memkind_hbw_preferred_hugetlb" },
|
||||||
|
{ &MEMKIND_HBW_GBTLB, "memkind_hbw_gbtlb" },
|
||||||
|
{ &MEMKIND_HBW_PREFERRED_GBTLB, "memkind_hbw_preferred_gbtlb" },
|
||||||
|
{ &MEMKIND_GBTLB, "memkind_gbtlb" },
|
||||||
|
{ &MEMKIND_HBW_INTERLEAVE, "memkind_hbw_interleave" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static memkind_t get_kind_by_name(const char *name)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < sizeof(named_kinds) / sizeof(named_kinds[0]); ++i)
|
||||||
|
if (strcasecmp(named_kinds[i].name, name) == 0)
|
||||||
|
return *named_kinds[i].kind;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read from the environment and sets global variables
|
||||||
|
// Env variables are:
|
||||||
|
// AUTO_HBW_SIZE = gives the size for auto HBW allocation
|
||||||
|
// AUTO_HBW_LOG = gives logging level
|
||||||
|
static void setEnvValues()
|
||||||
|
{
|
||||||
|
// STEP: Read the log level from the env variable. Do this early because
|
||||||
|
// printing depends on this
|
||||||
|
char *log_str = getenv("AUTO_HBW_LOG");
|
||||||
|
if (log_str && strlen(log_str)) {
|
||||||
|
int level = atoi(log_str);
|
||||||
|
LogLevel = level;
|
||||||
|
LOG(ALWAYS, "INFO: Setting log level to %d\n", LogLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LogLevel == INFO) {
|
||||||
|
LOG(INFO, "INFO: HBW allocation stats will not be printed. "
|
||||||
|
"Set AUTO_HBW_LOG to enable.\n");
|
||||||
|
} else if (LogLevel == ALLOC) {
|
||||||
|
LOG(INFO, "INFO: Only HBW allocations will be printed. "
|
||||||
|
"Set AUTO_HBW_LOG to disable/enable.\n");
|
||||||
|
} else if (LogLevel == VERBOSE) {
|
||||||
|
LOG(INFO, "INFO: HBW allocation with backtrace info will be printed. "
|
||||||
|
"Set AUTO_HBW_LOG to disable.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the memory type allocated by this library. By default, it is
|
||||||
|
// MEMKIND_HBW, but we can use this library to allocate other memory
|
||||||
|
// types
|
||||||
|
const char *memtype_str = getenv("AUTO_HBW_MEM_TYPE");
|
||||||
|
if (memtype_str && strlen(memtype_str)) {
|
||||||
|
// Find the memkind_t using the name the user has provided in the env variable
|
||||||
|
memkind_t mty = get_kind_by_name(memtype_str);
|
||||||
|
if (mty != 0) {
|
||||||
|
hbw_kind = mty;
|
||||||
|
LOG(INFO, "INFO: Setting HBW memory type to %s\n", memtype_str);
|
||||||
|
} else {
|
||||||
|
LOG(ALWAYS, "WARN: Memory type %s not recognized. Using default type\n",
|
||||||
|
memtype_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP: Set the size limits (thresholds) for HBW allocation
|
||||||
|
//
|
||||||
|
// Reads the environment variable
|
||||||
|
const char *size_str = getenv("AUTO_HBW_SIZE");
|
||||||
|
if (size_str) {
|
||||||
|
size_t lowlim = HBWLowLimit / 1024;
|
||||||
|
size_t highlim = HBWHighLimit / 1024;
|
||||||
|
char lowC = 'K', highC = 'K';
|
||||||
|
|
||||||
|
if (size_str) {
|
||||||
|
char *ptr = (char *)size_str;
|
||||||
|
lowlim = strtoll(ptr, &ptr, 10);
|
||||||
|
if (*ptr != 0 && *ptr != ':')
|
||||||
|
lowC = *ptr++;
|
||||||
|
else
|
||||||
|
lowC = ' ';
|
||||||
|
|
||||||
|
if (*ptr++ == ':') {
|
||||||
|
highlim = strtoll(ptr, &ptr, 10);
|
||||||
|
if (*ptr)
|
||||||
|
highC = *ptr;
|
||||||
|
else
|
||||||
|
highC = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(INFO, "INFO: lowlim=%zu(%c), highlim=%zu(%c)\n", lowlim, lowC, highlim,
|
||||||
|
highC);
|
||||||
|
}
|
||||||
|
|
||||||
|
HBWLowLimit = getLimit(lowlim, lowC);
|
||||||
|
HBWHighLimit = getLimit(highlim, highC);
|
||||||
|
|
||||||
|
if (HBWLowLimit >= HBWHighLimit) {
|
||||||
|
LOG(ALWAYS, "WARN: In AUTO_HBW_SIZE=X:Y, X cannot be greater or equal to Y. "
|
||||||
|
"None of allocations will use HBW memory.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if the user did not specify any limits, inform that we are using
|
||||||
|
// default limits
|
||||||
|
LOG(INFO, "INFO: Using default values for array size thresholds. "
|
||||||
|
"Set AUTO_HBW_SIZE=X:Y to change.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// inform the user about limits
|
||||||
|
printLimits();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is executed at library load time.
|
||||||
|
// Initialize HBW arena by making a dummy allocation/free at library load
|
||||||
|
// time. Until HBW initialization is complete, we must not call any
|
||||||
|
// allocation routines with HBW as kind.
|
||||||
|
static void AUTOHBW_INIT autohbw_load(void)
|
||||||
|
{
|
||||||
|
// First set the default memory type this library allocates. This can
|
||||||
|
// be overridden by env variable
|
||||||
|
// Note: 'memkind_hbw_preferred' will allow falling back to DDR but
|
||||||
|
// 'memkind_hbw will not'
|
||||||
|
// Note: If HBM is not installed on a system, memkind_hbw_preferred call
|
||||||
|
// would fail. Therefore, we need to check for availability first.
|
||||||
|
if (memkind_check_available(MEMKIND_HBW) != 0) {
|
||||||
|
LOG(ALWAYS, "WARN: *** No HBM found in system. Will use default (DDR) "
|
||||||
|
"OR user specified type ***\n");
|
||||||
|
hbw_kind = MEMKIND_DEFAULT;
|
||||||
|
} else {
|
||||||
|
hbw_kind = MEMKIND_HBW_PREFERRED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read any env variables. This has to be done first because DbgLevel
|
||||||
|
// is set using env variables and debug printing is used below
|
||||||
|
setEnvValues(); // read any env variables
|
||||||
|
|
||||||
|
LOG(INFO, "INFO: autohbw.so loaded!\n");
|
||||||
|
|
||||||
|
// dummy HBW call to initialize HBW arena
|
||||||
|
void *pp = memkind_malloc(hbw_kind, 16);
|
||||||
|
if (pp == 0) {
|
||||||
|
LOG(ALWAYS, "\t-HBW init call FAILED. "
|
||||||
|
"Is required memory type present on your system?\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(ALWAYS, "\t-HBW int call succeeded\n");
|
||||||
|
memkind_free(hbw_kind, pp);
|
||||||
|
|
||||||
|
MemkindInitDone = true; // enable HBW allocation
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *MemkindMalloc(size_t size)
|
||||||
|
{
|
||||||
|
LOG(VERBOSE, "In my memkind malloc sz:%ld ... ", size);
|
||||||
|
|
||||||
|
bool useHbw = isAllocInHBW(size);
|
||||||
|
memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
|
||||||
|
|
||||||
|
if (useHbw)
|
||||||
|
LOG(VERBOSE, "\tHBW");
|
||||||
|
|
||||||
|
void *ptr = memkind_malloc(kind, size);
|
||||||
|
|
||||||
|
LOG(VERBOSE, "\tptr:%p\n", ptr);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *MemkindCalloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
LOG(VERBOSE, "In my memkind calloc sz:%ld ..", size * nmemb);
|
||||||
|
|
||||||
|
bool useHbw = isAllocInHBW(size);
|
||||||
|
memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
|
||||||
|
|
||||||
|
if (useHbw)
|
||||||
|
LOG(VERBOSE, "\tHBW");
|
||||||
|
|
||||||
|
void *ptr = memkind_calloc(kind, nmemb, size);
|
||||||
|
|
||||||
|
LOG(VERBOSE, "\tptr:%p\n", ptr);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *MemkindRealloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
LOG(VERBOSE, "In my memkind realloc sz:%ld, p1:%p ..", size, ptr);
|
||||||
|
|
||||||
|
bool useHbw = isAllocInHBW(size);
|
||||||
|
memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
|
||||||
|
|
||||||
|
if (useHbw)
|
||||||
|
LOG(VERBOSE, "\tHBW");
|
||||||
|
|
||||||
|
void *nptr = memkind_realloc(kind, ptr, size);
|
||||||
|
|
||||||
|
LOG(VERBOSE, "\tptr=%p\n", nptr);
|
||||||
|
return nptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int MemkindAlign(void **memptr, size_t alignment, size_t size)
|
||||||
|
{
|
||||||
|
LOG(VERBOSE, "In my memkind align sz:%ld .. ", size);
|
||||||
|
|
||||||
|
bool useHbw = isAllocInHBW(size);
|
||||||
|
memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
|
||||||
|
|
||||||
|
if (useHbw)
|
||||||
|
LOG(VERBOSE, "\tHBW");
|
||||||
|
|
||||||
|
int ret = memkind_posix_memalign(kind, memptr, alignment, size);
|
||||||
|
|
||||||
|
LOG(VERBOSE, "\tptr:%p\n", *memptr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// memkind_free does not need the exact kind, if kind is 0. Then
|
||||||
|
// the library can figure out the proper kind itself.
|
||||||
|
static void MemkindFree(void *ptr)
|
||||||
|
{
|
||||||
|
// avoid to many useless logs
|
||||||
|
if (ptr)
|
||||||
|
LOG(VERBOSE, "In my memkind free, ptr:%p\n", ptr);
|
||||||
|
memkind_free(0, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// ------------------ Public API of autohbw ----------------------
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT void enableAutoHBW()
|
||||||
|
{
|
||||||
|
isAutoHBWEnabled = true;
|
||||||
|
LOG(INFO, "INFO: HBW allocations enabled by application (for this rank)\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT void disableAutoHBW()
|
||||||
|
{
|
||||||
|
isAutoHBWEnabled = false;
|
||||||
|
LOG(INFO, "INFO: HBW allocations disabled by application (for this rank)\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT void *malloc(size_t size)
|
||||||
|
{
|
||||||
|
return MemkindMalloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT void *calloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
return MemkindCalloc(nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT void *realloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
return MemkindRealloc(ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT int posix_memalign(void **memptr, size_t alignment, size_t size)
|
||||||
|
{
|
||||||
|
return MemkindAlign(memptr, alignment, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warn about deprecated function usage.
|
||||||
|
AUTOHBW_EXPORT void *valloc(size_t size)
|
||||||
|
{
|
||||||
|
LOG(ALWAYS, "use of deprecated valloc. Use posix_memalign instead\n");
|
||||||
|
void *memptr = 0;
|
||||||
|
size_t boundary = sysconf(_SC_PAGESIZE);
|
||||||
|
int status = MemkindAlign(&memptr, boundary, size);
|
||||||
|
if (status == 0 && memptr != 0)
|
||||||
|
return memptr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warn about deprecated function usage.
|
||||||
|
AUTOHBW_EXPORT void *memalign(size_t boundary, size_t size)
|
||||||
|
{
|
||||||
|
LOG(ALWAYS, "use of deprecated memalign. Use posix_memalign instead\n");
|
||||||
|
void *memptr = 0;
|
||||||
|
int status = MemkindAlign(&memptr, boundary, size);
|
||||||
|
if (status == 0 && memptr != 0)
|
||||||
|
return memptr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTOHBW_EXPORT void free(void *ptr)
|
||||||
|
{
|
||||||
|
return MemkindFree(ptr);
|
||||||
|
}
|
92
autohbw/autohbw_README
Normal file
92
autohbw/autohbw_README
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
README for auothbw library
|
||||||
|
Ruchira Sasanka (ruchira DOT sasanka AT intel DOT com)
|
||||||
|
2015 April 8
|
||||||
|
|
||||||
|
PURPOSE
|
||||||
|
-------
|
||||||
|
The autohbw library is used to automatically allocate high-bandwidth (HBW)
|
||||||
|
memory without any modifications to source code of your application.
|
||||||
|
This library intercepts the standard heap allocations (e.g., malloc, calloc)
|
||||||
|
in your program so that it can serve those allocations out of HBW memory.
|
||||||
|
|
||||||
|
There are two libraries installed at the same location as memkind library:
|
||||||
|
1) libautohbw.so -- dynamic library
|
||||||
|
2) libautohbw.a -- static library (provided for static linking)
|
||||||
|
|
||||||
|
USAGE
|
||||||
|
-----
|
||||||
|
To use the dynamic library, insert LD_PRELOAD=libautohbw.so and libmekind.so
|
||||||
|
before your commandline. For instance,
|
||||||
|
|
||||||
|
LD_PRELOAD=libautohbw.so /bin/ls
|
||||||
|
|
||||||
|
executes Unix ls utility with autohbw library. You can execute the
|
||||||
|
above command on the prompt or put it in a shell script. An example of
|
||||||
|
the latter approach is given in ./autohbw_test.sh. Make sure that
|
||||||
|
LD_LIBRARY_PATH enviornment variable contains the path to libautohbw.so
|
||||||
|
and libmekind.so before you exeute the above command.
|
||||||
|
|
||||||
|
To use the statically linked library, insert -lautohbw -lmemkind
|
||||||
|
on your link line. You will have to provide the library path with -L to
|
||||||
|
point to the above libraries. If you are linking your program statically
|
||||||
|
(e.g., with -static or -fast flags in ifort/icc), you must use the static
|
||||||
|
version of autohbw library (libautohbw.a).
|
||||||
|
|
||||||
|
It is possible to temporarily disable/enable automatic HBM allocations by
|
||||||
|
calling disableAutoHBW() and enableAutoHBW() in your source code. To call
|
||||||
|
these routines, please include autohbw_api.h header file and link with
|
||||||
|
-lautohbw.
|
||||||
|
|
||||||
|
|
||||||
|
Usage with MPI programs
|
||||||
|
-----------------------
|
||||||
|
To use with MPI programs, you need to create a shell script to do the
|
||||||
|
LD_PRELOAD. E.g.,
|
||||||
|
mpirun -n 2 ./autohbw_test.sh
|
||||||
|
|
||||||
|
ENVIORNMENT VARIABLES
|
||||||
|
---------------------
|
||||||
|
The following enviornment variables control the behavior of the autohbw
|
||||||
|
library:
|
||||||
|
|
||||||
|
AUTO_HBW_SIZE=x[:y]
|
||||||
|
Indicates that any allocation larger than x and smaller than y should be
|
||||||
|
allocated in HBW memory. x and y can be followed by a K, M, or G to
|
||||||
|
indicate the size in Kilo/Memga/Giga bytes (e.g., 4K, 3M, 2G).
|
||||||
|
Examples:
|
||||||
|
AUTO_HBW_SIZE=4K # all allocation larger than 4K allocated in HBW
|
||||||
|
AUTO_HBW_SIZE=1M:5M # allocations betwen 1M and 5M allocated in HBW
|
||||||
|
|
||||||
|
|
||||||
|
AUTO_HBW_LOG=level
|
||||||
|
Sets the value of logging (printing) level. If level is:
|
||||||
|
-1 = no messages are printed
|
||||||
|
0 = no log messages for allocations are printed but INFO messages
|
||||||
|
are printed
|
||||||
|
1 = a log message is printed for each allocation (Default)
|
||||||
|
2 = a log message is printed for each allocation with a backtrace
|
||||||
|
Redirect this output and use autohbw_get_src_lines.pl to find
|
||||||
|
source lines for each allocation. Your application must be compiled
|
||||||
|
with -g to see source lines.
|
||||||
|
Notes:
|
||||||
|
1. Logging adds extra overhead. Therefore, performance critical runs,
|
||||||
|
logging level should be 0
|
||||||
|
2. The amount of free memory printed with log messages is only
|
||||||
|
approximate -- e.g. pages that are not touched yet are excluded
|
||||||
|
Examples:
|
||||||
|
AUTO_HBW_LOG=1
|
||||||
|
|
||||||
|
|
||||||
|
AUTO_HBW_MEM_TYPE=memory_type
|
||||||
|
Sets the type of memory type that should be automatically allocated. By
|
||||||
|
default, this type is MEMKIND_HBW_PREFERRED, if MCDRAM is found in your
|
||||||
|
system; otherwise, the default is MEMKIND_DEFAULT. The names of memory
|
||||||
|
types are definedin memkind(3) man page. If you are requesting any huge
|
||||||
|
TLB pages, pleasemake sure that the requested type is currently enabled
|
||||||
|
in your OS.
|
||||||
|
Examples:
|
||||||
|
AUTO_HBW_MEM_TYPE=MEMKIND_HBW_PREFERRED (default, if MCDRAM present)
|
||||||
|
AUTO_HBW_MEM_TYPE=MEMKIND_DEFAULT (default, if MCDRAM absent)
|
||||||
|
AUTO_HBW_MEM_TYPE=MEMKIND_HBW_HUGETLB
|
||||||
|
AUTO_HBW_MEM_TYPE=MEMKIND_HUGETLB
|
||||||
|
|
49
autohbw/autohbw_api.h
Normal file
49
autohbw/autohbw_api.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 - 2016 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// File : autohbw_api.h
|
||||||
|
// Purpose: Header file to include, to use API calls to AutoHBW
|
||||||
|
// Author : Ruchira Sasanka (ruchira.sasanka AT intel.com)
|
||||||
|
// Date : Jan 30, 2015
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef AUTOHBW_API_H
|
||||||
|
#define AUTOHBW_API_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Temporarily enable HBM allocations
|
||||||
|
void enableAutoHBW();
|
||||||
|
|
||||||
|
// Temporarily disable HBM allocations
|
||||||
|
void disableAutoHBW();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
106
autohbw/autohbw_get_src_lines.pl
Normal file
106
autohbw/autohbw_get_src_lines.pl
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# Copyright (C) 2015 - 2016 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
my $usage = "Usage: get_autohbw_srclines.pl output_log_of_AutoHBW executable";
|
||||||
|
|
||||||
|
# Check for 2 arguments
|
||||||
|
#
|
||||||
|
if (@ARGV != 2) {
|
||||||
|
print $usage, "\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the command line arguments
|
||||||
|
#
|
||||||
|
my $LogF = shift @ARGV;
|
||||||
|
my $BinaryF = shift @ARGV;
|
||||||
|
|
||||||
|
&main();
|
||||||
|
|
||||||
|
sub main {
|
||||||
|
|
||||||
|
|
||||||
|
print("Info: Reading AutoHBW log from: $LogF\n");
|
||||||
|
print("Info: Binary file: $BinaryF\n");
|
||||||
|
|
||||||
|
# open the log file produced by AutoHBM and look at lines starting
|
||||||
|
# with Log
|
||||||
|
open LOGF, "grep Log $LogF |" or die "Can't open log file $LogF";
|
||||||
|
|
||||||
|
my $line;
|
||||||
|
|
||||||
|
# Read each log line
|
||||||
|
#
|
||||||
|
while ($line = <LOGF>) {
|
||||||
|
|
||||||
|
# if the line contain 3 backtrace addresses, try to find the source
|
||||||
|
# lines for them
|
||||||
|
#
|
||||||
|
if ($line =~ /^(Log:.*)Backtrace:.*0x([0-9a-f]+).*0x([0-9a-f]+).*0x([0-9a-f]+)/ ) {
|
||||||
|
|
||||||
|
# Read the pointers
|
||||||
|
#
|
||||||
|
my @ptrs;
|
||||||
|
|
||||||
|
my $pre = $1;
|
||||||
|
|
||||||
|
$ptrs[0] = $2;
|
||||||
|
$ptrs[1] = $3;
|
||||||
|
$ptrs[2] = $4;
|
||||||
|
|
||||||
|
# prints the first portion of the line
|
||||||
|
#
|
||||||
|
print $pre, "\n";
|
||||||
|
|
||||||
|
# for each of the pointers, lookup its source line using
|
||||||
|
# addr2line and print the src line(s) if found
|
||||||
|
#
|
||||||
|
my $i=0;
|
||||||
|
for ($i=0; $i < @ptrs; $i++) {
|
||||||
|
|
||||||
|
my $addr = $ptrs[$i];
|
||||||
|
|
||||||
|
open SRCL, "addr2line -e $BinaryF 0x$addr |"
|
||||||
|
or die "addr2line fail";
|
||||||
|
|
||||||
|
|
||||||
|
my $srcl = <SRCL>;
|
||||||
|
|
||||||
|
if ($srcl =~ /^\?/) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
print "\t- Src: $srcl";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
37
autohbw/autohbw_test.sh
Executable file
37
autohbw/autohbw_test.sh
Executable file
@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright (C) 2015 - 2016 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
# The following is needed if your system does not really have HBW nodes.
|
||||||
|
# Please see 'man memkind' for a description of this variable
|
||||||
|
#
|
||||||
|
# export MEMKIND_HBW_NODES=0
|
||||||
|
|
||||||
|
# Set any autohbw env variables
|
||||||
|
#
|
||||||
|
export AUTO_HBW_SIZE=4K
|
||||||
|
|
||||||
|
# Make sure you have set LD_LIBRARY_PATH to lib directory with libautohbw.so
|
||||||
|
# and libmemkind.so
|
||||||
|
#
|
||||||
|
LD_PRELOAD=libautohbw.so:libmemkind.so /bin/ls
|
48
build.sh
Executable file
48
build.sh
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ -z "$JE_PREFIX" ]; then
|
||||||
|
export JE_PREFIX=jemk_
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $(dirname $0)
|
||||||
|
EXTRA_CONF=$@
|
||||||
|
|
||||||
|
if [ ! -f ./jemalloc/obj/lib/libjemalloc_pic.a ]; then
|
||||||
|
./build_jemalloc.sh $EXTRA_CONF
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f ./configure ]; then
|
||||||
|
./autogen.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f ./Makefile ]; then
|
||||||
|
./configure $EXTRA_CONF
|
||||||
|
fi
|
||||||
|
|
||||||
|
#use V=1 for full cmdlines of build
|
||||||
|
make all -j $MAKEOPTS
|
||||||
|
make checkprogs -j $MAKEOPTS
|
35
build_jemalloc.sh
Executable file
35
build_jemalloc.sh
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2016 - 2018 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
EXTRA_CONF=$@
|
||||||
|
|
||||||
|
cd jemalloc
|
||||||
|
test -e configure || autoconf
|
||||||
|
test -e obj || mkdir obj
|
||||||
|
cd obj
|
||||||
|
../configure --enable-autogen --with-jemalloc-prefix=$JE_PREFIX --without-export \
|
||||||
|
--disable-stats --disable-fill \
|
||||||
|
$EXTRA_CONF --with-malloc-conf="narenas:256,lg_tcache_max:12"
|
||||||
|
|
||||||
|
make -j`nproc`
|
53
config.h.in~
Normal file
53
config.h.in~
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Upper bound for number of arenas per kind */
|
||||||
|
#undef ARENA_LIMIT_PER_KIND
|
||||||
|
|
||||||
|
/* define if the compiler supports basic C++11 syntax */
|
||||||
|
#undef HAVE_CXX11
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `numa' library (-lnuma). */
|
||||||
|
#undef HAVE_LIBNUMA
|
||||||
|
|
||||||
|
/* Have PTHREAD_PRIO_INHERIT. */
|
||||||
|
#undef HAVE_PTHREAD_PRIO_INHERIT
|
||||||
|
|
||||||
|
/* Enables code for debugging */
|
||||||
|
#undef MEMKIND_DEBUG
|
||||||
|
|
||||||
|
/* Enables decorators */
|
||||||
|
#undef MEMKIND_DECORATION_ENABLED
|
||||||
|
|
||||||
|
/* Enables TLS usage for mapping arenas to threads */
|
||||||
|
#undef MEMKIND_TLS
|
||||||
|
|
||||||
|
/* TLS model attribute */
|
||||||
|
#undef MEMKIND_TLS_MODEL
|
||||||
|
|
||||||
|
/* Name of package */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to necessary symbol if this constant uses a non-standard name on
|
||||||
|
your system. */
|
||||||
|
#undef PTHREAD_CREATE_JOINABLE
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#undef VERSION
|
197
configure.ac
Normal file
197
configure.ac
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
# -*- Autoconf -*-
|
||||||
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ([2.64])
|
||||||
|
AC_INIT([memkind],m4_esyscmd([tr -d '\n' < VERSION]))
|
||||||
|
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
AC_CONFIG_SRCDIR([memkind.spec.mk])
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11 silent-rules subdir-objects parallel-tests tar-pax])
|
||||||
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
# Checks for programs and libraries.
|
||||||
|
AM_PROG_AR
|
||||||
|
AC_PROG_CXX
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_OPENMP
|
||||||
|
AC_CHECK_LIB(numa, numa_available, [], [AC_MSG_ERROR([libnuma is required dependency])])
|
||||||
|
AX_PTHREAD([LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC"],
|
||||||
|
[AC_MSG_ERROR([pthreads are required dependency])])
|
||||||
|
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
|
#============================tls===============================================
|
||||||
|
# Check for tls_model attribute support
|
||||||
|
SAVED_CFLAGS="${CFLAGS}"
|
||||||
|
CFLAGS="$CFLAGS -Werror"
|
||||||
|
AC_MSG_CHECKING([for tls_model attribute support])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
||||||
|
[[
|
||||||
|
static __thread int __attribute__((tls_model("local-dynamic"))) x;
|
||||||
|
]],
|
||||||
|
[[
|
||||||
|
x = 1234;
|
||||||
|
]])],
|
||||||
|
[AC_MSG_RESULT([yes])
|
||||||
|
tls_model="1"],
|
||||||
|
[AC_MSG_RESULT([no])
|
||||||
|
tls_model="0"])
|
||||||
|
|
||||||
|
CFLAGS="${SAVED_CFLAGS}"
|
||||||
|
if test "x${tls_model}" = "x1" ; then
|
||||||
|
AC_DEFINE([MEMKIND_TLS_MODEL],
|
||||||
|
[__attribute__((tls_model("initial-exec")))], [TLS model attribute])
|
||||||
|
else
|
||||||
|
AC_DEFINE([MEMKIND_TLS_MODEL], [ ], [TLS model attribute])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([tls],
|
||||||
|
[AS_HELP_STRING([--enable-tls], [Enable thread-local storage (__thread keyword)])],
|
||||||
|
[if test "x$enable_tls" = "xyes" ; then
|
||||||
|
enable_tls="1"
|
||||||
|
else
|
||||||
|
enable_tls="0"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[enable_tls="0"]
|
||||||
|
)
|
||||||
|
if test "x${enable_tls}" = "x1" ; then
|
||||||
|
AC_MSG_CHECKING([for TLS support])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
||||||
|
[[
|
||||||
|
__thread int x;
|
||||||
|
]], [[
|
||||||
|
x = 1234;
|
||||||
|
]])],
|
||||||
|
AC_MSG_RESULT([yes]),
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
enable_tls="0")
|
||||||
|
fi
|
||||||
|
if test "x${enable_tls}" = "x1" ; then
|
||||||
|
AC_DEFINE([MEMKIND_TLS], [ ], [Enables TLS usage for mapping arenas to threads])
|
||||||
|
fi
|
||||||
|
AC_SUBST([enable_tls])
|
||||||
|
|
||||||
|
#============================decorators========================================
|
||||||
|
AC_ARG_ENABLE([decorators],
|
||||||
|
[AS_HELP_STRING([--enable-decorators], [Enable decorators])],
|
||||||
|
[if test "x$enable_decorators" = "xyes" ; then
|
||||||
|
enable_decorators="1"
|
||||||
|
else
|
||||||
|
enable_decorators="0"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[enable_decorators="0"]
|
||||||
|
)
|
||||||
|
if test "x${enable_decorators}" = "x1" ; then
|
||||||
|
AC_DEFINE([MEMKIND_DECORATION_ENABLED], [ ], [Enables decorators])
|
||||||
|
fi
|
||||||
|
AC_SUBST([enable_decorators])
|
||||||
|
|
||||||
|
#============================debug=============================================
|
||||||
|
AC_ARG_ENABLE([debug],
|
||||||
|
[AS_HELP_STRING([--enable-debug], [Build debugging code and compile with -O0 -g])],
|
||||||
|
[if test "x$enable_debug" = "xno" ; then
|
||||||
|
enable_debug="0"
|
||||||
|
else
|
||||||
|
enable_debug="1"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[enable_debug="0"]
|
||||||
|
)
|
||||||
|
if test "x$enable_debug" = "x1" ; then
|
||||||
|
AC_DEFINE([MEMKIND_DEBUG], [ ], [Enables code for debugging])
|
||||||
|
CFLAGS="$CFLAGS -O0 -g"
|
||||||
|
CXXFLAGS="$CXXFLAGS -O0 -g"
|
||||||
|
fi
|
||||||
|
AC_SUBST([enable_debug])
|
||||||
|
|
||||||
|
#============================gcov==============================================
|
||||||
|
AC_ARG_ENABLE([gcov],
|
||||||
|
[AS_HELP_STRING([--enable-gcov], [Build code with gcov instructions])],
|
||||||
|
[if test "x$enable_gcov" = "xno" ; then
|
||||||
|
enable_gcov="0"
|
||||||
|
else
|
||||||
|
enable_gcov="1"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[enable_gcov="0"]
|
||||||
|
)
|
||||||
|
if test "x$enable_gcov" = "x1" ; then
|
||||||
|
CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage"
|
||||||
|
CXXFLAGS="$CXXFLAGS -O0 -fprofile-arcs -ftest-coverage"
|
||||||
|
fi
|
||||||
|
AC_SUBST([enable_gcov])
|
||||||
|
|
||||||
|
#============================secure_flags======================================
|
||||||
|
AC_ARG_ENABLE([secure],
|
||||||
|
[AS_HELP_STRING([--enable-secure], [Build library with security enchantments])],
|
||||||
|
[if test "x$enable_secure" = "xno" ; then
|
||||||
|
enable_secure="0"
|
||||||
|
else
|
||||||
|
enable_secure="1"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[enable_secure="1"]
|
||||||
|
)
|
||||||
|
if test "x$enable_secure" = "x1" ; then
|
||||||
|
CFLAGS="$CFLAGS -fstack-protector"
|
||||||
|
LDFLAGS="$LDFLAGS -Wl,-z,relro,-z,now"
|
||||||
|
|
||||||
|
if test "$CFLAGS" != "${CFLAGS%-O0*}" ; then # if CFLAGS contains -O0
|
||||||
|
echo "WARNING: Could not apply FORTIFY_SOURCE=2 due to lack of optimization (-O0)"
|
||||||
|
else
|
||||||
|
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" #FORTITFY_SOURCE does not work with -O0 (ex. if enable_debug=1 or enable_gcov=1)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST([enable_secure])
|
||||||
|
|
||||||
|
#============================arena_limit=======================================
|
||||||
|
arena_limit=256;
|
||||||
|
AC_ARG_VAR(ARENA_LIMIT,
|
||||||
|
[Upper bound for number of arenas per kind, if set to 0 then no limit]
|
||||||
|
)
|
||||||
|
if test "$ARENA_LIMIT" != "" ; then
|
||||||
|
arena_limit=$ARENA_LIMIT;
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_DEFINE_UNQUOTED([ARENA_LIMIT_PER_KIND], $arena_limit, [Upper bound for number of arenas per kind])
|
||||||
|
|
||||||
|
#============================cxx11=============================================
|
||||||
|
|
||||||
|
AX_CXX_COMPILE_STDCXX_11([noext], [optional])
|
||||||
|
AM_CONDITIONAL([HAVE_CXX11], [test "x$HAVE_CXX11" = x1])
|
||||||
|
|
||||||
|
LT_PREREQ([2.2])
|
||||||
|
LT_INIT
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
|
|
302
copying_headers/MANIFEST.EXEMPT
Normal file
302
copying_headers/MANIFEST.EXEMPT
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
.gitignore
|
||||||
|
AUTHORS
|
||||||
|
COPYING
|
||||||
|
CONTRIBUTING
|
||||||
|
INSTALL
|
||||||
|
NEWS
|
||||||
|
PULL_REQUEST_TEMPLATE.md
|
||||||
|
README
|
||||||
|
VERSION
|
||||||
|
m4/ax_cxx_compile_stdcxx.m4
|
||||||
|
m4/ax_cxx_compile_stdcxx_11.m4
|
||||||
|
m4/ax_pthread.m4
|
||||||
|
ChangeLog
|
||||||
|
.travis.yml
|
||||||
|
autohbw/autohbw_README
|
||||||
|
examples/README
|
||||||
|
test/memkind-afts.ts
|
||||||
|
test/memkind-afts-ext.ts
|
||||||
|
test/memkind-slts.ts
|
||||||
|
test/memkind-perf.ts
|
||||||
|
test/memkind-perf-ext.ts
|
||||||
|
test/memkind-pytests.ts
|
||||||
|
test/gtest_fused/gtest/gtest-all.cc
|
||||||
|
test/gtest_fused/gtest/gtest.h
|
||||||
|
jemalloc/.appveyor.yml
|
||||||
|
jemalloc/.autom4te.cfg
|
||||||
|
jemalloc/.gitattributes
|
||||||
|
jemalloc/.gitignore
|
||||||
|
jemalloc/.travis.yml
|
||||||
|
jemalloc/COPYING
|
||||||
|
jemalloc/ChangeLog
|
||||||
|
jemalloc/INSTALL.md
|
||||||
|
jemalloc/Makefile.in
|
||||||
|
jemalloc/README
|
||||||
|
jemalloc/autogen.sh
|
||||||
|
jemalloc/bin/jemalloc-config.in
|
||||||
|
jemalloc/bin/jemalloc.sh.in
|
||||||
|
jemalloc/bin/jeprof.in
|
||||||
|
jemalloc/build-aux/config.guess
|
||||||
|
jemalloc/build-aux/config.sub
|
||||||
|
jemalloc/build-aux/install-sh
|
||||||
|
jemalloc/config.stamp.in
|
||||||
|
jemalloc/configure.ac
|
||||||
|
jemalloc/doc/html.xsl.in
|
||||||
|
jemalloc/doc/jemalloc.xml.in
|
||||||
|
jemalloc/doc/manpages.xsl.in
|
||||||
|
jemalloc/doc/stylesheet.xsl
|
||||||
|
jemalloc/include/jemalloc/internal/arena_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_inlines_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_inlines_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_structs_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_structs_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/arena_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/assert.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_c11.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_gcc_sync.h
|
||||||
|
jemalloc/include/jemalloc/internal/atomic_msvc.h
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/background_thread_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/base_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/bit_util.h
|
||||||
|
jemalloc/include/jemalloc/internal/bitmap.h
|
||||||
|
jemalloc/include/jemalloc/internal/ckh.h
|
||||||
|
jemalloc/include/jemalloc/internal/ctl.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_dss.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_mmap.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/extent_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/hash.h
|
||||||
|
jemalloc/include/jemalloc/internal/hooks.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_includes.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_internal_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in
|
||||||
|
jemalloc/include/jemalloc/internal/large_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/malloc_io.h
|
||||||
|
jemalloc/include/jemalloc/internal/mutex.h
|
||||||
|
jemalloc/include/jemalloc/internal/mutex_pool.h
|
||||||
|
jemalloc/include/jemalloc/internal/mutex_prof.h
|
||||||
|
jemalloc/include/jemalloc/internal/nstime.h
|
||||||
|
jemalloc/include/jemalloc/internal/pages.h
|
||||||
|
jemalloc/include/jemalloc/internal/ph.h
|
||||||
|
jemalloc/include/jemalloc/internal/private_namespace.sh
|
||||||
|
jemalloc/include/jemalloc/internal/private_symbols.sh
|
||||||
|
jemalloc/include/jemalloc/internal/prng.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_inlines_a.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_inlines_b.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/prof_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/public_namespace.sh
|
||||||
|
jemalloc/include/jemalloc/internal/public_unnamespace.sh
|
||||||
|
jemalloc/include/jemalloc/internal/ql.h
|
||||||
|
jemalloc/include/jemalloc/internal/qr.h
|
||||||
|
jemalloc/include/jemalloc/internal/rb.h
|
||||||
|
jemalloc/include/jemalloc/internal/rtree.h
|
||||||
|
jemalloc/include/jemalloc/internal/rtree_tsd.h
|
||||||
|
jemalloc/include/jemalloc/internal/size_classes.sh
|
||||||
|
jemalloc/include/jemalloc/internal/smoothstep.h
|
||||||
|
jemalloc/include/jemalloc/internal/smoothstep.sh
|
||||||
|
jemalloc/include/jemalloc/internal/spin.h
|
||||||
|
jemalloc/include/jemalloc/internal/stats.h
|
||||||
|
jemalloc/include/jemalloc/internal/stats_tsd.h
|
||||||
|
jemalloc/include/jemalloc/internal/sz.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_externs.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_inlines.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_structs.h
|
||||||
|
jemalloc/include/jemalloc/internal/tcache_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/ticker.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_generic.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_malloc_thread_cleanup.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_tls.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_types.h
|
||||||
|
jemalloc/include/jemalloc/internal/tsd_win.h
|
||||||
|
jemalloc/include/jemalloc/internal/util.h
|
||||||
|
jemalloc/include/jemalloc/internal/witness.h
|
||||||
|
jemalloc/include/jemalloc/jemalloc.sh
|
||||||
|
jemalloc/include/jemalloc/jemalloc_defs.h.in
|
||||||
|
jemalloc/include/jemalloc/jemalloc_macros.h.in
|
||||||
|
jemalloc/include/jemalloc/jemalloc_mangle.sh
|
||||||
|
jemalloc/include/jemalloc/jemalloc_protos.h.in
|
||||||
|
jemalloc/include/jemalloc/jemalloc_rename.sh
|
||||||
|
jemalloc/include/jemalloc/jemalloc_typedefs.h.in
|
||||||
|
jemalloc/include/msvc_compat/C99/stdbool.h
|
||||||
|
jemalloc/include/msvc_compat/C99/stdint.h
|
||||||
|
jemalloc/include/msvc_compat/strings.h
|
||||||
|
jemalloc/include/msvc_compat/windows_extra.h
|
||||||
|
jemalloc/jemalloc.pc.in
|
||||||
|
jemalloc/m4/ax_cxx_compile_stdcxx.m4
|
||||||
|
jemalloc/msvc/ReadMe.txt
|
||||||
|
jemalloc/msvc/jemalloc_vc2015.sln
|
||||||
|
jemalloc/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj
|
||||||
|
jemalloc/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.cpp
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.h
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.vcxproj
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads.vcxproj.filters
|
||||||
|
jemalloc/msvc/projects/vc2015/test_threads/test_threads_main.cpp
|
||||||
|
jemalloc/run_tests.sh
|
||||||
|
jemalloc/scripts/gen_run_tests.py
|
||||||
|
jemalloc/scripts/gen_travis.py
|
||||||
|
jemalloc/src/arena.c
|
||||||
|
jemalloc/src/background_thread.c
|
||||||
|
jemalloc/src/base.c
|
||||||
|
jemalloc/src/bitmap.c
|
||||||
|
jemalloc/src/ckh.c
|
||||||
|
jemalloc/src/ctl.c
|
||||||
|
jemalloc/src/extent.c
|
||||||
|
jemalloc/src/extent_dss.c
|
||||||
|
jemalloc/src/extent_mmap.c
|
||||||
|
jemalloc/src/hash.c
|
||||||
|
jemalloc/src/hooks.c
|
||||||
|
jemalloc/src/jemalloc.c
|
||||||
|
jemalloc/src/jemalloc_cpp.cpp
|
||||||
|
jemalloc/src/large.c
|
||||||
|
jemalloc/src/malloc_io.c
|
||||||
|
jemalloc/src/mutex.c
|
||||||
|
jemalloc/src/mutex_pool.c
|
||||||
|
jemalloc/src/nstime.c
|
||||||
|
jemalloc/src/pages.c
|
||||||
|
jemalloc/src/prng.c
|
||||||
|
jemalloc/src/prof.c
|
||||||
|
jemalloc/src/rtree.c
|
||||||
|
jemalloc/src/spin.c
|
||||||
|
jemalloc/src/stats.c
|
||||||
|
jemalloc/src/sz.c
|
||||||
|
jemalloc/src/tcache.c
|
||||||
|
jemalloc/src/ticker.c
|
||||||
|
jemalloc/src/tsd.c
|
||||||
|
jemalloc/src/witness.c
|
||||||
|
jemalloc/src/zone.c
|
||||||
|
jemalloc/test/include/test/SFMT-alti.h
|
||||||
|
jemalloc/test/include/test/SFMT-params.h
|
||||||
|
jemalloc/test/include/test/SFMT-params11213.h
|
||||||
|
jemalloc/test/include/test/SFMT-params1279.h
|
||||||
|
jemalloc/test/include/test/SFMT-params132049.h
|
||||||
|
jemalloc/test/include/test/SFMT-params19937.h
|
||||||
|
jemalloc/test/include/test/SFMT-params216091.h
|
||||||
|
jemalloc/test/include/test/SFMT-params2281.h
|
||||||
|
jemalloc/test/include/test/SFMT-params4253.h
|
||||||
|
jemalloc/test/include/test/SFMT-params44497.h
|
||||||
|
jemalloc/test/include/test/SFMT-params607.h
|
||||||
|
jemalloc/test/include/test/SFMT-params86243.h
|
||||||
|
jemalloc/test/include/test/SFMT-sse2.h
|
||||||
|
jemalloc/test/include/test/SFMT.h
|
||||||
|
jemalloc/test/include/test/btalloc.h
|
||||||
|
jemalloc/test/include/test/extent_hooks.h
|
||||||
|
jemalloc/test/include/test/jemalloc_test.h.in
|
||||||
|
jemalloc/test/include/test/jemalloc_test_defs.h.in
|
||||||
|
jemalloc/test/include/test/math.h
|
||||||
|
jemalloc/test/include/test/mq.h
|
||||||
|
jemalloc/test/include/test/mtx.h
|
||||||
|
jemalloc/test/include/test/test.h
|
||||||
|
jemalloc/test/include/test/thd.h
|
||||||
|
jemalloc/test/include/test/timer.h
|
||||||
|
jemalloc/test/integration/MALLOCX_ARENA.c
|
||||||
|
jemalloc/test/integration/aligned_alloc.c
|
||||||
|
jemalloc/test/integration/allocated.c
|
||||||
|
jemalloc/test/integration/extent.c
|
||||||
|
jemalloc/test/integration/extent.sh
|
||||||
|
jemalloc/test/integration/mallocx.c
|
||||||
|
jemalloc/test/integration/mallocx.sh
|
||||||
|
jemalloc/test/integration/overflow.c
|
||||||
|
jemalloc/test/integration/posix_memalign.c
|
||||||
|
jemalloc/test/integration/rallocx.c
|
||||||
|
jemalloc/test/integration/sdallocx.c
|
||||||
|
jemalloc/test/integration/thread_arena.c
|
||||||
|
jemalloc/test/integration/thread_tcache_enabled.c
|
||||||
|
jemalloc/test/integration/xallocx.c
|
||||||
|
jemalloc/test/integration/xallocx.sh
|
||||||
|
jemalloc/test/src/SFMT.c
|
||||||
|
jemalloc/test/src/btalloc.c
|
||||||
|
jemalloc/test/src/btalloc_0.c
|
||||||
|
jemalloc/test/src/btalloc_1.c
|
||||||
|
jemalloc/test/src/math.c
|
||||||
|
jemalloc/test/src/mq.c
|
||||||
|
jemalloc/test/src/mtx.c
|
||||||
|
jemalloc/test/src/test.c
|
||||||
|
jemalloc/test/src/thd.c
|
||||||
|
jemalloc/test/src/timer.c
|
||||||
|
jemalloc/test/stress/microbench.c
|
||||||
|
jemalloc/test/test.sh.in
|
||||||
|
jemalloc/test/unit/SFMT.c
|
||||||
|
jemalloc/test/unit/a0.c
|
||||||
|
jemalloc/test/unit/arena_reset.c
|
||||||
|
jemalloc/test/unit/arena_reset_prof.c
|
||||||
|
jemalloc/test/unit/arena_reset_prof.sh
|
||||||
|
jemalloc/test/unit/atomic.c
|
||||||
|
jemalloc/test/unit/background_thread.c
|
||||||
|
jemalloc/test/unit/base.c
|
||||||
|
jemalloc/test/unit/bit_util.c
|
||||||
|
jemalloc/test/unit/bitmap.c
|
||||||
|
jemalloc/test/unit/ckh.c
|
||||||
|
jemalloc/test/unit/decay.c
|
||||||
|
jemalloc/test/unit/decay.sh
|
||||||
|
jemalloc/test/unit/extent_quantize.c
|
||||||
|
jemalloc/test/unit/fork.c
|
||||||
|
jemalloc/test/unit/hash.c
|
||||||
|
jemalloc/test/unit/hooks.c
|
||||||
|
jemalloc/test/unit/junk.c
|
||||||
|
jemalloc/test/unit/junk.sh
|
||||||
|
jemalloc/test/unit/junk_alloc.c
|
||||||
|
jemalloc/test/unit/junk_alloc.sh
|
||||||
|
jemalloc/test/unit/junk_free.c
|
||||||
|
jemalloc/test/unit/junk_free.sh
|
||||||
|
jemalloc/test/unit/mallctl.c
|
||||||
|
jemalloc/test/unit/malloc_io.c
|
||||||
|
jemalloc/test/unit/math.c
|
||||||
|
jemalloc/test/unit/mq.c
|
||||||
|
jemalloc/test/unit/mtx.c
|
||||||
|
jemalloc/test/unit/nstime.c
|
||||||
|
jemalloc/test/unit/pack.c
|
||||||
|
jemalloc/test/unit/pack.sh
|
||||||
|
jemalloc/test/unit/pages.c
|
||||||
|
jemalloc/test/unit/ph.c
|
||||||
|
jemalloc/test/unit/prng.c
|
||||||
|
jemalloc/test/unit/prof_accum.c
|
||||||
|
jemalloc/test/unit/prof_accum.sh
|
||||||
|
jemalloc/test/unit/prof_active.c
|
||||||
|
jemalloc/test/unit/prof_active.sh
|
||||||
|
jemalloc/test/unit/prof_gdump.c
|
||||||
|
jemalloc/test/unit/prof_gdump.sh
|
||||||
|
jemalloc/test/unit/prof_idump.c
|
||||||
|
jemalloc/test/unit/prof_idump.sh
|
||||||
|
jemalloc/test/unit/prof_reset.c
|
||||||
|
jemalloc/test/unit/prof_reset.sh
|
||||||
|
jemalloc/test/unit/prof_tctx.c
|
||||||
|
jemalloc/test/unit/prof_tctx.sh
|
||||||
|
jemalloc/test/unit/prof_thread_name.c
|
||||||
|
jemalloc/test/unit/prof_thread_name.sh
|
||||||
|
jemalloc/test/unit/ql.c
|
||||||
|
jemalloc/test/unit/qr.c
|
||||||
|
jemalloc/test/unit/rb.c
|
||||||
|
jemalloc/test/unit/retained.c
|
||||||
|
jemalloc/test/unit/rtree.c
|
||||||
|
jemalloc/test/unit/size_classes.c
|
||||||
|
jemalloc/test/unit/slab.c
|
||||||
|
jemalloc/test/unit/smoothstep.c
|
||||||
|
jemalloc/test/unit/spin.c
|
||||||
|
jemalloc/test/unit/stats.c
|
||||||
|
jemalloc/test/unit/stats_print.c
|
||||||
|
jemalloc/test/unit/ticker.c
|
||||||
|
jemalloc/test/unit/tsd.c
|
||||||
|
jemalloc/test/unit/witness.c
|
||||||
|
jemalloc/test/unit/zero.c
|
||||||
|
jemalloc/test/unit/zero.sh
|
||||||
|
include/memkind/internal/tbb_mem_pool_policy.h
|
159
copying_headers/MANIFEST.freeBSD
Normal file
159
copying_headers/MANIFEST.freeBSD
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
astyle.sh
|
||||||
|
autogen.sh
|
||||||
|
build.sh
|
||||||
|
build_jemalloc.sh
|
||||||
|
install_astyle.sh
|
||||||
|
Makefile.am
|
||||||
|
configure.ac
|
||||||
|
autohbw/Makefile.mk
|
||||||
|
autohbw/autohbw.c
|
||||||
|
autohbw/autohbw_get_src_lines.pl
|
||||||
|
autohbw/autohbw_test.sh
|
||||||
|
examples/Makefile.mk
|
||||||
|
examples/autohbw_candidates.c
|
||||||
|
examples/filter_example.c
|
||||||
|
examples/hello_hbw_example.c
|
||||||
|
examples/memkind_allocated_example.cpp
|
||||||
|
examples/memkind_allocated.hpp
|
||||||
|
examples/hello_memkind_example.c
|
||||||
|
examples/memkind_decorator_debug.c
|
||||||
|
man/memkind-hbw-nodes.1
|
||||||
|
man/autohbw.7
|
||||||
|
man/hbwmalloc.3
|
||||||
|
man/memkind.3
|
||||||
|
man/memkind_arena.3
|
||||||
|
man/memkind_default.3
|
||||||
|
man/memkind_hbw.3
|
||||||
|
man/memkind_hugetlb.3
|
||||||
|
man/hbwallocator.3
|
||||||
|
man/pmemallocator.3
|
||||||
|
memkind.spec.mk
|
||||||
|
src/heap_manager.c
|
||||||
|
src/hbwmalloc.c
|
||||||
|
src/memkind.c
|
||||||
|
src/memkind_arena.c
|
||||||
|
src/memkind_default.c
|
||||||
|
src/memkind_gbtlb.c
|
||||||
|
src/memkind_hbw.c
|
||||||
|
src/memkind_regular.c
|
||||||
|
src/memkind_hugetlb.c
|
||||||
|
src/memkind_interleave.c
|
||||||
|
src/memkind_log.c
|
||||||
|
src/memkind-hbw-nodes.c
|
||||||
|
src/tbb_wrapper.c
|
||||||
|
src/Makefile.mk
|
||||||
|
include/hbwmalloc.h
|
||||||
|
include/memkind.h
|
||||||
|
include/memkind_deprecated.h
|
||||||
|
include/hbw_allocator.h
|
||||||
|
include/pmem_allocator.h
|
||||||
|
include/memkind/internal/heap_manager.h
|
||||||
|
include/memkind/internal/memkind_arena.h
|
||||||
|
include/memkind/internal/memkind_default.h
|
||||||
|
include/memkind/internal/memkind_gbtlb.h
|
||||||
|
include/memkind/internal/memkind_hbw.h
|
||||||
|
include/memkind/internal/memkind_regular.h
|
||||||
|
include/memkind/internal/memkind_hugetlb.h
|
||||||
|
include/memkind/internal/memkind_interleave.h
|
||||||
|
include/memkind/internal/memkind_pmem.h
|
||||||
|
include/memkind/internal/memkind_private.h
|
||||||
|
include/memkind/internal/memkind_log.h
|
||||||
|
include/memkind/internal/tbb_wrapper.h
|
||||||
|
test/Makefile.mk
|
||||||
|
test/Allocator.hpp
|
||||||
|
test/TestPolicy.hpp
|
||||||
|
test/bat_tests.cpp
|
||||||
|
test/check.cpp
|
||||||
|
test/check.h
|
||||||
|
test/common.h
|
||||||
|
test/static_kinds_list.h
|
||||||
|
test/environ_err_hbw_malloc_test.cpp
|
||||||
|
test/gb_page_tests_bind_policy.cpp
|
||||||
|
test/main.cpp
|
||||||
|
test/multithreaded_tests.cpp
|
||||||
|
test/negative_tests.cpp
|
||||||
|
test/test.sh
|
||||||
|
test/trial_generator.cpp
|
||||||
|
test/trial_generator.h
|
||||||
|
test/error_message_tests.cpp
|
||||||
|
test/get_arena_test.cpp
|
||||||
|
test/locality_test.cpp
|
||||||
|
test/memkind_pmem_tests.cpp
|
||||||
|
test/memkind_pmem_long_time_tests.cpp
|
||||||
|
test/memory_footprint_test.cpp
|
||||||
|
test/memory_manager.h
|
||||||
|
test/random_sizes_allocator.h
|
||||||
|
test/proc_stat.h
|
||||||
|
test/static_kinds_tests.cpp
|
||||||
|
test/huge_page_test.cpp
|
||||||
|
test/hbw_verify_function_test.cpp
|
||||||
|
test/performance/framework.hpp
|
||||||
|
test/performance/framework.cpp
|
||||||
|
test/performance/operations.hpp
|
||||||
|
test/performance/perf_tests.hpp
|
||||||
|
test/performance/perf_tests.cpp
|
||||||
|
test/hbw_allocator_tests.cpp
|
||||||
|
test/decorator_test.cpp
|
||||||
|
test/decorator_test.h
|
||||||
|
test/alloc_performance_tests.cpp
|
||||||
|
test/allocator_perf_tool/AllocationSizes.hpp
|
||||||
|
test/allocator_perf_tool/Allocation_info.hpp
|
||||||
|
test/allocator_perf_tool/Allocation_info.cpp
|
||||||
|
test/allocator_perf_tool/Allocator.hpp
|
||||||
|
test/allocator_perf_tool/AllocatorFactory.hpp
|
||||||
|
test/allocator_perf_tool/CSVLogger.hpp
|
||||||
|
test/allocator_perf_tool/CommandLine.hpp
|
||||||
|
test/allocator_perf_tool/Configuration.hpp
|
||||||
|
test/allocator_perf_tool/ConsoleLog.hpp
|
||||||
|
test/allocator_perf_tool/FunctionCalls.hpp
|
||||||
|
test/allocator_perf_tool/FunctionCallsPerformanceTask.cpp
|
||||||
|
test/allocator_perf_tool/FunctionCallsPerformanceTask.h
|
||||||
|
test/allocator_perf_tool/GTestAdapter.hpp
|
||||||
|
test/allocator_perf_tool/Iterator.hpp
|
||||||
|
test/allocator_perf_tool/JemallocAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/Makefile
|
||||||
|
test/allocator_perf_tool/MemkindAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/Numastat.hpp
|
||||||
|
test/allocator_perf_tool/Runnable.hpp
|
||||||
|
test/allocator_perf_tool/PmemMockup.cpp
|
||||||
|
test/allocator_perf_tool/PmemMockup.hpp
|
||||||
|
test/allocator_perf_tool/ScenarioWorkload.cpp
|
||||||
|
test/allocator_perf_tool/ScenarioWorkload.h
|
||||||
|
test/allocator_perf_tool/StandardAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/Stats.hpp
|
||||||
|
test/allocator_perf_tool/StressIncreaseToMax.cpp
|
||||||
|
test/allocator_perf_tool/StressIncreaseToMax.h
|
||||||
|
test/allocator_perf_tool/Task.hpp
|
||||||
|
test/allocator_perf_tool/TaskFactory.hpp
|
||||||
|
test/allocator_perf_tool/Tests.hpp
|
||||||
|
test/allocator_perf_tool/Thread.hpp
|
||||||
|
test/allocator_perf_tool/TimerSysTime.hpp
|
||||||
|
test/allocator_perf_tool/VectorIterator.hpp
|
||||||
|
test/allocator_perf_tool/Workload.hpp
|
||||||
|
test/allocator_perf_tool/WrappersMacros.hpp
|
||||||
|
test/allocator_perf_tool/HugePageUnmap.hpp
|
||||||
|
test/allocator_perf_tool/HugePageOrganizer.hpp
|
||||||
|
test/allocator_perf_tool/HBWmallocAllocatorWithTimer.hpp
|
||||||
|
test/allocator_perf_tool/main.cpp
|
||||||
|
test/allocate_to_max_stress_test.cpp
|
||||||
|
test/memkind_versioning_tests.cpp
|
||||||
|
test/heap_manager_init_perf_test.cpp
|
||||||
|
test/autohbw_test_helper.c
|
||||||
|
test/trace_mechanism_test_helper.c
|
||||||
|
test/hbw_detection_test.py
|
||||||
|
test/autohbw_test.py
|
||||||
|
test/trace_mechanism_test.py
|
||||||
|
test/python_framework/cmd_helper.py
|
||||||
|
test/python_framework/huge_page_organizer.py
|
||||||
|
test/python_framework/__init__.py
|
||||||
|
test/draw_plots.py
|
||||||
|
test/run_alloc_benchmark.sh
|
||||||
|
test/alloc_benchmark.c
|
||||||
|
test/load_tbbmalloc_symbols.c
|
||||||
|
test/tbbmalloc.h
|
||||||
|
test/freeing_memory_segfault_test.cpp
|
||||||
|
test/dlopen_test.cpp
|
||||||
|
test/pmem_allocator_tests.cpp
|
||||||
|
man/memkind_pmem.3
|
||||||
|
src/memkind_pmem.c
|
||||||
|
|
10
copying_headers/MANIFEST.freeBSD3
Normal file
10
copying_headers/MANIFEST.freeBSD3
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
examples/pmem_kinds.c
|
||||||
|
examples/pmem_malloc.c
|
||||||
|
examples/pmem_malloc_unlimited.c
|
||||||
|
examples/pmem_usable_size.c
|
||||||
|
examples/pmem_alignment.c
|
||||||
|
examples/pmem_and_default_kind
|
||||||
|
examples/pmem_multithreads.c
|
||||||
|
examples/pmem_multithreads_onekind.c
|
||||||
|
examples/pmem_free_with_unknown_kind.c
|
||||||
|
examples/pmem_cpp_allocator.cpp
|
23
copying_headers/header.freeBSD
Normal file
23
copying_headers/header.freeBSD
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
31
copying_headers/header.freeBSD3
Normal file
31
copying_headers/header.freeBSD3
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
36
copying_headers/header.intel-acpi
Normal file
36
copying_headers/header.intel-acpi
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2000 - 2014, Intel Corp.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions, and the following disclaimer,
|
||||||
|
* without modification.
|
||||||
|
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||||
|
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||||
|
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||||
|
* including a substantially similar Disclaimer requirement for further
|
||||||
|
* binary redistribution.
|
||||||
|
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||||
|
* of any contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* Alternatively, this software may be distributed under the terms of the
|
||||||
|
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||||
|
* Software Foundation.
|
||||||
|
*
|
||||||
|
* NO WARRANTY
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*/
|
5
debian/changelog
vendored
Normal file
5
debian/changelog
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
memkind (0.0.0) UNRELEASED; urgency=low
|
||||||
|
|
||||||
|
* See ChangeLog for more details
|
||||||
|
|
||||||
|
-- Krzysztof Kulakowski <krzysztof.kulakowski@intel.com> Mon, 12 Dec 2016 15:53:31 +0000
|
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
9
|
25
debian/control
vendored
Normal file
25
debian/control
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
Source: memkind
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Krzysztof Kulakowski <krzysztof.kulakowski@intel.com>
|
||||||
|
Build-Depends: debhelper (>= 8.0.0)
|
||||||
|
Standards-Version: 3.9.4
|
||||||
|
Homepage: https://github.com/memkind/memkind
|
||||||
|
|
||||||
|
Package: memkind
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
|
Description:
|
||||||
|
The memkind library is an user extensible heap manager built on top of
|
||||||
|
jemalloc which enables control of memory characteristics and a
|
||||||
|
partitioning of the heap between kinds of memory. The kinds of memory
|
||||||
|
are defined by operating system memory policies that have been applied
|
||||||
|
to virtual address ranges. Memory characteristics supported by
|
||||||
|
memkind without user extension include control of NUMA and page size
|
||||||
|
features. The jemalloc non-standard interface has been extended to
|
||||||
|
enable specialized arenas to make requests for virtual memory from the
|
||||||
|
operating system through the memkind partition interface. Through the
|
||||||
|
other memkind interfaces the user can control and extend memory
|
||||||
|
partition features and allocate memory while selecting enabled
|
||||||
|
features. This software is being made available for early evaluation.
|
||||||
|
Feedback on design or implementation is greatly appreciated.
|
21
debian/rules
vendored
Executable file
21
debian/rules
vendored
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
# -*- makefile -*-
|
||||||
|
|
||||||
|
# Uncomment this to turn on verbose mode.
|
||||||
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
# ignore tests during build
|
||||||
|
override_dh_auto_test:
|
||||||
|
|
||||||
|
override_dh_auto_configure:
|
||||||
|
./build_jemalloc.sh
|
||||||
|
./autogen.sh
|
||||||
|
dh_auto_configure -- --prefix=/usr --libdir=/usr/lib \
|
||||||
|
--includedir=/usr/include --sbindir=/usr/sbin --enable-cxx11 \
|
||||||
|
--mandir=/usr/share/man --docdir=/usr/share/doc/memkind
|
||||||
|
|
||||||
|
override_dh_auto_build:
|
||||||
|
dh_auto_build -- checkprogs
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@
|
85
examples/Makefile.mk
Normal file
85
examples/Makefile.mk
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
noinst_PROGRAMS += examples/hello_memkind \
|
||||||
|
examples/hello_memkind_debug \
|
||||||
|
examples/hello_hbw \
|
||||||
|
examples/filter_memkind \
|
||||||
|
examples/pmem_kinds \
|
||||||
|
examples/pmem_malloc \
|
||||||
|
examples/pmem_malloc_unlimited \
|
||||||
|
examples/pmem_usable_size \
|
||||||
|
examples/pmem_alignment \
|
||||||
|
examples/pmem_and_default_kind \
|
||||||
|
examples/pmem_multithreads \
|
||||||
|
examples/pmem_multithreads_onekind \
|
||||||
|
examples/pmem_free_with_unknown_kind \
|
||||||
|
examples/autohbw_candidates \
|
||||||
|
# end
|
||||||
|
if HAVE_CXX11
|
||||||
|
noinst_PROGRAMS += examples/memkind_allocated
|
||||||
|
noinst_PROGRAMS += examples/pmem_cpp_allocator
|
||||||
|
endif
|
||||||
|
|
||||||
|
examples_hello_memkind_LDADD = libmemkind.la
|
||||||
|
examples_hello_memkind_debug_LDADD = libmemkind.la
|
||||||
|
examples_hello_hbw_LDADD = libmemkind.la
|
||||||
|
examples_filter_memkind_LDADD = libmemkind.la
|
||||||
|
examples_pmem_kinds_LDADD = libmemkind.la
|
||||||
|
examples_pmem_malloc_LDADD = libmemkind.la
|
||||||
|
examples_pmem_malloc_unlimited_LDADD = libmemkind.la
|
||||||
|
examples_pmem_usable_size_LDADD = libmemkind.la
|
||||||
|
examples_pmem_alignment_LDADD = libmemkind.la
|
||||||
|
examples_pmem_and_default_kind_LDADD = libmemkind.la
|
||||||
|
examples_pmem_multithreads_LDADD = libmemkind.la
|
||||||
|
examples_pmem_multithreads_onekind_LDADD = libmemkind.la
|
||||||
|
examples_pmem_free_with_unknown_kind_LDADD = libmemkind.la
|
||||||
|
examples_autohbw_candidates_LDADD = libmemkind.la
|
||||||
|
|
||||||
|
if HAVE_CXX11
|
||||||
|
examples_memkind_allocated_LDADD = libmemkind.la
|
||||||
|
examples_pmem_cpp_allocator_LDADD = libmemkind.la
|
||||||
|
endif
|
||||||
|
|
||||||
|
examples_hello_memkind_SOURCES = examples/hello_memkind_example.c
|
||||||
|
examples_hello_memkind_debug_SOURCES = examples/hello_memkind_example.c examples/memkind_decorator_debug.c
|
||||||
|
examples_hello_hbw_SOURCES = examples/hello_hbw_example.c
|
||||||
|
examples_filter_memkind_SOURCES = examples/filter_example.c
|
||||||
|
examples_pmem_kinds_SOURCES = examples/pmem_kinds.c
|
||||||
|
examples_pmem_malloc_SOURCES = examples/pmem_malloc.c
|
||||||
|
examples_pmem_malloc_unlimited_SOURCES = examples/pmem_malloc_unlimited.c
|
||||||
|
examples_pmem_usable_size_SOURCES = examples/pmem_usable_size.c
|
||||||
|
examples_pmem_alignment_SOURCES = examples/pmem_alignment.c
|
||||||
|
examples_pmem_and_default_kind_SOURCES = examples/pmem_and_default_kind.c
|
||||||
|
examples_pmem_multithreads_SOURCES = examples/pmem_multithreads.c
|
||||||
|
examples_pmem_multithreads_onekind_SOURCES = examples/pmem_multithreads_onekind.c
|
||||||
|
examples_pmem_free_with_unknown_kind_SOURCES = examples/pmem_free_with_unknown_kind.c
|
||||||
|
examples_autohbw_candidates_SOURCES = examples/autohbw_candidates.c
|
||||||
|
if HAVE_CXX11
|
||||||
|
examples_memkind_allocated_SOURCES = examples/memkind_allocated_example.cpp examples/memkind_allocated.hpp
|
||||||
|
examples_pmem_cpp_allocator_SOURCES = examples/pmem_cpp_allocator.cpp
|
||||||
|
endif
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
rm -f examples/*.gcno examples/*.gcda
|
80
examples/README
Normal file
80
examples/README
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# Memkind examples
|
||||||
|
|
||||||
|
The example directory contains example codes that use the memkind
|
||||||
|
interface.
|
||||||
|
|
||||||
|
## PMEM
|
||||||
|
|
||||||
|
The pmem_*.c(pp) demonstrates how to create and use a file-backed memory kind.
|
||||||
|
The default pmem path is "/tmp/".
|
||||||
|
Custom directory is pass as first argument to all of PMEM example programs,
|
||||||
|
e.g. to execute pmem_malloc example in /mnt/pmem location, call:
|
||||||
|
|
||||||
|
./pmem_malloc /mnt/pmem/
|
||||||
|
|
||||||
|
### pmem_kinds.c
|
||||||
|
|
||||||
|
This example shows how to create and destroy pmem kind with defined or unlimited size.
|
||||||
|
|
||||||
|
### pmem_malloc.c
|
||||||
|
|
||||||
|
This example shows how to allocate memory and possibility to exceed pmem kind size.
|
||||||
|
|
||||||
|
### pmem_malloc_unlimited.c
|
||||||
|
|
||||||
|
This example shows how to allocate memory with unlimited kind size.
|
||||||
|
|
||||||
|
### pmem_usable_size.c
|
||||||
|
|
||||||
|
This example shows difference between the expected and the actual allocation size.
|
||||||
|
|
||||||
|
### pmem_alignment.c
|
||||||
|
|
||||||
|
This example shows how to use memkind alignment and how it affects allocations.
|
||||||
|
|
||||||
|
### pmem_multithreads.c
|
||||||
|
|
||||||
|
This example shows how to use multithreading with independent pmem kinds.
|
||||||
|
|
||||||
|
### pmem_multithreads_onekind.c
|
||||||
|
|
||||||
|
This example shows how to use multithreading with one main pmem kind.
|
||||||
|
|
||||||
|
### pmem_and_default_kind.c
|
||||||
|
|
||||||
|
This example shows how to allocate in standard memory and file-backed memory (pmem kind).
|
||||||
|
|
||||||
|
### pmem_free_with_unknown_kind.c
|
||||||
|
|
||||||
|
This example shows how to allocate in standard memory and file-backed memory (pmem kind)
|
||||||
|
and free memory without a need to remember which kind it belongs to.
|
||||||
|
|
||||||
|
### pmem_cpp_allocator.cpp
|
||||||
|
|
||||||
|
This example shows usage of C++ allocator mechanism designed for file-backed memory
|
||||||
|
kind with different data structures like: vector, list and map.
|
||||||
|
|
||||||
|
## Other memkind examples
|
||||||
|
|
||||||
|
The simplest example is the hello_example.c which is a hello world
|
||||||
|
variant. The filter_example.c shows how you would use high bandwidth
|
||||||
|
memory to store a reduction of a larger data set stored in DDR. There is
|
||||||
|
also an example of how to create user defined kinds. This example
|
||||||
|
creates kinds which isolate allocations to a single NUMA node each
|
||||||
|
backed by a single arena.
|
||||||
|
|
||||||
|
The memkind_allocated example is simple usage of memkind in C++11 which
|
||||||
|
shows how memkind can be used to allocate objects, and consists of two files:
|
||||||
|
memkind_allocated.hpp - which is definition of template class that should be
|
||||||
|
inherited and parametrized by derived type (curiously recurring template
|
||||||
|
pattern), to let deriving class allocate their objects using specified kind.
|
||||||
|
memkind_allocated_example.cpp - which is usage example of this approach.
|
||||||
|
Logic of memkind_allocated is based on overriding operator new() in template,
|
||||||
|
and allocating memory on kind specified in new() parameter, or by overridable
|
||||||
|
static method getClassKind(). This implementation also supports alignment
|
||||||
|
specifier's (alignas() - new feature in C++11).
|
||||||
|
The downside of this approach is that it will work properly only if
|
||||||
|
memkind_allocated template is inherited once in inheritance chain (which
|
||||||
|
probably makes that not very useful for most scenarios). Other thing is that it
|
||||||
|
overriding class new() operator which can cause various problems if used
|
||||||
|
unwisely.
|
122
examples/autohbw_candidates.c
Normal file
122
examples/autohbw_candidates.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// File : autohbw_candidates.c
|
||||||
|
// Purpose: Shows which functions are interposed by AutoHBW library.
|
||||||
|
// : These functions can be used for testing purposes
|
||||||
|
// Author : Ruchira Sasanka (ruchira.sasanka AT intel.com)
|
||||||
|
// Date : Sept 10, 2015
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// This function contains an example case for each heap allocation function
|
||||||
|
// intercepted by the AutoHBW library
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//volatile is needed to prevent optimizing out below hooks
|
||||||
|
volatile int memkind_called_g;
|
||||||
|
|
||||||
|
void memkind_malloc_post(struct memkind *kind, size_t size, void **result)
|
||||||
|
{
|
||||||
|
memkind_called_g = 1;
|
||||||
|
}
|
||||||
|
void memkind_calloc_post(struct memkind *kind, size_t nmemb, size_t size,
|
||||||
|
void **result)
|
||||||
|
{
|
||||||
|
memkind_called_g = 1;
|
||||||
|
}
|
||||||
|
void memkind_posix_memalign_post(struct memkind *kind, void **memptr,
|
||||||
|
size_t alignment, size_t size, int *err)
|
||||||
|
{
|
||||||
|
memkind_called_g = 1;
|
||||||
|
}
|
||||||
|
void memkind_realloc_post(struct memkind *kind, void *ptr, size_t size,
|
||||||
|
void **result)
|
||||||
|
{
|
||||||
|
memkind_called_g = 1;
|
||||||
|
}
|
||||||
|
void memkind_free_pre(struct memkind **kind, void **ptr)
|
||||||
|
{
|
||||||
|
memkind_called_g = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void finish_testcase(int fail_condition, const char *fail_message, int *err)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(memkind_called_g != 1 || fail_condition) {
|
||||||
|
printf("%s\n", fail_message);
|
||||||
|
*err= -1;
|
||||||
|
}
|
||||||
|
memkind_called_g = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
const size_t size = 1024 * 1024; // 1M of data
|
||||||
|
|
||||||
|
void *buf = NULL;
|
||||||
|
memkind_called_g = 0;
|
||||||
|
|
||||||
|
// Test 1: Test malloc and free
|
||||||
|
buf = malloc(size);
|
||||||
|
finish_testcase(buf==NULL, "Malloc failed!", &err);
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
finish_testcase(0, "Free after malloc failed!", &err);
|
||||||
|
|
||||||
|
// Test 2: Test calloc and free
|
||||||
|
buf = calloc(size, 1);
|
||||||
|
finish_testcase(buf==NULL, "Calloc failed!", &err);
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
finish_testcase(0, "Free after calloc failed!", &err);
|
||||||
|
|
||||||
|
// Test 3: Test realloc and free
|
||||||
|
buf = malloc(size);
|
||||||
|
finish_testcase(buf==NULL, "Malloc before realloc failed!", &err);
|
||||||
|
|
||||||
|
buf = realloc(buf, size * 2);
|
||||||
|
finish_testcase(buf==NULL, "Realloc failed!", &err);
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
finish_testcase(0, "Free after realloc failed!", &err);
|
||||||
|
|
||||||
|
// Test 4: Test posix_memalign and free
|
||||||
|
int ret = posix_memalign(&buf, 64, size);
|
||||||
|
finish_testcase(ret, "Posix_memalign failed!", &err);
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
finish_testcase(0, "Free after posix_memalign failed!", &err);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
87
examples/filter_example.c
Normal file
87
examples/filter_example.c
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2016 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const size_t stream_len = 1024 * 1024;
|
||||||
|
const size_t filter_len = 1024;
|
||||||
|
const size_t num_filter = stream_len / filter_len;
|
||||||
|
size_t i, j;
|
||||||
|
double *stream = NULL;
|
||||||
|
double *filter = NULL;
|
||||||
|
double *result = NULL;
|
||||||
|
|
||||||
|
srandom(0);
|
||||||
|
|
||||||
|
stream = (double *)memkind_malloc(MEMKIND_DEFAULT, stream_len * sizeof(double));
|
||||||
|
if (stream == NULL) {
|
||||||
|
perror("<memkind>");
|
||||||
|
fprintf(stderr, "Unable to allocate stream\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
filter = (double *)memkind_malloc(MEMKIND_HBW, filter_len * sizeof(double));
|
||||||
|
if (filter == NULL) {
|
||||||
|
perror("<memkind>");
|
||||||
|
fprintf(stderr, "Unable to allocate filter\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (double *)memkind_calloc(MEMKIND_HBW, filter_len, sizeof(double));
|
||||||
|
if (result == NULL) {
|
||||||
|
perror("<memkind>");
|
||||||
|
fprintf(stderr, "Unable to allocate result\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < stream_len; i++) {
|
||||||
|
stream[i] = (double)(random())/(double)(RAND_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < filter_len; i++) {
|
||||||
|
filter[i] = (double)(i)/(double)(filter_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < num_filter; i++) {
|
||||||
|
for (j = 0; j < filter_len; j++) {
|
||||||
|
result[j] += stream[i * filter_len + j] * filter[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < filter_len; i++) {
|
||||||
|
fprintf(stdout, "%.6e\n", result[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_free(MEMKIND_HBW, result);
|
||||||
|
memkind_free(MEMKIND_HBW, filter);
|
||||||
|
memkind_free(MEMKIND_DEFAULT, stream);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
81
examples/hello_hbw_example.c
Normal file
81
examples/hello_hbw_example.c
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hbwmalloc.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const size_t size = 512;
|
||||||
|
char *default_str = NULL;
|
||||||
|
char *hbw_str = NULL;
|
||||||
|
char *hbw_hugetlb_str = NULL;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
default_str = (char *)malloc(size);
|
||||||
|
if (default_str == NULL) {
|
||||||
|
perror("malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate default string\n");
|
||||||
|
err = errno ? -errno : 1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
hbw_str = (char *)hbw_malloc(size);
|
||||||
|
if (hbw_str == NULL) {
|
||||||
|
perror("hbw_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate hbw string\n");
|
||||||
|
err = errno ? -errno : 1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
err = hbw_posix_memalign_psize((void **)&hbw_hugetlb_str, 2097152, size,
|
||||||
|
HBW_PAGESIZE_2MB);
|
||||||
|
if (err) {
|
||||||
|
perror("hbw_posix_memalign()");
|
||||||
|
fprintf(stderr, "Unable to allocate hbw hugetlb string\n");
|
||||||
|
err = errno ? -errno : 1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(default_str, "Hello world from standard memory\n");
|
||||||
|
sprintf(hbw_str, "Hello world from high bandwidth memory\n");
|
||||||
|
sprintf(hbw_hugetlb_str, "Hello world from high bandwidth 2 MB paged memory\n");
|
||||||
|
|
||||||
|
fprintf(stdout, "%s", default_str);
|
||||||
|
fprintf(stdout, "%s", hbw_str);
|
||||||
|
fprintf(stdout, "%s", hbw_hugetlb_str);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if (hbw_hugetlb_str) {
|
||||||
|
hbw_free(hbw_hugetlb_str);
|
||||||
|
}
|
||||||
|
if (hbw_str) {
|
||||||
|
hbw_free(hbw_str);
|
||||||
|
}
|
||||||
|
if (default_str) {
|
||||||
|
free(default_str);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
115
examples/hello_memkind_example.c
Normal file
115
examples/hello_memkind_example.c
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const size_t size = 512;
|
||||||
|
char *default_str = NULL;
|
||||||
|
char *hugetlb_str = NULL;
|
||||||
|
char *hbw_str = NULL;
|
||||||
|
char *hbw_hugetlb_str = NULL;
|
||||||
|
char *hbw_preferred_str = NULL;
|
||||||
|
char *hbw_preferred_hugetlb_str = NULL;
|
||||||
|
char *hbw_interleave_str = NULL;
|
||||||
|
|
||||||
|
default_str = (char *)memkind_malloc(MEMKIND_DEFAULT, size);
|
||||||
|
if (default_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate default string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
hugetlb_str = (char *)memkind_malloc(MEMKIND_HUGETLB, size);
|
||||||
|
if (hugetlb_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate hugetlb string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
hbw_str = (char *)memkind_malloc(MEMKIND_HBW, size);
|
||||||
|
if (hbw_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate hbw string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
hbw_hugetlb_str = (char *)memkind_malloc(MEMKIND_HBW_HUGETLB, size);
|
||||||
|
if (hbw_hugetlb_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate hbw_hugetlb string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
hbw_preferred_str = (char *)memkind_malloc(MEMKIND_HBW_PREFERRED, size);
|
||||||
|
if (hbw_preferred_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate hbw_preferred string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
hbw_preferred_hugetlb_str = (char *)memkind_malloc(
|
||||||
|
MEMKIND_HBW_PREFERRED_HUGETLB, size);
|
||||||
|
if (hbw_preferred_hugetlb_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate hbw_preferred_hugetlb string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
hbw_interleave_str = (char *)memkind_malloc(MEMKIND_HBW_INTERLEAVE, size);
|
||||||
|
if (hbw_interleave_str == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr,"Unable to allocate hbw_interleave string\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(default_str, "Hello world from standard memory\n");
|
||||||
|
sprintf(hugetlb_str, "Hello world from standard memory with 2 MB pages\n");
|
||||||
|
sprintf(hbw_str, "Hello world from high bandwidth memory\n");
|
||||||
|
sprintf(hbw_hugetlb_str, "Hello world from high bandwidth 2 MB paged memory\n");
|
||||||
|
sprintf(hbw_preferred_str,
|
||||||
|
"Hello world from high bandwidth memory if sufficient resources exist\n");
|
||||||
|
sprintf(hbw_preferred_hugetlb_str,
|
||||||
|
"Hello world from high bandwidth 2 MB paged memory if sufficient resources exist\n");
|
||||||
|
|
||||||
|
sprintf(hbw_interleave_str,
|
||||||
|
"Hello world from high bandwidth interleaved memory\n");
|
||||||
|
|
||||||
|
fprintf(stdout, "%s", default_str);
|
||||||
|
fprintf(stdout, "%s", hugetlb_str);
|
||||||
|
fprintf(stdout, "%s", hbw_str);
|
||||||
|
fprintf(stdout, "%s", hbw_hugetlb_str);
|
||||||
|
fprintf(stdout, "%s", hbw_preferred_str);
|
||||||
|
fprintf(stdout, "%s", hbw_preferred_hugetlb_str);
|
||||||
|
fprintf(stdout, "%s", hbw_interleave_str);
|
||||||
|
|
||||||
|
memkind_free(MEMKIND_HBW_INTERLEAVE, hbw_interleave_str);
|
||||||
|
memkind_free(MEMKIND_HBW_PREFERRED_HUGETLB, hbw_preferred_hugetlb_str);
|
||||||
|
memkind_free(MEMKIND_HBW_PREFERRED, hbw_preferred_str);
|
||||||
|
memkind_free(MEMKIND_HBW_HUGETLB, hbw_hugetlb_str);
|
||||||
|
memkind_free(MEMKIND_HBW, hbw_str);
|
||||||
|
memkind_free(MEMKIND_HUGETLB, hugetlb_str);
|
||||||
|
memkind_free(MEMKIND_DEFAULT, default_str);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
107
examples/memkind_allocated.hpp
Normal file
107
examples/memkind_allocated.hpp
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
template <class deriving_class>
|
||||||
|
class memkind_allocated
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static memkind_t getClassKind()
|
||||||
|
{
|
||||||
|
return MEMKIND_DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *operator new(std::size_t size)
|
||||||
|
{
|
||||||
|
return deriving_class::operator new(size, deriving_class::getClassKind());
|
||||||
|
}
|
||||||
|
|
||||||
|
void *operator new[](std::size_t size)
|
||||||
|
{
|
||||||
|
return deriving_class::operator new(size, deriving_class::getClassKind());
|
||||||
|
}
|
||||||
|
|
||||||
|
void *operator new(std::size_t size, memkind_t memory_kind)
|
||||||
|
{
|
||||||
|
void *result_ptr = NULL;
|
||||||
|
int allocation_result = 0;
|
||||||
|
|
||||||
|
//This check if deriving_class has specified alignment, which is suitable
|
||||||
|
//to be used with posix_memalign()
|
||||||
|
if(alignof(deriving_class) < sizeof(void *)) {
|
||||||
|
result_ptr = memkind_malloc(memory_kind, size);
|
||||||
|
allocation_result = result_ptr ? 1 : 0;
|
||||||
|
} else {
|
||||||
|
allocation_result = memkind_posix_memalign(memory_kind, &result_ptr,
|
||||||
|
alignof(deriving_class), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(allocation_result) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *operator new[](std::size_t size, memkind_t memory_kind)
|
||||||
|
{
|
||||||
|
return deriving_class::operator new(size, memory_kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete(void *ptr, memkind_t memory_kind)
|
||||||
|
{
|
||||||
|
memkind_free(memory_kind, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete(void *ptr)
|
||||||
|
{
|
||||||
|
memkind_free(0, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete[](void *ptr)
|
||||||
|
{
|
||||||
|
deriving_class::operator delete(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete[](void *ptr, memkind_t memory_kind)
|
||||||
|
{
|
||||||
|
deriving_class::operator delete(ptr, memory_kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
memkind_allocated()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~memkind_allocated()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
105
examples/memkind_allocated_example.cpp
Normal file
105
examples/memkind_allocated_example.cpp
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
#include "memkind_allocated.hpp"
|
||||||
|
|
||||||
|
// This code is example usage of C++11 features with custom allocator,
|
||||||
|
// support for C++11 is required.
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#if __cplusplus > 199711L
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <new>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
//example class definition, which derive from memkind_allocated template to
|
||||||
|
//have objects allocated with memkind, and have alignment specified by alignas()
|
||||||
|
class alignas(128) memkind_allocated_example : public
|
||||||
|
memkind_allocated<memkind_allocated_example>
|
||||||
|
{
|
||||||
|
std::string message;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//Override method for returning class default kind to make objects be by default allocated on High-Bandwith Memory
|
||||||
|
static memkind_t getClassKind()
|
||||||
|
{
|
||||||
|
return MEMKIND_HBW;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_allocated_example(std::string my_message)
|
||||||
|
{
|
||||||
|
this->message = my_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_allocated_example()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_message()
|
||||||
|
{
|
||||||
|
std::cout << message << std::endl;
|
||||||
|
std::cout << "Memory adress of this object is: " << (void *)this << std::endl
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
memkind_t specified_kind = MEMKIND_HBW_HUGETLB;
|
||||||
|
|
||||||
|
memkind_allocated_example *default_kind_example = new memkind_allocated_example(
|
||||||
|
std::string("This object has been allocated using class default kind, which is: MEMKIND_DEFAULT") );
|
||||||
|
default_kind_example->print_message();
|
||||||
|
delete default_kind_example;
|
||||||
|
|
||||||
|
memkind_allocated_example *specified_kind_example = new(
|
||||||
|
specified_kind) memkind_allocated_example(
|
||||||
|
std::string("This object has been allocated using specified kind, which is: MEMKIND_HBW_HUGETLB") );
|
||||||
|
specified_kind_example->print_message();
|
||||||
|
delete specified_kind_example;
|
||||||
|
|
||||||
|
//examples for using same aproach for allocating arrays of objects, note that objects created that way can be initialized only with default (unparameterized) constructor
|
||||||
|
memkind_allocated_example *default_kind_array_example = new
|
||||||
|
memkind_allocated_example[5]();
|
||||||
|
delete[] default_kind_array_example;
|
||||||
|
|
||||||
|
memkind_allocated_example *specified_kind_array_example = new(
|
||||||
|
specified_kind) memkind_allocated_example[5]();
|
||||||
|
delete[] specified_kind_array_example;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else //If C++11 is not avaiable - do nothing.
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::cout << "WARNING: because your compiler does not support C++11 standard,"
|
||||||
|
<< std::endl;
|
||||||
|
std::cout << "this example is only as a dummy placeholder." << std::endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
64
examples/memkind_decorator_debug.c
Normal file
64
examples/memkind_decorator_debug.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* This is an example that enables debug printing on every alloction call */
|
||||||
|
|
||||||
|
static void memkind_debug(const char *func, memkind_t kind, size_t size,
|
||||||
|
void *ptr)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[ DEBUG ] func=%s kind=%p size=%zu ptr=0x%lx\n", func, kind,
|
||||||
|
size, (size_t)ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memkind_malloc_post(memkind_t kind, size_t size, void **result)
|
||||||
|
{
|
||||||
|
memkind_debug("memkind_malloc", kind, size, *result);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memkind_calloc_post(memkind_t kind, size_t nmemb, size_t size,
|
||||||
|
void **result)
|
||||||
|
{
|
||||||
|
memkind_debug("memkind_calloc", kind, nmemb * size, *result);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memkind_posix_memalign_post(memkind_t kind, void **memptr,
|
||||||
|
size_t alignment, size_t size, int *err)
|
||||||
|
{
|
||||||
|
memkind_debug("memkind_posix_memalign", kind, size, *memptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memkind_realloc_post(memkind_t kind, void *ptr, size_t size, void **result)
|
||||||
|
{
|
||||||
|
memkind_debug("memkind_realloc", kind, size, *result);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memkind_free_pre(memkind_t kind, void **ptr)
|
||||||
|
{
|
||||||
|
memkind_debug("memkind_free", kind, 0, *ptr);
|
||||||
|
}
|
136
examples/pmem_alignment.c
Normal file
136
examples/pmem_alignment.c
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#define PMEM_MAX_SIZE (1024 * 1024 * 32)
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kind = NULL;
|
||||||
|
int err = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to use memkind alignment and how it affects allocations.\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
/* Create PMEM partition with PMEM_MAX_SIZE size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, PMEM_MAX_SIZE, &pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pmem_str10 = NULL;
|
||||||
|
char *pmem_str11 = NULL;
|
||||||
|
|
||||||
|
/* Lets make two 32 bytes allocations */
|
||||||
|
pmem_str10 = (char *)memkind_malloc(pmem_kind, 32);
|
||||||
|
if (pmem_str10 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str10)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmem_str11 = (char *)memkind_malloc(pmem_kind, 32);
|
||||||
|
if (pmem_str11 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str11)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* They will be very close to each other in memory */
|
||||||
|
if (pmem_str11 - pmem_str10 != 32) {
|
||||||
|
fprintf(stderr, "Something went wrong\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_free(pmem_kind, pmem_str10);
|
||||||
|
memkind_free(pmem_kind, pmem_str11);
|
||||||
|
|
||||||
|
/* Lets make two 32 bytes allocations with alignment 64 this time */
|
||||||
|
err = memkind_posix_memalign(pmem_kind, (void **)&pmem_str10, 64, 32);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_posix_memalign()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str10) with alignment\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = memkind_posix_memalign(pmem_kind, (void **)&pmem_str11, 64, 32);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_posix_memalign()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str11) with alignment\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This time addresses are not close to each other, they are aligned to 64 */
|
||||||
|
if (pmem_str11 - pmem_str10 != 64) {
|
||||||
|
fprintf(stderr, "Something went wrong with alignment allocation\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_free(pmem_kind, pmem_str10);
|
||||||
|
memkind_free(pmem_kind, pmem_str11);
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"The memory has been successfully allocated using memkind alignment.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
149
examples/pmem_and_default_kind.c
Normal file
149
examples/pmem_and_default_kind.c
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#define MB (1024 * 1024)
|
||||||
|
#define HEAP_LIMIT_SIMULATE (1024 * MB)
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const size_t size = 512;
|
||||||
|
struct memkind *pmem_kind = NULL;
|
||||||
|
int err = 0;
|
||||||
|
errno = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//operation below limit the current size of heap
|
||||||
|
//to show different place of allocation
|
||||||
|
const struct rlimit heap_limit = { HEAP_LIMIT_SIMULATE, HEAP_LIMIT_SIMULATE };
|
||||||
|
err = setrlimit(RLIMIT_DATA, &heap_limit);
|
||||||
|
if (err) {
|
||||||
|
perror("setrlimit()");
|
||||||
|
fprintf(stderr, "Unable to set heap limit\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *ptr_default = NULL;
|
||||||
|
char *ptr_default_not_possible = NULL;
|
||||||
|
char *ptr_pmem = NULL;
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to allocate memory using standard memory (MEMKIND_DEFAULT) "
|
||||||
|
"and file-backed kind of memory (PMEM).\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, 0, &pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr_default = (char *)memkind_malloc(MEMKIND_DEFAULT, size);
|
||||||
|
if (!ptr_default) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable allocate 512 bytes in standard memory");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
ptr_default_not_possible = (char *)memkind_malloc(MEMKIND_DEFAULT,
|
||||||
|
HEAP_LIMIT_SIMULATE);
|
||||||
|
if (ptr_default_not_possible) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr,
|
||||||
|
"Failure, this allocation should not be possible "
|
||||||
|
"(expected result was NULL), because of setlimit function\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
if (errno != ENOMEM) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr,
|
||||||
|
"Failure, this allocation should set errno to ENOMEM value, because of setlimit function\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
ptr_pmem = (char *)memkind_malloc(pmem_kind, HEAP_LIMIT_SIMULATE);
|
||||||
|
if (!ptr_pmem) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable allocate HEAP_LIMIT_SIMULATE in file-backed memory");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
if (errno != 0) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Failure, this allocation should not set errno value\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(ptr_default, "Hello world from standard memory - ptr_default\n");
|
||||||
|
sprintf(ptr_pmem, "Hello world from file-backed memory - ptr_pmem\n");
|
||||||
|
|
||||||
|
fprintf(stdout, "%s", ptr_default);
|
||||||
|
fprintf(stdout, "%s", ptr_pmem);
|
||||||
|
|
||||||
|
memkind_free(MEMKIND_DEFAULT, ptr_default);
|
||||||
|
memkind_free(pmem_kind, ptr_pmem);
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Memory was successfully allocated and released.\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
166
examples/pmem_cpp_allocator.cpp
Normal file
166
examples/pmem_cpp_allocator.cpp
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "pmem_allocator.h"
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <scoped_allocator>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#define STL_VECTOR_TEST
|
||||||
|
#define STL_LIST_TEST
|
||||||
|
#if _GLIBCXX_USE_CXX11_ABI
|
||||||
|
#define STL_VEC_STRING_TEST
|
||||||
|
#define STL_MAP_INT_STRING_TEST
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void cpp_allocator_test(const char *pmem_directory)
|
||||||
|
{
|
||||||
|
std::cout << "TEST SCOPE: HELLO" << std::endl;
|
||||||
|
|
||||||
|
size_t pmem_max_size = 1024*1024*1024;
|
||||||
|
|
||||||
|
#ifdef STL_VECTOR_TEST
|
||||||
|
{
|
||||||
|
std::cout << "VECTOR OPEN" << std::endl;
|
||||||
|
pmem::allocator<int> alc{ pmem_directory, pmem_max_size };
|
||||||
|
std::vector<int, pmem::allocator<int>> vector{ alc };
|
||||||
|
|
||||||
|
for (int i = 0; i < 20; ++i) {
|
||||||
|
vector.push_back(0xDEAD + i);
|
||||||
|
assert(vector.back() == 0xDEAD + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "VECTOR CLOSE" << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STL_LIST_TEST
|
||||||
|
{
|
||||||
|
std::cout << "LIST OPEN" << std::endl;
|
||||||
|
pmem::allocator<int> alc{ pmem_directory, pmem_max_size };
|
||||||
|
std::list<int, pmem::allocator<int>> list{ alc };
|
||||||
|
|
||||||
|
const int nx2 = 4;
|
||||||
|
for (int i = 0; i < nx2; ++i) {
|
||||||
|
list.emplace_back(0xBEAC011 + i);
|
||||||
|
assert(list.back() == 0xBEAC011 + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < nx2; ++i) {
|
||||||
|
list.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "LIST CLOSE" << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STL_VEC_STRING_TEST
|
||||||
|
{
|
||||||
|
std::cout << "STRINGED VECTOR OPEN" << std::endl;
|
||||||
|
typedef pmem::allocator<char> str_alloc_t;
|
||||||
|
typedef std::basic_string<char, std::char_traits<char>, str_alloc_t>
|
||||||
|
pmem_string;
|
||||||
|
typedef pmem::allocator<pmem_string> vec_alloc_t;
|
||||||
|
|
||||||
|
vec_alloc_t vec_alloc{ pmem_directory, pmem_max_size };
|
||||||
|
str_alloc_t str_alloc{ pmem_directory, pmem_max_size };
|
||||||
|
|
||||||
|
std::vector<pmem_string, std::scoped_allocator_adaptor<vec_alloc_t> >
|
||||||
|
vec{ std::scoped_allocator_adaptor<vec_alloc_t>(vec_alloc) };
|
||||||
|
|
||||||
|
pmem_string arg{ "Very very loooong striiiing", str_alloc };
|
||||||
|
|
||||||
|
vec.push_back(arg);
|
||||||
|
assert(vec.back() == arg);
|
||||||
|
|
||||||
|
std::cout << "STRINGED VECTOR CLOSE" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STL_MAP_INT_STRING_TEST
|
||||||
|
{
|
||||||
|
std::cout << "INT_STRING MAP OPEN" << std::endl;
|
||||||
|
typedef std::basic_string<char, std::char_traits<char>, pmem::allocator<char>>
|
||||||
|
pmem_string;
|
||||||
|
typedef int key_t;
|
||||||
|
typedef pmem_string value_t;
|
||||||
|
typedef pmem::allocator<char> allocator_t;
|
||||||
|
typedef std::map<key_t, value_t, std::less<key_t>, std::scoped_allocator_adaptor<allocator_t>>
|
||||||
|
map_t;
|
||||||
|
|
||||||
|
allocator_t allocator( pmem_directory, pmem_max_size );
|
||||||
|
|
||||||
|
value_t source_str1("Lorem ipsum dolor ", allocator);
|
||||||
|
value_t source_str2("sit amet consectetuer adipiscing elit", allocator );
|
||||||
|
|
||||||
|
map_t target_map{ std::scoped_allocator_adaptor<allocator_t>(allocator) };
|
||||||
|
|
||||||
|
target_map[key_t(165)] = source_str1;
|
||||||
|
assert(target_map[key_t(165)] == source_str1);
|
||||||
|
target_map[key_t(165)] = source_str2;
|
||||||
|
assert(target_map[key_t(165)] == source_str2);
|
||||||
|
|
||||||
|
std::cout << "INT_STRING MAP CLOSE" << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
std::cout << "TEST SCOPE: GOODBYE" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const char *pmem_directory = "/tmp/";
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
std::cerr << "Usage: pmem_cpp_allocator [directory path]\n"
|
||||||
|
<< "\t[directory path] - directory where temporary file is created (default = \"/tmp/\")"
|
||||||
|
<< std::endl;
|
||||||
|
return 0;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
struct stat st;
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr,"%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pmem_directory = argv[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
cpp_allocator_test(pmem_directory);
|
||||||
|
return 0;
|
||||||
|
}
|
118
examples/pmem_free_with_unknown_kind.c
Normal file
118
examples/pmem_free_with_unknown_kind.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
static const size_t PMEM_PART_SIZE = MEMKIND_PMEM_MIN_SIZE + 4 * 1024;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const size_t size = 512;
|
||||||
|
struct memkind *pmem_kind = NULL;
|
||||||
|
struct stat st;
|
||||||
|
const int arraySize = 100;
|
||||||
|
char *ptr[100] = { NULL };
|
||||||
|
int i = 0;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to use memkind_free with unknown kind as a parameter.\n");
|
||||||
|
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, PMEM_PART_SIZE, &pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < arraySize; ++i) {
|
||||||
|
if (i < 50) {
|
||||||
|
ptr[i] = memkind_malloc(MEMKIND_DEFAULT, size);
|
||||||
|
if (ptr[i] == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate memkind default\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ptr[i] = memkind_malloc(pmem_kind, size);
|
||||||
|
if (ptr[i] == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stdout,
|
||||||
|
"Memory was successfully allocated in default kind and pmem kind.\n");
|
||||||
|
|
||||||
|
sprintf(ptr[10], "Hello world from standard memory - ptr[10].\n");
|
||||||
|
sprintf(ptr[40], "Hello world from standard memory - ptr[40].\n");
|
||||||
|
sprintf(ptr[80], "Hello world from persistent memory - ptr[80].\n");
|
||||||
|
|
||||||
|
fprintf(stdout, "%s", ptr[10]);
|
||||||
|
fprintf(stdout, "%s", ptr[40]);
|
||||||
|
fprintf(stdout, "%s", ptr[80]);
|
||||||
|
|
||||||
|
fprintf(stdout, "Free memory without specifying kind.\n");
|
||||||
|
for (i = 0; i < arraySize; ++i) {
|
||||||
|
memkind_free(NULL, ptr[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Memory was successfully released.\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
126
examples/pmem_kinds.c
Normal file
126
examples/pmem_kinds.c
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#define PMEM_MAX_SIZE (1024 * 1024 * 32)
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kinds[10] = {NULL};
|
||||||
|
struct memkind *pmem_kind = NULL;
|
||||||
|
struct memkind *pmem_kind_unlimited = NULL;
|
||||||
|
|
||||||
|
int err = 0, i = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to create and destroy pmem kind with defined or unlimited size."
|
||||||
|
"\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
/* Create PMEM partition with specific size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, PMEM_MAX_SIZE, &pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create PMEM partition with unlimited size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, 0, &pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* and delete them */
|
||||||
|
err = memkind_destroy_kind(pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create many PMEM kinds */
|
||||||
|
for (i = 0; i < 10; i++) {
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, PMEM_MAX_SIZE, &pmem_kinds[i]);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* and delete them */
|
||||||
|
for (i = 0; i < 10; i++) {
|
||||||
|
err = memkind_destroy_kind(pmem_kinds[i]);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_pmem_destroy()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "PMEM kinds have been successfully created and destroyed.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
135
examples/pmem_malloc.c
Normal file
135
examples/pmem_malloc.c
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015 - 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#define PMEM_MAX_SIZE (1024 * 1024 * 32)
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kind = NULL;
|
||||||
|
int err = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to allocate memory and possibility to exceed pmem kind size."
|
||||||
|
"\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
/* Create PMEM partition with specific size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, PMEM_MAX_SIZE, &pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pmem_str1 = NULL;
|
||||||
|
char *pmem_str2 = NULL;
|
||||||
|
char *pmem_str3 = NULL;
|
||||||
|
char *pmem_str4 = NULL;
|
||||||
|
|
||||||
|
// allocate 512 Bytes of 32 MB available
|
||||||
|
pmem_str1 = (char *)memkind_malloc(pmem_kind, 512);
|
||||||
|
if (pmem_str1 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str1)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate 8 MB of 31.9 MB available
|
||||||
|
pmem_str2 = (char *)memkind_malloc(pmem_kind, 8 * 1024 * 1024);
|
||||||
|
if (pmem_str2 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str11)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate 16 MB of 23.9 MB available
|
||||||
|
pmem_str3 = (char *)memkind_malloc(pmem_kind, 16 * 1024 * 1024);
|
||||||
|
if (pmem_str3 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str12)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate 16 MB of 7.9 MB available -- Out Of Memory expected
|
||||||
|
pmem_str4 = (char *)memkind_malloc(pmem_kind, 16 * 1024 * 1024);
|
||||||
|
if (pmem_str4 != NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr,
|
||||||
|
"Failure, this allocation should not be possible (expected result was NULL)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(pmem_str1, "Hello world from pmem - pmem_str1\n");
|
||||||
|
sprintf(pmem_str2, "Hello world from pmem - pmem_str2\n");
|
||||||
|
sprintf(pmem_str3, "Hello world from persistent memory - pmem_str3\n");
|
||||||
|
|
||||||
|
fprintf(stdout, "%s", pmem_str1);
|
||||||
|
fprintf(stdout, "%s", pmem_str2);
|
||||||
|
fprintf(stdout, "%s", pmem_str3);
|
||||||
|
|
||||||
|
memkind_free(pmem_kind, pmem_str1);
|
||||||
|
memkind_free(pmem_kind, pmem_str2);
|
||||||
|
memkind_free(pmem_kind, pmem_str3);
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Memory was successfully allocated and released.\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
105
examples/pmem_malloc_unlimited.c
Normal file
105
examples/pmem_malloc_unlimited.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kind_unlimited = NULL;
|
||||||
|
int err = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory ", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to allocate memory with unlimited kind size."
|
||||||
|
"nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
/* Create PMEM partition with unlimited size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, 0, &pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pmem_str10 = NULL;
|
||||||
|
char *pmem_str11 = NULL;
|
||||||
|
|
||||||
|
/* Huge allocation */
|
||||||
|
pmem_str10 = (char *)memkind_malloc(pmem_kind_unlimited, 32 * 1024 * 1024);
|
||||||
|
if (pmem_str10 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str10)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Another huge allocation, kind size is only limited by OS resources */
|
||||||
|
pmem_str11 = (char *)memkind_malloc(pmem_kind_unlimited, 32 * 1024 * 1024);
|
||||||
|
if (pmem_str11 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str11)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str10);
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str11);
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Memory was successfully allocated and released.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
138
examples/pmem_multithreads.c
Normal file
138
examples/pmem_multithreads.c
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define PMEM_MAX_SIZE (1024 * 1024 * 32)
|
||||||
|
#define NUM_THREADS 10
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
void *thread_ind(void *arg);
|
||||||
|
|
||||||
|
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to use multithreading with independent pmem kinds."
|
||||||
|
"\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
pthread_t pmem_threads[NUM_THREADS];
|
||||||
|
int t;
|
||||||
|
|
||||||
|
/* Lets create many independent threads */
|
||||||
|
for (t = 0; t < NUM_THREADS; t++) {
|
||||||
|
err = pthread_create(&pmem_threads[t], NULL, thread_ind, NULL);
|
||||||
|
if (err) {
|
||||||
|
fprintf(stderr, "Unable to create a thread\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
pthread_cond_broadcast(&cond);
|
||||||
|
|
||||||
|
for (t = 0; t < NUM_THREADS; t++) {
|
||||||
|
err = pthread_join(pmem_threads[t], NULL);
|
||||||
|
if (err) {
|
||||||
|
fprintf(stderr, "Thread join failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Threads successfully allocated memory in the PMEM kinds.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *thread_ind(void *arg)
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kind;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mutex);
|
||||||
|
pthread_cond_wait(&cond, &mutex);
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
|
||||||
|
/* Create a pmem kind in thread */
|
||||||
|
int err = memkind_create_pmem(PMEM_DIR, PMEM_MAX_SIZE, &pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("thread memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Alloc something */
|
||||||
|
void *test = memkind_malloc(pmem_kind, 32);
|
||||||
|
if (test == NULL) {
|
||||||
|
perror("thread memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem (test)\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free resources */
|
||||||
|
memkind_free(pmem_kind, test);
|
||||||
|
|
||||||
|
/* And destroy pmem kind */
|
||||||
|
err = memkind_destroy_kind(pmem_kind);
|
||||||
|
if (err) {
|
||||||
|
perror("thread memkind_pmem_destroy()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
159
examples/pmem_multithreads_onekind.c
Normal file
159
examples/pmem_multithreads_onekind.c
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define NUM_THREADS 10
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
struct arg_struct {
|
||||||
|
int id;
|
||||||
|
struct memkind *kind;
|
||||||
|
int **ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
void *thread_onekind(void *arg);
|
||||||
|
|
||||||
|
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kind_unlimited = NULL;
|
||||||
|
int err = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows how to use multithreading with one main pmem kind."
|
||||||
|
"\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
/* Create PMEM partition with unlimited size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, 0, &pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a few threads which will access to our main pmem_kind */
|
||||||
|
pthread_t pmem_threads[NUM_THREADS];
|
||||||
|
int *pmem_tint[NUM_THREADS][100];
|
||||||
|
int t = 0, i = 0;
|
||||||
|
|
||||||
|
struct arg_struct *args[NUM_THREADS];
|
||||||
|
|
||||||
|
for (t = 0; t<NUM_THREADS; t++) {
|
||||||
|
args[t] = malloc(sizeof(struct arg_struct));
|
||||||
|
args[t]->id = t;
|
||||||
|
args[t]->ptr = &pmem_tint[t][0];
|
||||||
|
args[t]->kind = pmem_kind_unlimited;
|
||||||
|
|
||||||
|
err = pthread_create(&pmem_threads[t], NULL, thread_onekind, (void *)args[t]);
|
||||||
|
if (err) {
|
||||||
|
fprintf(stderr, "Unable to create a thread\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
pthread_cond_broadcast(&cond);
|
||||||
|
|
||||||
|
for (t = 0; t < NUM_THREADS; t++) {
|
||||||
|
err = pthread_join(pmem_threads[t], NULL);
|
||||||
|
if (err) {
|
||||||
|
fprintf(stderr, "Thread join failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we can read the values outside of threads and free resources */
|
||||||
|
for (t = 0; t < NUM_THREADS; t++) {
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
if(*pmem_tint[t][i] != t) {
|
||||||
|
perror("read thread memkind_malloc()");
|
||||||
|
fprintf(stderr, "pmem_tint value has not been saved correctly in the thread\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
memkind_free(args[t]->kind, *(args[t]->ptr+i));
|
||||||
|
}
|
||||||
|
free(args[t]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Threads successfully allocated memory in the PMEM kind.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *thread_onekind(void *arg)
|
||||||
|
{
|
||||||
|
struct arg_struct *args = (struct arg_struct *)arg;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mutex);
|
||||||
|
pthread_cond_wait(&cond, &mutex);
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
|
||||||
|
/* Lets alloc int and put there thread ID */
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
*(args->ptr+i) = (int *)memkind_malloc(args->kind, sizeof(int));
|
||||||
|
if (*(args->ptr+i) == NULL) {
|
||||||
|
perror("thread memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem int\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
**(args->ptr+i) = args->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
172
examples/pmem_usable_size.c
Normal file
172
examples/pmem_usable_size.c
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Intel Corporation
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
static char *PMEM_DIR = "/tmp/";
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct memkind *pmem_kind_unlimited = NULL;
|
||||||
|
int err = 0;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (argc > 2) {
|
||||||
|
fprintf(stderr, "Usage: %s [pmem_kind_dir_path]", argv[0]);
|
||||||
|
return 1;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
if (stat(argv[1], &st) != 0 || !S_ISDIR(st.st_mode)) {
|
||||||
|
fprintf(stderr, "%s : Invalid path to pmem kind directory", argv[1]);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PMEM_DIR = argv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"This example shows difference between the expected and the actual allocation size."
|
||||||
|
"\nPMEM kind directory: %s\n",
|
||||||
|
PMEM_DIR);
|
||||||
|
|
||||||
|
/* Create PMEM partition with unlimited size */
|
||||||
|
err = memkind_create_pmem(PMEM_DIR, 0, &pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_create_pmem()");
|
||||||
|
fprintf(stderr, "Unable to create pmem partition err=%d errno=%d\n", err,
|
||||||
|
errno);
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *pmem_str10 = NULL;
|
||||||
|
char *pmem_str11 = NULL;
|
||||||
|
char *pmem_str12 = NULL;
|
||||||
|
|
||||||
|
/* 32 bytes allocation */
|
||||||
|
pmem_str10 = (char *)memkind_malloc(pmem_kind_unlimited, 32);
|
||||||
|
if (pmem_str10 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str10)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check real usable size for this allocation */
|
||||||
|
if (memkind_malloc_usable_size(pmem_kind_unlimited, pmem_str10) != 32) {
|
||||||
|
perror("memkind_default_malloc_usable_size()");
|
||||||
|
fprintf(stderr, "Wrong usable size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 31 bytes allocation */
|
||||||
|
pmem_str11 = (char *)memkind_malloc(pmem_kind_unlimited, 31);
|
||||||
|
if (pmem_str11 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str11)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check real usable size for this allocation, its 32 again */
|
||||||
|
if (memkind_malloc_usable_size(pmem_kind_unlimited, pmem_str11) != 32) {
|
||||||
|
perror("memkind_default_malloc_usable_size()");
|
||||||
|
fprintf(stderr, "Wrong usable size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 33 bytes allocation */
|
||||||
|
pmem_str12 = (char *)memkind_malloc(pmem_kind_unlimited, 33);
|
||||||
|
if (pmem_str11 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str12)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check real usable size for this allocation, its 48 now */
|
||||||
|
if (memkind_malloc_usable_size(pmem_kind_unlimited, pmem_str12) != 48) {
|
||||||
|
perror("memkind_default_malloc_usable_size()");
|
||||||
|
fprintf(stderr, "Wrong usable size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str10);
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str11);
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str12);
|
||||||
|
|
||||||
|
/* 5MB allocation */
|
||||||
|
pmem_str10 = (char *)memkind_malloc(pmem_kind_unlimited, 5 * 1024 * 1024);
|
||||||
|
if (pmem_str10 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str10)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check real usable size for this allocation */
|
||||||
|
if (memkind_malloc_usable_size(pmem_kind_unlimited,
|
||||||
|
pmem_str10) != 5 * 1024 * 1024) {
|
||||||
|
perror("memkind_default_malloc_usable_size()");
|
||||||
|
fprintf(stderr, "Wrong usable size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 5MB + 1B allocation */
|
||||||
|
pmem_str11 = (char *)memkind_malloc(pmem_kind_unlimited, 5 * 1024 * 1024 + 1);
|
||||||
|
if (pmem_str11 == NULL) {
|
||||||
|
perror("memkind_malloc()");
|
||||||
|
fprintf(stderr, "Unable to allocate pmem string (pmem_str11)\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check real usable size for this allocation, its 6MB now */
|
||||||
|
if (memkind_malloc_usable_size(pmem_kind_unlimited,
|
||||||
|
pmem_str11) != 6 * 1024 * 1024) {
|
||||||
|
perror("memkind_default_malloc_usable_size()");
|
||||||
|
fprintf(stderr, "Wrong usable size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str10);
|
||||||
|
memkind_free(pmem_kind_unlimited, pmem_str11);
|
||||||
|
|
||||||
|
err = memkind_destroy_kind(pmem_kind_unlimited);
|
||||||
|
if (err) {
|
||||||
|
perror("memkind_destroy_kind()");
|
||||||
|
fprintf(stderr, "Unable to destroy pmem partition\n");
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout,
|
||||||
|
"The real size of the allocation has been successfully read.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
134
include/hbw_allocator.h
Normal file
134
include/hbw_allocator.h
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hbwmalloc.h>
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <new>
|
||||||
|
/*
|
||||||
|
* Header file for the C++ allocator compatible with the C++ standard library allocator concepts.
|
||||||
|
* More details in hbwallocator(3) man page.
|
||||||
|
* Note: memory heap management is based on hbwmalloc, refer to the hbwmalloc man page for more information.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
namespace hbw
|
||||||
|
{
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
class allocator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*
|
||||||
|
* Public member types required and defined by the standard library allocator concepts.
|
||||||
|
*/
|
||||||
|
typedef size_t size_type;
|
||||||
|
typedef ptrdiff_t difference_type;
|
||||||
|
typedef T *pointer;
|
||||||
|
typedef const T *const_pointer;
|
||||||
|
typedef T &reference;
|
||||||
|
typedef const T &const_reference;
|
||||||
|
typedef T value_type;
|
||||||
|
|
||||||
|
template <class U>
|
||||||
|
struct rebind {
|
||||||
|
typedef hbw::allocator<U> other;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Public member functions required and defined by the standard library allocator concepts.
|
||||||
|
*/
|
||||||
|
allocator() throw() { }
|
||||||
|
|
||||||
|
template <class U>
|
||||||
|
allocator(const allocator<U> &) throw() { }
|
||||||
|
|
||||||
|
~allocator() throw() { }
|
||||||
|
|
||||||
|
pointer address(reference x) const
|
||||||
|
{
|
||||||
|
return &x;
|
||||||
|
}
|
||||||
|
|
||||||
|
const_pointer address(const_reference x) const
|
||||||
|
{
|
||||||
|
return &x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocates n*sizeof(T) bytes of high bandwidth memory using hbw_malloc().
|
||||||
|
* Throws std::bad_alloc when cannot allocate memory.
|
||||||
|
*/
|
||||||
|
pointer allocate(size_type n, const void * = 0)
|
||||||
|
{
|
||||||
|
if (n > this->max_size()) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
pointer result = static_cast<pointer>(hbw_malloc(n * sizeof(T)));
|
||||||
|
if (!result) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deallocates memory associated with pointer returned by allocate() using hbw_free().
|
||||||
|
*/
|
||||||
|
void deallocate(pointer p, size_type n)
|
||||||
|
{
|
||||||
|
hbw_free(static_cast<void *>(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
size_type max_size() const throw()
|
||||||
|
{
|
||||||
|
return size_t(-1) / sizeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
void construct(pointer p, const_reference val)
|
||||||
|
{
|
||||||
|
::new(p) value_type(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy(pointer p)
|
||||||
|
{
|
||||||
|
p->~T();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T, class U>
|
||||||
|
bool operator==(const allocator<T> &, const allocator<U> &)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class U>
|
||||||
|
bool operator!=(const allocator<T> &, const allocator<U> &)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
238
include/hbwmalloc.h
Normal file
238
include/hbwmalloc.h
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
/*
|
||||||
|
* Header file for the high bandwidth memory interface.
|
||||||
|
*
|
||||||
|
* This file defines the external API's and enumerations for the
|
||||||
|
* hbwmalloc library. These interfaces define a heap manager that
|
||||||
|
* targets the high bandwidth memory numa nodes.
|
||||||
|
*
|
||||||
|
* hbwmalloc.h functionality is considered as stable API (STANDARD API).
|
||||||
|
*
|
||||||
|
* Please read hbwmalloc(3) man page for or more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fallback policy.
|
||||||
|
*
|
||||||
|
* Policy that determines behavior when there is not enough free high
|
||||||
|
* bandwidth memory to satisfy a user request. This enum is used with
|
||||||
|
* hbw_get_policy() and hbw_set_policy().
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/*
|
||||||
|
* If insufficient high bandwidth memory pages on nearest NUMA node are
|
||||||
|
* available then OOM killer will be triggered.
|
||||||
|
*/
|
||||||
|
HBW_POLICY_BIND = 1,
|
||||||
|
/*
|
||||||
|
* If insufficient high bandwidth memory pages are available fall
|
||||||
|
* back on standard memory pages.
|
||||||
|
*/
|
||||||
|
HBW_POLICY_PREFERRED = 2,
|
||||||
|
/*
|
||||||
|
* Interleave pages across high bandwidth nodes. If insufficient memory
|
||||||
|
* pages are available then OOM killer will be triggered.
|
||||||
|
*/
|
||||||
|
HBW_POLICY_INTERLEAVE = 3,
|
||||||
|
/*
|
||||||
|
* If insufficient high bandwidth memory pages are available then
|
||||||
|
* OOM killer will be triggered.
|
||||||
|
*/
|
||||||
|
HBW_POLICY_BIND_ALL = 4,
|
||||||
|
} hbw_policy_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Page size selection.
|
||||||
|
*
|
||||||
|
* The hbw_posix_memalign_psize() API gives the user the option to
|
||||||
|
* select the page size from this enumerated list.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The four kilobyte page size option. Note that with transparent huge
|
||||||
|
* pages enabled these allocations may be promoted by the operating system
|
||||||
|
* to two megabyte pages.
|
||||||
|
*/
|
||||||
|
HBW_PAGESIZE_4KB = 1,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The two megabyte page size option.
|
||||||
|
*/
|
||||||
|
HBW_PAGESIZE_2MB = 2,
|
||||||
|
/*
|
||||||
|
* This option is deprecated.
|
||||||
|
* Allocate high bandwidth memory using 1GB chunks backed by huge pages.
|
||||||
|
*/
|
||||||
|
HBW_PAGESIZE_1GB_STRICT = 3,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This option is deprecated.
|
||||||
|
* Allocate high bandwidth memory using 1GB chunks backed by huge pages.
|
||||||
|
*/
|
||||||
|
HBW_PAGESIZE_1GB = 4,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper representing value of the last enum element incremented by 1.
|
||||||
|
* Shall not be treated as a valid value for functions taking hbw_pagesize_t
|
||||||
|
* as parameter.
|
||||||
|
*/
|
||||||
|
HBW_PAGESIZE_MAX_VALUE
|
||||||
|
} hbw_pagesize_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags for hbw_verify_ptr function
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This option touches first byte of all pages in address range starting from "addr" to "addr" + "size"
|
||||||
|
* by read and write (so the content will be overwitten by the same data as it was read).
|
||||||
|
*/
|
||||||
|
HBW_TOUCH_PAGES = (1 << 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the current fallback policy when insufficient high bandwidth memory
|
||||||
|
* is available.
|
||||||
|
*/
|
||||||
|
hbw_policy_t hbw_get_policy(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sets the current fallback policy. The policy can be modified only once in
|
||||||
|
* the lifetime of an application and before calling hbw_*alloc() or
|
||||||
|
* hbw_posix_memalign*() function.
|
||||||
|
* Note: If the policy is not set, than HBW_POLICY_PREFERRED will be used by
|
||||||
|
* default.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* 0: on success
|
||||||
|
* EPERM: if hbw_set_policy () was called more than once
|
||||||
|
* EINVAL: if mode argument was neither HBW_POLICY_PREFERRED, HBW_POLICY_BIND, HBW_POLICY_BIND_ALL nor HBW_POLICY_INTERLEAVE
|
||||||
|
*/
|
||||||
|
int hbw_set_policy(hbw_policy_t mode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Verifies high bandwidth memory availability.
|
||||||
|
* Returns:
|
||||||
|
* 0: if high bandwidth memory is available
|
||||||
|
* ENODEV: if high-bandwidth memory is unavailable.
|
||||||
|
*/
|
||||||
|
int hbw_check_available(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Verifies if allocated memory fully fall into high bandwidth memory.
|
||||||
|
* Returns:
|
||||||
|
* 0: if memory in address range from "addr" to "addr" + "size" is allocated in high bandwidth memory
|
||||||
|
* -1: if any region of memory was not allocated in high bandwidth memory
|
||||||
|
* EINVAL: if addr is NULL, size equals 0 or flags contained unsupported bit set
|
||||||
|
* EFAULT: could not verify memory
|
||||||
|
*/
|
||||||
|
int hbw_verify_memory_region(void *addr, size_t size, int flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocates size bytes of uninitialized high bandwidth memory.
|
||||||
|
* The allocated space is suitably aligned (after possible pointer
|
||||||
|
* coercion) for storage of any type of object. If size is zero then
|
||||||
|
* hbw_malloc() returns NULL.
|
||||||
|
*/
|
||||||
|
void *hbw_malloc(size_t size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocates space for num objects in high bandwidth memory, each size bytes
|
||||||
|
* in length.
|
||||||
|
* The result is identical to calling hbw_malloc() with an argument of
|
||||||
|
* num*size, with the exception that the allocated memory is explicitly
|
||||||
|
* initialized to zero bytes.
|
||||||
|
* If num or size is 0, then hbw_calloc() returns NULL.
|
||||||
|
*/
|
||||||
|
void *hbw_calloc(size_t num, size_t size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocates size bytes of high bandwidth memory such that the allocation's
|
||||||
|
* base address is an even multiple of alignment, and returns the allocation
|
||||||
|
* in the value pointed to by memptr. The requested alignment must be a power
|
||||||
|
* of 2 at least as large as sizeof(void *).
|
||||||
|
* Returns:
|
||||||
|
* 0: on success
|
||||||
|
* ENOMEM: if there was insufficient memory to satisfy the request
|
||||||
|
* EINVAL: if the alignment parameter was not a power of two, or was less than sizeof(void *)
|
||||||
|
*/
|
||||||
|
int hbw_posix_memalign(void **memptr, size_t alignment, size_t size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocates size bytes of high bandwidth memory such that the allocation's
|
||||||
|
* base address is an even multiple of alignment, and returns the allocation
|
||||||
|
* in the value pointed to by memptr. The requested alignment must be a power
|
||||||
|
* of 2 at least as large as sizeof(void *). The memory will be allocated
|
||||||
|
* using pages determined by the pagesize variable.
|
||||||
|
* Returns:
|
||||||
|
* 0: on success
|
||||||
|
* ENOMEM: if there was insufficient memory to satisfy the request
|
||||||
|
* EINVAL: if the alignment parameter was not a power of two, or was less than sizeof(void *)
|
||||||
|
*/
|
||||||
|
int hbw_posix_memalign_psize(void **memptr, size_t alignment, size_t size,
|
||||||
|
hbw_pagesize_t pagesize);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Changes the size of the previously allocated memory referenced by ptr to
|
||||||
|
* size bytes of the specified kind. The contents of the memory are unchanged
|
||||||
|
* up to the lesser of the new and old size.
|
||||||
|
* If the new size is larger, the contents of the newly allocated portion
|
||||||
|
* of the memory are undefined.
|
||||||
|
* Upon success, the memory referenced by ptr is freed and a pointer to the
|
||||||
|
* newly allocated high bandwidth memory is returned.
|
||||||
|
* Note: memkind_realloc() may move the memory allocation, resulting in a
|
||||||
|
* different return value than ptr.
|
||||||
|
* If ptr is NULL, the hbw_realloc() function behaves identically to
|
||||||
|
* hbw_malloc() for the specified size. The address ptr, if not NULL,
|
||||||
|
* was returned by a previous call to hbw_malloc(), hbw_calloc(),
|
||||||
|
* hbw_realloc(), or hbw_posix_memalign(). Otherwise, or if hbw_free(ptr)
|
||||||
|
* was called before, undefined behavior occurs.
|
||||||
|
* Note: hbw_realloc() cannot be used with a pointer returned by
|
||||||
|
* hbw_posix_memalign_psize().
|
||||||
|
*/
|
||||||
|
void *hbw_realloc(void *ptr, size_t size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Causes the allocated memory referenced by ptr to be made
|
||||||
|
* available for future allocations. If ptr is NULL, no action occurs.
|
||||||
|
* The address ptr, if not NULL, must have been returned by a previous call
|
||||||
|
* to hbw_malloc(), hbw_calloc(), hbw_realloc(), hbw_posix_memalign(), or
|
||||||
|
* hbw_posix_memalign_psize(). Otherwise, if hbw_free(ptr) was called before,
|
||||||
|
* undefined behavior occurs.
|
||||||
|
*/
|
||||||
|
void hbw_free(void *ptr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
324
include/memkind.h
Normal file
324
include/memkind.h
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header file for the memkind heap manager.
|
||||||
|
* More details in memkind(3) man page.
|
||||||
|
*
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
#define _MEMKIND_BIT(N) (1ull << N)
|
||||||
|
|
||||||
|
/// \brief Memkind memory types
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
typedef enum memkind_memtype_t {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select standard memory, the same as process use.
|
||||||
|
*/
|
||||||
|
MEMKIND_MEMTYPE_DEFAULT = _MEMKIND_BIT(0),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select high bandwidth memory (HBM).
|
||||||
|
* There must be at least two memories with different bandwidth to
|
||||||
|
* determine the HBM.
|
||||||
|
*/
|
||||||
|
MEMKIND_MEMTYPE_HIGH_BANDWIDTH = _MEMKIND_BIT(1)
|
||||||
|
|
||||||
|
} memkind_memtype_t;
|
||||||
|
|
||||||
|
#undef _MEMKIND_BIT
|
||||||
|
|
||||||
|
/// \brief Memkind policy
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
typedef enum memkind_policy_t {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate local memory.
|
||||||
|
* If there is not enough memory to satisfy the request errno is set to
|
||||||
|
* ENOMEM and the allocated pointer is set to NULL.
|
||||||
|
*/
|
||||||
|
MEMKIND_POLICY_BIND_LOCAL = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Memory locality is ignored.
|
||||||
|
* If there is not enough memory to satisfy the request errno is set to
|
||||||
|
* ENOMEM and the allocated pointer is set to NULL.
|
||||||
|
*/
|
||||||
|
MEMKIND_POLICY_BIND_ALL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate preferred memory that is local.
|
||||||
|
* If there is not enough preferred memory to satisfy the request or
|
||||||
|
* preferred memory is not available, the allocation will fall back on any
|
||||||
|
* other memory.
|
||||||
|
*/
|
||||||
|
MEMKIND_POLICY_PREFERRED_LOCAL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interleave allocation across local memory.
|
||||||
|
* For n memory types the allocation will be interleaved across all of
|
||||||
|
* them.
|
||||||
|
*/
|
||||||
|
MEMKIND_POLICY_INTERLEAVE_LOCAL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interleave allocation. Locality is ignored.
|
||||||
|
* For n memory types the allocation will be interleaved across all of
|
||||||
|
* them.
|
||||||
|
*/
|
||||||
|
MEMKIND_POLICY_INTERLEAVE_ALL,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Max policy value.
|
||||||
|
*/
|
||||||
|
MEMKIND_POLICY_MAX_VALUE
|
||||||
|
|
||||||
|
} memkind_policy_t;
|
||||||
|
|
||||||
|
/// \brief Memkind bits definition
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
/// \note The bits specify flags and masks. Bits <0,1,2,...,7> are reserved for page size, where page sizes are encoded
|
||||||
|
/// by base-2 logarithm. If the page size bits are set to zero value, than default page size will be used.
|
||||||
|
typedef enum memkind_bits_t {
|
||||||
|
MEMKIND_MASK_PAGE_SIZE_2MB = 21ull, /**< Allocations backed by 2 MB page size (2^21 = 2MB) */
|
||||||
|
} memkind_bits_t;
|
||||||
|
|
||||||
|
/// \brief Memkind type definition
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
typedef struct memkind *memkind_t;
|
||||||
|
|
||||||
|
|
||||||
|
/// \brief Memkind constant values
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
enum memkind_const {
|
||||||
|
MEMKIND_MAX_KIND = 512, /**< Maximum number of kinds */
|
||||||
|
MEMKIND_ERROR_MESSAGE_SIZE = 128, /**< Error message size */
|
||||||
|
MEMKIND_PMEM_MIN_SIZE = (1024 * 1024 * 16) /**< The minimum size which allows to limit the file-backed memory partition */
|
||||||
|
};
|
||||||
|
|
||||||
|
/// \brief Memkind operation statuses
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
enum {
|
||||||
|
MEMKIND_SUCCESS = 0, /**< Operation success */
|
||||||
|
MEMKIND_ERROR_UNAVAILABLE = -1, /**< Error: Memory kind is not available */
|
||||||
|
MEMKIND_ERROR_MBIND = -2, /**< Error: Call to mbind() failed */
|
||||||
|
MEMKIND_ERROR_MMAP = -3, /**< Error: Call to mmap() failed */
|
||||||
|
MEMKIND_ERROR_MALLOC = -6, /**< Error: Call to malloc() failed */
|
||||||
|
MEMKIND_ERROR_ENVIRON = -12, /**< Error: Unable to parse environment variable */
|
||||||
|
MEMKIND_ERROR_INVALID = -13, /**< Error: Invalid argument */
|
||||||
|
MEMKIND_ERROR_TOOMANY = -15, /**< Error: Attempt to initialize more than MEMKIND_MAX_KIND number of kinds */
|
||||||
|
MEMKIND_ERROR_BADOPS = -17, /**< Error: Invalid memkind_ops structure */
|
||||||
|
MEMKIND_ERROR_HUGETLB = -18, /**< Error: Unable to allocate huge pages */
|
||||||
|
MEMKIND_ERROR_MEMTYPE_NOT_AVAILABLE = -20, /**< Error: Requested memory type is not available */
|
||||||
|
MEMKIND_ERROR_OPERATION_FAILED = -21, /**< Error: Operation failed */
|
||||||
|
MEMKIND_ERROR_ARENAS_CREATE = -22, /**< Error: Call to jemalloc's arenas.create failed */
|
||||||
|
MEMKIND_ERROR_RUNTIME = -255 /**< Error: Unspecified run-time error */
|
||||||
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Create kind that allocates memory with specific memory type, memory binding policy and flags.
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
/// \note Currently implemented memory type and policy configurations:
|
||||||
|
///. {MEMKIND_MEMTYPE_DEFAULT, MEMKIND_POLICY_PREFERRED_LOCAL},
|
||||||
|
///. {MEMKIND_MEMTYPE_HIGH_BANDWIDTH, MEMKIND_POLICY_BIND_LOCAL},
|
||||||
|
/// {MEMKIND_MEMTYPE_HIGH_BANDWIDTH, MEMKIND_POLICY_PREFERRED_LOCAL},
|
||||||
|
/// {MEMKIND_MEMTYPE_HIGH_BANDWIDTH, MEMKIND_POLICY_INTERLEAVE_ALL},
|
||||||
|
/// {MEMKIND_MEMTYPE_DEFAULT | MEMKIND_MEMTYPE_HIGH_BANDWIDTH, MEMKIND_POLICY_INTERLEAVE_ALL}.
|
||||||
|
/// \param memtype_flags determine the memory types to allocate from by combination of memkind_memtype_t values.
|
||||||
|
/// This field cannot have zero value.
|
||||||
|
/// \param policy specify policy for page binding to memory types selected by memtype_flags.
|
||||||
|
/// This field must be set to memkind_policy_t value. If policy is set to MEMKIND_POLICY_PREFERRED_LOCAL then only one memory
|
||||||
|
/// type must be selected. Note: the value cannot be set to MEMKIND_POLICY_MAX_VALUE.
|
||||||
|
/// \param flags the field must be set to a combination of memkind_bits_t values.
|
||||||
|
/// \param kind pointer to kind which will be created
|
||||||
|
/// \return Memkind operation status, MEMKIND_SUCCESS on success, MEMKIND_ERROR_MEMTYPE_NOT_AVAILABLE or MEMKIND_ERROR_INVALID on failure
|
||||||
|
///
|
||||||
|
int memkind_create_kind(memkind_memtype_t memtype_flags,
|
||||||
|
memkind_policy_t policy,
|
||||||
|
memkind_bits_t flags,
|
||||||
|
memkind_t *kind);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Destroy previously created kind object, which must have been returned
|
||||||
|
/// by a call to memkind_create_kind() or memkind_create_pmem().
|
||||||
|
/// The function has undefined behavior when the handle is invalid or
|
||||||
|
/// memkind_destroy_kind(kind) was already called before
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
/// \note if the kind was returned by memkind_create_kind() all allocated memory must be freed
|
||||||
|
/// before kind is destroyed, otherwise this will cause memory leak.
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \return Memkind operation status, MEMKIND_SUCCESS on success, MEMKIND_ERROR_OPERATION_FAILED on failure
|
||||||
|
///
|
||||||
|
int memkind_destroy_kind(memkind_t kind);
|
||||||
|
|
||||||
|
|
||||||
|
#include "memkind_deprecated.h"
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_REGULAR;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_DEFAULT;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HUGETLB;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW_ALL;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW_PREFERRED;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW_HUGETLB;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW_ALL_HUGETLB;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW_PREFERRED_HUGETLB;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_HBW_INTERLEAVE;
|
||||||
|
|
||||||
|
/// \warning EXPERIMENTAL API
|
||||||
|
extern memkind_t MEMKIND_INTERLEAVE;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Get Memkind API version
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \return Version number represented by a single integer number(major * 1000000 + minor * 1000 + patch)
|
||||||
|
///
|
||||||
|
int memkind_get_version();
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Convert error number into an error message
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param err error number
|
||||||
|
/// \param msg error message
|
||||||
|
/// \param size size of message
|
||||||
|
///
|
||||||
|
void memkind_error_message(int err, char *msg, size_t size);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Create a new PMEM (file-backed) kind of given size on top of a temporary file
|
||||||
|
/// in the given directory dir
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param dir path to specified directory to temporary file
|
||||||
|
/// \param max_size size limit for kind
|
||||||
|
/// \param kind pointer to kind which will be created
|
||||||
|
/// \return Memkind operation status, MEMKIND_SUCCESS on success, other values on failure
|
||||||
|
///
|
||||||
|
int memkind_create_pmem(const char *dir, size_t max_size, memkind_t *kind);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Check if kind is available
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \return Memkind operation status, MEMKIND_SUCCESS on success, other values on failure
|
||||||
|
///
|
||||||
|
int memkind_check_available(memkind_t kind);
|
||||||
|
|
||||||
|
/* HEAP MANAGEMENT INTERFACE */
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Allocates size bytes of uninitialized storage of the specified kind
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \param size number of bytes to allocate
|
||||||
|
/// \return Pointer to the allocated memory
|
||||||
|
///
|
||||||
|
void *memkind_malloc(memkind_t kind, size_t size);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Obtain size of block of memory allocated with the memkind API
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \param ptr pointer to the allocated memory
|
||||||
|
/// \return Number of usable bytes
|
||||||
|
///
|
||||||
|
size_t memkind_malloc_usable_size(memkind_t kind, void *ptr);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Allocates memory of the specified kind for an array of num elements
|
||||||
|
/// of size bytes each and initializes all bytes in the allocated storage to zero
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \param num number of objects
|
||||||
|
/// \param size specified size of each element
|
||||||
|
/// \return Pointer to the allocated memory
|
||||||
|
///
|
||||||
|
void *memkind_calloc(memkind_t kind, size_t num, size_t size);
|
||||||
|
|
||||||
|
/// \brief Allocates size bytes of the specified kind and places the address of the allocated memory
|
||||||
|
/// in *memptr. The address of the allocated memory will be a multiple of alignment,
|
||||||
|
/// which must be a power of two and a multiple of sizeof(void *)
|
||||||
|
/// \note EXPERIMENTAL API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \param memptr address of the allocated memory
|
||||||
|
/// \param alignment specified alignment of bytes
|
||||||
|
/// \param size specified size of bytes
|
||||||
|
/// \return Memkind operation status, MEMKIND_SUCCESS on success, EINVAL or ENOMEM on failure
|
||||||
|
///
|
||||||
|
int memkind_posix_memalign(memkind_t kind, void **memptr, size_t alignment,
|
||||||
|
size_t size);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Reallocates memory of the specified kind
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \param ptr pointer to the memory block to be reallocated
|
||||||
|
/// \param size new size for the memory block in bytes
|
||||||
|
/// \return Pointer to the allocated memory
|
||||||
|
///
|
||||||
|
void *memkind_realloc(memkind_t kind, void *ptr, size_t size);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// \brief Free the memory space of the specified kind pointed by ptr
|
||||||
|
/// \note STANDARD API
|
||||||
|
/// \param kind specified memory kind
|
||||||
|
/// \param ptr pointer to the allocated memory
|
||||||
|
///
|
||||||
|
void memkind_free(memkind_t kind, void *ptr);
|
||||||
|
|
||||||
|
int memkind_fd(struct memkind *kind);
|
||||||
|
void memkind_pmem_remapfd(struct memkind *kind, int fdNew);
|
||||||
|
int memkind_tmpfile(const char *dir, int *fd);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
30
include/memkind/internal/heap_manager.h
Normal file
30
include/memkind/internal/heap_manager.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
void heap_manager_init(struct memkind *kind);
|
||||||
|
void heap_manager_free(struct memkind *kind, void *ptr);
|
68
include/memkind/internal/memkind_arena.h
Normal file
68
include/memkind/internal/memkind_arena.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
#include <jemalloc/jemalloc.h>
|
||||||
|
#include <memkind/internal/memkind_private.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the jemalloc arena allocation memkind operations.
|
||||||
|
* More details in memkind_arena(3) man page.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct memkind *get_kind_by_arena(unsigned arena_ind);
|
||||||
|
|
||||||
|
int memkind_arena_create(struct memkind *kind, struct memkind_ops *ops,
|
||||||
|
const char *name);
|
||||||
|
int memkind_arena_create_map(struct memkind *kind, extent_hooks_t *hooks);
|
||||||
|
int memkind_arena_destroy(struct memkind *kind);
|
||||||
|
void *memkind_arena_malloc(struct memkind *kind, size_t size);
|
||||||
|
void *memkind_arena_calloc(struct memkind *kind, size_t num, size_t size);
|
||||||
|
void *memkind_arena_pmem_calloc(struct memkind *kind, size_t num, size_t size);
|
||||||
|
int memkind_arena_posix_memalign(struct memkind *kind, void **memptr,
|
||||||
|
size_t alignment, size_t size);
|
||||||
|
void *memkind_arena_realloc(struct memkind *kind, void *ptr, size_t size);
|
||||||
|
int memkind_bijective_get_arena(struct memkind *kind, unsigned int *arena,
|
||||||
|
size_t size);
|
||||||
|
int memkind_thread_get_arena(struct memkind *kind, unsigned int *arena,
|
||||||
|
size_t size);
|
||||||
|
int memkind_arena_finalize(struct memkind *kind);
|
||||||
|
void memkind_arena_init(struct memkind *kind);
|
||||||
|
void memkind_arena_free(struct memkind *kind, void *ptr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
76
include/memkind/internal/memkind_default.h
Normal file
76
include/memkind/internal/memkind_default.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
#include <memkind/internal/memkind_private.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the default implementations for memkind operations.
|
||||||
|
* More details in memkind_default(3) man page.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int memkind_default_create(struct memkind *kind, struct memkind_ops *ops,
|
||||||
|
const char *name);
|
||||||
|
int memkind_default_destroy(struct memkind *kind);
|
||||||
|
void *memkind_default_malloc(struct memkind *kind, size_t size);
|
||||||
|
void *memkind_default_calloc(struct memkind *kind, size_t num, size_t size);
|
||||||
|
int memkind_default_posix_memalign(struct memkind *kind, void **memptr,
|
||||||
|
size_t alignment, size_t size);
|
||||||
|
void *memkind_default_realloc(struct memkind *kind, void *ptr, size_t size);
|
||||||
|
void memkind_default_free(struct memkind *kind, void *ptr);
|
||||||
|
void *memkind_default_mmap(struct memkind *kind, void *addr, size_t size);
|
||||||
|
int memkind_default_mbind(struct memkind *kind, void *ptr, size_t size);
|
||||||
|
int memkind_default_get_mmap_flags(struct memkind *kind, int *flags);
|
||||||
|
int memkind_default_get_mbind_mode(struct memkind *kind, int *mode);
|
||||||
|
int memkind_default_get_mbind_nodemask(struct memkind *kind,
|
||||||
|
unsigned long *nodemask, unsigned long maxnode);
|
||||||
|
int memkind_preferred_get_mbind_mode(struct memkind *kind, int *mode);
|
||||||
|
int memkind_interleave_get_mbind_mode(struct memkind *kind, int *mode);
|
||||||
|
int memkind_nohugepage_madvise(struct memkind *kind, void *addr, size_t size);
|
||||||
|
int memkind_posix_check_alignment(struct memkind *kind, size_t alignment);
|
||||||
|
void memkind_default_init_once(void);
|
||||||
|
size_t memkind_default_malloc_usable_size(struct memkind *kind, void *ptr);
|
||||||
|
|
||||||
|
static inline bool size_out_of_bounds(size_t size)
|
||||||
|
{
|
||||||
|
return !size;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern struct memkind_ops MEMKIND_DEFAULT_OPS;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
47
include/memkind/internal/memkind_gbtlb.h
Executable file
47
include/memkind/internal/memkind_gbtlb.h
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2016 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the gigabyte TLB memkind operations.
|
||||||
|
*
|
||||||
|
* All function declarations has been moved to memkind_deprecated.h
|
||||||
|
* because of end of GBTLB support.
|
||||||
|
*
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
70
include/memkind/internal/memkind_hbw.h
Executable file
70
include/memkind/internal/memkind_hbw.h
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2017 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the high bandwidth memory memkind operations.
|
||||||
|
* More details in memkind_hbw(3) man page.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int memkind_hbw_check_available(struct memkind *kind);
|
||||||
|
int memkind_hbw_hugetlb_check_available(struct memkind *kind);
|
||||||
|
int memkind_hbw_get_mbind_nodemask(struct memkind *kind,
|
||||||
|
unsigned long *nodemask,
|
||||||
|
unsigned long maxnode);
|
||||||
|
int memkind_hbw_all_get_mbind_nodemask(struct memkind *kind,
|
||||||
|
unsigned long *nodemask,
|
||||||
|
unsigned long maxnode);
|
||||||
|
void memkind_hbw_init_once(void);
|
||||||
|
void memkind_hbw_all_init_once(void);
|
||||||
|
void memkind_hbw_hugetlb_init_once(void);
|
||||||
|
void memkind_hbw_all_hugetlb_init_once(void);
|
||||||
|
void memkind_hbw_preferred_init_once(void);
|
||||||
|
void memkind_hbw_preferred_hugetlb_init_once(void);
|
||||||
|
void memkind_hbw_interleave_init_once(void);
|
||||||
|
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_OPS;
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_ALL_OPS;
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_HUGETLB_OPS;
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_ALL_HUGETLB_OPS;
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_PREFERRED_OPS;
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_PREFERRED_HUGETLB_OPS;
|
||||||
|
extern struct memkind_ops MEMKIND_HBW_INTERLEAVE_OPS;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
52
include/memkind/internal/memkind_hugetlb.h
Executable file
52
include/memkind/internal/memkind_hugetlb.h
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2017 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the hugetlb memory memkind operations.
|
||||||
|
* More details in memkind_hugetlb(3) man page.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int memkind_hugetlb_get_mmap_flags(struct memkind *kind, int *flags);
|
||||||
|
void memkind_hugetlb_init_once(void);
|
||||||
|
int memkind_hugetlb_check_available_2mb(struct memkind *kind);
|
||||||
|
|
||||||
|
extern struct memkind_ops MEMKIND_HUGETLB_OPS;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
47
include/memkind/internal/memkind_interleave.h
Executable file
47
include/memkind/internal/memkind_interleave.h
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 - 2017 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the interleave memory memkind operations.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void memkind_interleave_init_once(void);
|
||||||
|
|
||||||
|
extern struct memkind_ops MEMKIND_INTERLEAVE_OPS;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
52
include/memkind/internal/memkind_log.h
Normal file
52
include/memkind/internal/memkind_log.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PRINTF_FORMAT __attribute__ ((format (printf, 1, 2)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For printing informational messages
|
||||||
|
* Requires environment variable MEMKIND_DEBUG to be set to appropriate value
|
||||||
|
*/
|
||||||
|
void log_info(const char *format, ...) PRINTF_FORMAT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For printing messages regarding errors and failures
|
||||||
|
* Requires environment variable MEMKIND_DEBUG to be set to appropriate value
|
||||||
|
*/
|
||||||
|
void log_err(const char *format, ...) PRINTF_FORMAT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For printing messages regarding fatal errors before calling abort()
|
||||||
|
* Works *no matter* of MEMKIND_DEBUG state
|
||||||
|
*/
|
||||||
|
void log_fatal(const char *format, ...)PRINTF_FORMAT;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
75
include/memkind/internal/memkind_pmem.h
Normal file
75
include/memkind/internal/memkind_pmem.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
#include "memkind_default.h"
|
||||||
|
#include "memkind_arena.h"
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the file-backed memory memkind operations.
|
||||||
|
* More details in memkind_pmem(3) man page.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MEMKIND_PMEM_CHUNK_SIZE (1ull << 21ull) // 2MB
|
||||||
|
|
||||||
|
int memkind_pmem_create(struct memkind *kind, struct memkind_ops *ops,
|
||||||
|
const char *name);
|
||||||
|
int memkind_pmem_destroy(struct memkind *kind);
|
||||||
|
void *memkind_pmem_mmap(struct memkind *kind, void *addr, size_t size);
|
||||||
|
int memkind_pmem_get_mmap_flags(struct memkind *kind, int *flags);
|
||||||
|
|
||||||
|
struct memkind_pmem_extent {
|
||||||
|
void *addrBase;
|
||||||
|
size_t cb;
|
||||||
|
off_t offset;
|
||||||
|
};
|
||||||
|
struct memkind_pmem {
|
||||||
|
int fd;
|
||||||
|
off_t offset;
|
||||||
|
size_t max_size;
|
||||||
|
pthread_mutex_t pmem_lock;
|
||||||
|
int cextents;
|
||||||
|
int cextentsAlloc;
|
||||||
|
struct memkind_pmem_extent *rgextents;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct memkind_ops MEMKIND_PMEM_OPS;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
127
include/memkind/internal/memkind_private.h
Normal file
127
include/memkind/internal/memkind_private.h
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "memkind.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define MEMKIND_LIKELY(x) __builtin_expect(!!(x), 1)
|
||||||
|
# define MEMKIND_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
||||||
|
#else
|
||||||
|
# define MEMKIND_LIKELY(x) (x)
|
||||||
|
# define MEMKIND_UNLIKELY(x) (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_EXPORT
|
||||||
|
# define MEMKIND_EXPORT __attribute__((visibility("default")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JE_PREFIX
|
||||||
|
#error "Can't find JE_PREFIX define. Define one or use build.sh script."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// This ladder call is required due to meanders of C's preprocessor logic.
|
||||||
|
// Without it, JE_PREFIX would be used directly (i.e. 'JE_PREFIX') and not
|
||||||
|
// substituted with defined value.
|
||||||
|
#define JE_SYMBOL2(a, b) a ## b
|
||||||
|
#define JE_SYMBOL1(a, b) JE_SYMBOL2(a, b)
|
||||||
|
#define JE_SYMBOL(b) JE_SYMBOL1(JE_PREFIX, b)
|
||||||
|
|
||||||
|
// Redefine symbols
|
||||||
|
#define jemk_malloc JE_SYMBOL(malloc)
|
||||||
|
#define jemk_mallocx JE_SYMBOL(mallocx)
|
||||||
|
#define jemk_calloc JE_SYMBOL(calloc)
|
||||||
|
#define jemk_rallocx JE_SYMBOL(rallocx)
|
||||||
|
#define jemk_realloc JE_SYMBOL(realloc)
|
||||||
|
#define jemk_mallctl JE_SYMBOL(mallctl)
|
||||||
|
#define jemk_memalign JE_SYMBOL(memalign)
|
||||||
|
#define jemk_posix_memalign JE_SYMBOL(posix_memalign)
|
||||||
|
#define jemk_free JE_SYMBOL(free)
|
||||||
|
#define jemk_dallocx JE_SYMBOL(dallocx)
|
||||||
|
#define jemk_malloc_usable_size JE_SYMBOL(malloc_usable_size)
|
||||||
|
|
||||||
|
/// \note EXPERIMENTAL API
|
||||||
|
int je_get_defrag_hint(void *ptr, int *bin_util, int *run_util);
|
||||||
|
|
||||||
|
enum memkind_const_private {
|
||||||
|
MEMKIND_NAME_LENGTH_PRIV = 64
|
||||||
|
};
|
||||||
|
|
||||||
|
struct memkind_ops {
|
||||||
|
int (* create)(struct memkind *kind, struct memkind_ops *ops, const char *name);
|
||||||
|
int (* destroy)(struct memkind *kind);
|
||||||
|
void *(* malloc)(struct memkind *kind, size_t size);
|
||||||
|
void *(* calloc)(struct memkind *kind, size_t num, size_t size);
|
||||||
|
int (* posix_memalign)(struct memkind *kind, void **memptr, size_t alignment,
|
||||||
|
size_t size);
|
||||||
|
void *(* realloc)(struct memkind *kind, void *ptr, size_t size);
|
||||||
|
void (* free)(struct memkind *kind, void *ptr);
|
||||||
|
void *(* mmap)(struct memkind *kind, void *addr, size_t size);
|
||||||
|
int (* mbind)(struct memkind *kind, void *ptr, size_t size);
|
||||||
|
int (* madvise)(struct memkind *kind, void *addr, size_t size);
|
||||||
|
int (* get_mmap_flags)(struct memkind *kind, int *flags);
|
||||||
|
int (* get_mbind_mode)(struct memkind *kind, int *mode);
|
||||||
|
int (* get_mbind_nodemask)(struct memkind *kind, unsigned long *nodemask,
|
||||||
|
unsigned long maxnode);
|
||||||
|
int (* get_arena)(struct memkind *kind, unsigned int *arena, size_t size);
|
||||||
|
int (* check_available)(struct memkind *kind);
|
||||||
|
int (* check_addr)(struct memkind *kind, void *addr);
|
||||||
|
void (* init_once)(void);
|
||||||
|
int (* finalize)(struct memkind *kind);
|
||||||
|
size_t (* malloc_usable_size)(struct memkind *kind, void *addr);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct memkind {
|
||||||
|
struct memkind_ops *ops;
|
||||||
|
unsigned int partition;
|
||||||
|
char name[MEMKIND_NAME_LENGTH_PRIV];
|
||||||
|
pthread_once_t init_once;
|
||||||
|
unsigned int arena_map_len; // is power of 2
|
||||||
|
unsigned int *arena_map; // To be deleted beyond 1.2.0+
|
||||||
|
pthread_key_t arena_key;
|
||||||
|
void *priv;
|
||||||
|
unsigned int
|
||||||
|
arena_map_mask; // arena_map_len - 1 to optimize modulo operation on arena_map_len
|
||||||
|
unsigned int arena_zero; // index first jemalloc arena of this kind
|
||||||
|
};
|
||||||
|
|
||||||
|
void memkind_init(memkind_t kind, bool check_numa);
|
||||||
|
|
||||||
|
void *kind_mmap(struct memkind *kind, void *addr, size_t size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
51
include/memkind/internal/memkind_regular.h
Executable file
51
include/memkind/internal/memkind_regular.h
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_INTERNAL_API
|
||||||
|
#warning "DO NOT INCLUDE THIS FILE! IT IS INTERNAL MEMKIND API AND SOON WILL BE REMOVED FROM BIN & DEVEL PACKAGES"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <memkind.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the regular memory memkind operations.
|
||||||
|
* More details in memkind_regular(3) man page.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern struct memkind_ops MEMKIND_REGULAR_OPS;
|
||||||
|
int memkind_regular_all_get_mbind_nodemask(struct memkind *kind,
|
||||||
|
unsigned long *nodemask,
|
||||||
|
unsigned long maxnode);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
34
include/memkind/internal/tbb_mem_pool_policy.h
Normal file
34
include/memkind/internal/tbb_mem_pool_policy.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2005-2018 Intel Corporation
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef void *(*rawAllocType)(intptr_t pool_id, size_t *bytes);
|
||||||
|
typedef int (*rawFreeType)(intptr_t pool_id, void *raw_ptr, size_t raw_bytes);
|
||||||
|
|
||||||
|
struct MemPoolPolicy {
|
||||||
|
rawAllocType pAlloc;
|
||||||
|
rawFreeType pFree;
|
||||||
|
size_t granularity;
|
||||||
|
int version;
|
||||||
|
unsigned fixedPool : 1,
|
||||||
|
keepAllMemory : 1,
|
||||||
|
reserved : 30;
|
||||||
|
};
|
41
include/memkind/internal/tbb_wrapper.h
Normal file
41
include/memkind/internal/tbb_wrapper.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <memkind.h>
|
||||||
|
#include <memkind_deprecated.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ops callbacks are replaced by TBB callbacks. */
|
||||||
|
void tbb_initialize(struct memkind *kind);
|
||||||
|
|
||||||
|
/* ptr pointer must come from the valid TBB pool allocation */
|
||||||
|
void tbb_pool_free(struct memkind *kind, void *ptr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
85
include/memkind_deprecated.h
Normal file
85
include/memkind_deprecated.h
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 - 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* !!!!!!!!!!!!!!!!!!!
|
||||||
|
* !!! WARNING !!!
|
||||||
|
* !!! PLEASE READ !!!
|
||||||
|
* !!!!!!!!!!!!!!!!!!!
|
||||||
|
*
|
||||||
|
* This header file contains all memkind deprecated symbols.
|
||||||
|
*
|
||||||
|
* Please avoid usage of this API in newly developed code, as
|
||||||
|
* eventually this code is subject for removal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MEMKIND_DEPRECATED
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define MEMKIND_DEPRECATED(func) func __attribute__ ((deprecated))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define MEMKIND_DEPRECATED(func) __declspec(deprecated) func
|
||||||
|
#else
|
||||||
|
#pragma message("WARNING: You need to implement MEMKIND_DEPRECATED for this compiler")
|
||||||
|
#define MEMKIND_DEPRECATED(func) func
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Symbols related to GBTLB that are no longer supported
|
||||||
|
*/
|
||||||
|
extern memkind_t MEMKIND_HBW_GBTLB;
|
||||||
|
extern memkind_t MEMKIND_HBW_PREFERRED_GBTLB;
|
||||||
|
extern memkind_t MEMKIND_GBTLB;
|
||||||
|
|
||||||
|
int MEMKIND_DEPRECATED(memkind_get_kind_by_partition(int partition,
|
||||||
|
memkind_t *kind));
|
||||||
|
|
||||||
|
enum memkind_base_partition {
|
||||||
|
MEMKIND_PARTITION_DEFAULT = 0,
|
||||||
|
MEMKIND_PARTITION_HBW = 1,
|
||||||
|
MEMKIND_PARTITION_HBW_HUGETLB = 2,
|
||||||
|
MEMKIND_PARTITION_HBW_PREFERRED = 3,
|
||||||
|
MEMKIND_PARTITION_HBW_PREFERRED_HUGETLB = 4,
|
||||||
|
MEMKIND_PARTITION_HUGETLB = 5,
|
||||||
|
MEMKIND_PARTITION_HBW_GBTLB = 6,
|
||||||
|
MEMKIND_PARTITION_HBW_PREFERRED_GBTLB = 7,
|
||||||
|
MEMKIND_PARTITION_GBTLB = 8,
|
||||||
|
MEMKIND_PARTITION_HBW_INTERLEAVE = 9,
|
||||||
|
MEMKIND_PARTITION_INTERLEAVE = 10,
|
||||||
|
MEMKIND_PARTITION_REGULAR = 11,
|
||||||
|
MEMKIND_PARTITION_HBW_ALL = 12,
|
||||||
|
MEMKIND_PARTITION_HBW_ALL_HUGETLB = 13,
|
||||||
|
MEMKIND_NUM_BASE_KIND
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
201
include/pmem_allocator.h
Normal file
201
include/pmem_allocator.h
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <exception>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <atomic>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
#include "memkind.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Header file for the C++ allocator compatible with the C++ standard library allocator concepts.
|
||||||
|
* More details in pmemallocator(3) man page.
|
||||||
|
* Note: memory heap management is based on memkind_malloc, refer to the memkind(3) man page for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* Functionality defined in this header is considered as EXPERIMENTAL API.
|
||||||
|
* API standards are described in memkind(3) man page.
|
||||||
|
*/
|
||||||
|
namespace pmem
|
||||||
|
{
|
||||||
|
namespace internal
|
||||||
|
{
|
||||||
|
class kind_wrapper_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
kind_wrapper_t(const char *dir, std::size_t max_size)
|
||||||
|
{
|
||||||
|
int err_c = memkind_create_pmem(dir, max_size, &kind);
|
||||||
|
if (err_c) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
std::string("An error occured while creating pmem kind; error code: ") +
|
||||||
|
std::to_string(err_c));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kind_wrapper_t(const kind_wrapper_t &) = delete;
|
||||||
|
void operator=(const kind_wrapper_t &) = delete;
|
||||||
|
|
||||||
|
~kind_wrapper_t()
|
||||||
|
{
|
||||||
|
memkind_destroy_kind(kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
memkind_t get() const
|
||||||
|
{
|
||||||
|
return kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
memkind_t kind;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class allocator
|
||||||
|
{
|
||||||
|
using kind_wrapper_t = internal::kind_wrapper_t;
|
||||||
|
std::shared_ptr<kind_wrapper_t> kind_wrapper_ptr;
|
||||||
|
public:
|
||||||
|
using value_type = T;
|
||||||
|
using pointer = value_type*;
|
||||||
|
using const_pointer = const value_type*;
|
||||||
|
using reference = value_type&;
|
||||||
|
using const_reference = const value_type&;
|
||||||
|
using size_type = size_t;
|
||||||
|
using difference_type = ptrdiff_t;
|
||||||
|
|
||||||
|
template<class U>
|
||||||
|
struct rebind {
|
||||||
|
using other = allocator<U>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
friend class allocator;
|
||||||
|
|
||||||
|
#ifndef _GLIBCXX_USE_CXX11_ABI
|
||||||
|
/* This is a workaround for compilers (e.g GCC 4.8) that uses C++11 standard,
|
||||||
|
* but use old - non C++11 ABI */
|
||||||
|
template<typename V = void>
|
||||||
|
explicit allocator()
|
||||||
|
{
|
||||||
|
static_assert(std::is_same<V, void>::value,
|
||||||
|
"pmem::allocator cannot be compiled without CXX11 ABI");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
explicit allocator(const char *dir, size_t max_size) :
|
||||||
|
kind_wrapper_ptr(std::make_shared<kind_wrapper_t>(dir, max_size))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit allocator(const std::string &dir, size_t max_size) :
|
||||||
|
allocator(dir.c_str(), max_size)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
allocator(const allocator &other) = default;
|
||||||
|
|
||||||
|
template <typename U>
|
||||||
|
allocator(const allocator<U> &other) noexcept : kind_wrapper_ptr(
|
||||||
|
other.kind_wrapper_ptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
allocator(allocator &&other) = default;
|
||||||
|
|
||||||
|
template <typename U>
|
||||||
|
allocator(allocator<U> &&other) noexcept :
|
||||||
|
kind_wrapper_ptr(std::move(other.kind_wrapper_ptr))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
allocator<T> &operator = (const allocator &other) = default;
|
||||||
|
|
||||||
|
template <typename U>
|
||||||
|
allocator<T> &operator = (const allocator<U> &other) noexcept
|
||||||
|
{
|
||||||
|
kind_wrapper_ptr = other.kind_wrapper_ptr;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
allocator<T> &operator = (allocator &&other) = default;
|
||||||
|
|
||||||
|
template <typename U>
|
||||||
|
allocator<T> &operator = (allocator<U> &&other) noexcept
|
||||||
|
{
|
||||||
|
kind_wrapper_ptr = std::move(other.kind_wrapper_ptr);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
pointer allocate(size_type n) const
|
||||||
|
{
|
||||||
|
pointer result = static_cast<pointer>(memkind_malloc(kind_wrapper_ptr->get(),
|
||||||
|
n*sizeof(T)));
|
||||||
|
if (!result) {
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deallocate(pointer p, size_type n) const
|
||||||
|
{
|
||||||
|
memkind_free(kind_wrapper_ptr->get(), static_cast<void *>(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class U, class... Args>
|
||||||
|
void construct(U *p, Args &&... args) const
|
||||||
|
{
|
||||||
|
::new((void *)p) U(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy(pointer p) const
|
||||||
|
{
|
||||||
|
p->~value_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename U, typename V>
|
||||||
|
friend bool operator ==(const allocator<U> &lhs, const allocator<V> &rhs);
|
||||||
|
|
||||||
|
template <typename U, typename V>
|
||||||
|
friend bool operator !=(const allocator<U> &lhs, const allocator<V> &rhs);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename U, typename V>
|
||||||
|
bool operator ==(const allocator<U> &lhs, const allocator<V> &rhs)
|
||||||
|
{
|
||||||
|
return lhs.kind_wrapper_ptr->get() == rhs.kind_wrapper_ptr->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename U, typename V>
|
||||||
|
bool operator !=(const allocator<U> &lhs, const allocator<V> &rhs)
|
||||||
|
{
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
}
|
31
install_astyle.sh
Executable file
31
install_astyle.sh
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018 Intel Corporation.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
# EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
curl -SL https://sourceforge.net/projects/astyle/files/astyle/astyle%203.1/astyle_3.1_linux.tar.gz -o /tmp/astyle.tar.gz
|
||||||
|
tar -xzvf /tmp/astyle.tar.gz -C /tmp/
|
||||||
|
echo "Install astyle"
|
||||||
|
cd /tmp/astyle/build/gcc
|
||||||
|
make
|
||||||
|
sudo make install
|
42
jemalloc/.appveyor.yml
Normal file
42
jemalloc/.appveyor.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
version: '{build}'
|
||||||
|
|
||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- MSYSTEM: MINGW64
|
||||||
|
CPU: x86_64
|
||||||
|
MSVC: amd64
|
||||||
|
- MSYSTEM: MINGW32
|
||||||
|
CPU: i686
|
||||||
|
MSVC: x86
|
||||||
|
- MSYSTEM: MINGW64
|
||||||
|
CPU: x86_64
|
||||||
|
- MSYSTEM: MINGW32
|
||||||
|
CPU: i686
|
||||||
|
- MSYSTEM: MINGW64
|
||||||
|
CPU: x86_64
|
||||||
|
MSVC: amd64
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
|
- MSYSTEM: MINGW32
|
||||||
|
CPU: i686
|
||||||
|
MSVC: x86
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
|
- MSYSTEM: MINGW64
|
||||||
|
CPU: x86_64
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
|
- MSYSTEM: MINGW32
|
||||||
|
CPU: i686
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
|
|
||||||
|
install:
|
||||||
|
- set PATH=c:\msys64\%MSYSTEM%\bin;c:\msys64\usr\bin;%PATH%
|
||||||
|
- if defined MSVC call "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %MSVC%
|
||||||
|
- if defined MSVC pacman --noconfirm -Rsc mingw-w64-%CPU%-gcc gcc
|
||||||
|
- pacman --noconfirm -Suy mingw-w64-%CPU%-make
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- bash -c "autoconf"
|
||||||
|
- bash -c "./configure $CONFIG_FLAGS"
|
||||||
|
- mingw32-make
|
||||||
|
- file lib/jemalloc.dll
|
||||||
|
- mingw32-make tests
|
||||||
|
- mingw32-make -k check
|
3
jemalloc/.autom4te.cfg
Normal file
3
jemalloc/.autom4te.cfg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
begin-language: "Autoconf-without-aclocal-m4"
|
||||||
|
args: --no-cache
|
||||||
|
end-language: "Autoconf-without-aclocal-m4"
|
1
jemalloc/.gitattributes
vendored
Normal file
1
jemalloc/.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
* text=auto eol=lf
|
91
jemalloc/.gitignore
vendored
Normal file
91
jemalloc/.gitignore
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/bin/jemalloc-config
|
||||||
|
/bin/jemalloc.sh
|
||||||
|
/bin/jeprof
|
||||||
|
|
||||||
|
/config.stamp
|
||||||
|
/config.log
|
||||||
|
/config.status
|
||||||
|
/configure
|
||||||
|
|
||||||
|
/doc/html.xsl
|
||||||
|
/doc/manpages.xsl
|
||||||
|
/doc/jemalloc.xml
|
||||||
|
/doc/jemalloc.html
|
||||||
|
/doc/jemalloc.3
|
||||||
|
|
||||||
|
/jemalloc.pc
|
||||||
|
|
||||||
|
/lib/
|
||||||
|
|
||||||
|
/Makefile
|
||||||
|
|
||||||
|
/include/jemalloc/internal/jemalloc_preamble.h
|
||||||
|
/include/jemalloc/internal/jemalloc_internal_defs.h
|
||||||
|
/include/jemalloc/internal/private_namespace.gen.h
|
||||||
|
/include/jemalloc/internal/private_namespace.h
|
||||||
|
/include/jemalloc/internal/private_namespace_jet.gen.h
|
||||||
|
/include/jemalloc/internal/private_namespace_jet.h
|
||||||
|
/include/jemalloc/internal/private_symbols.awk
|
||||||
|
/include/jemalloc/internal/private_symbols_jet.awk
|
||||||
|
/include/jemalloc/internal/public_namespace.h
|
||||||
|
/include/jemalloc/internal/public_symbols.txt
|
||||||
|
/include/jemalloc/internal/public_unnamespace.h
|
||||||
|
/include/jemalloc/internal/size_classes.h
|
||||||
|
/include/jemalloc/jemalloc.h
|
||||||
|
/include/jemalloc/jemalloc_defs.h
|
||||||
|
/include/jemalloc/jemalloc_macros.h
|
||||||
|
/include/jemalloc/jemalloc_mangle.h
|
||||||
|
/include/jemalloc/jemalloc_mangle_jet.h
|
||||||
|
/include/jemalloc/jemalloc_protos.h
|
||||||
|
/include/jemalloc/jemalloc_protos_jet.h
|
||||||
|
/include/jemalloc/jemalloc_rename.h
|
||||||
|
/include/jemalloc/jemalloc_typedefs.h
|
||||||
|
|
||||||
|
/src/*.[od]
|
||||||
|
/src/*.sym
|
||||||
|
|
||||||
|
/run_tests.out/
|
||||||
|
|
||||||
|
/test/test.sh
|
||||||
|
test/include/test/jemalloc_test.h
|
||||||
|
test/include/test/jemalloc_test_defs.h
|
||||||
|
|
||||||
|
/test/integration/[A-Za-z]*
|
||||||
|
!/test/integration/[A-Za-z]*.*
|
||||||
|
/test/integration/*.[od]
|
||||||
|
/test/integration/*.out
|
||||||
|
|
||||||
|
/test/integration/cpp/[A-Za-z]*
|
||||||
|
!/test/integration/cpp/[A-Za-z]*.*
|
||||||
|
/test/integration/cpp/*.[od]
|
||||||
|
/test/integration/cpp/*.out
|
||||||
|
|
||||||
|
/test/src/*.[od]
|
||||||
|
|
||||||
|
/test/stress/[A-Za-z]*
|
||||||
|
!/test/stress/[A-Za-z]*.*
|
||||||
|
/test/stress/*.[od]
|
||||||
|
/test/stress/*.out
|
||||||
|
|
||||||
|
/test/unit/[A-Za-z]*
|
||||||
|
!/test/unit/[A-Za-z]*.*
|
||||||
|
/test/unit/*.[od]
|
||||||
|
/test/unit/*.out
|
||||||
|
|
||||||
|
/VERSION
|
||||||
|
|
||||||
|
*.pdb
|
||||||
|
*.sdf
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.cachefile
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
*.tmp
|
||||||
|
/msvc/Win32/
|
||||||
|
/msvc/x64/
|
||||||
|
/msvc/projects/*/*/Debug*/
|
||||||
|
/msvc/projects/*/*/Release*/
|
||||||
|
/msvc/projects/*/*/Win32/
|
||||||
|
/msvc/projects/*/*/x64/
|
155
jemalloc/.travis.yml
Normal file
155
jemalloc/.travis.yml
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
language: generic
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--enable-debug" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--enable-prof" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --enable-prof" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false,dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false,percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false,background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=dss:primary,percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=dss:primary,background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=percpu_arena:percpu,background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- autoconf
|
||||||
|
- ./configure ${COMPILER_FLAGS:+ CC="$CC $COMPILER_FLAGS" CXX="$CXX $COMPILER_FLAGS" } $CONFIGURE_FLAGS
|
||||||
|
- make -j3
|
||||||
|
- make -j3 tests
|
||||||
|
|
||||||
|
script:
|
||||||
|
- make check
|
||||||
|
|
27
jemalloc/COPYING
Normal file
27
jemalloc/COPYING
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Unless otherwise specified, files in the jemalloc source distribution are
|
||||||
|
subject to the following license:
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
Copyright (C) 2002-2017 Jason Evans <jasone@canonware.com>.
|
||||||
|
All rights reserved.
|
||||||
|
Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved.
|
||||||
|
Copyright (C) 2009-2017 Facebook, Inc. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright notice(s),
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice(s),
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
--------------------------------------------------------------------------------
|
1230
jemalloc/ChangeLog
Normal file
1230
jemalloc/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
411
jemalloc/INSTALL.md
Normal file
411
jemalloc/INSTALL.md
Normal file
@ -0,0 +1,411 @@
|
|||||||
|
Building and installing a packaged release of jemalloc can be as simple as
|
||||||
|
typing the following while in the root directory of the source tree:
|
||||||
|
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
If building from unpackaged developer sources, the simplest command sequence
|
||||||
|
that might work is:
|
||||||
|
|
||||||
|
./autogen.sh
|
||||||
|
make dist
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
Note that documentation is not built by the default target because doing so
|
||||||
|
would create a dependency on xsltproc in packaged releases, hence the
|
||||||
|
requirement to either run 'make dist' or avoid installing docs via the various
|
||||||
|
install_* targets documented below.
|
||||||
|
|
||||||
|
|
||||||
|
## Advanced configuration
|
||||||
|
|
||||||
|
The 'configure' script supports numerous options that allow control of which
|
||||||
|
functionality is enabled, where jemalloc is installed, etc. Optionally, pass
|
||||||
|
any of the following arguments (not a definitive list) to 'configure':
|
||||||
|
|
||||||
|
* `--help`
|
||||||
|
|
||||||
|
Print a definitive list of options.
|
||||||
|
|
||||||
|
* `--prefix=<install-root-dir>`
|
||||||
|
|
||||||
|
Set the base directory in which to install. For example:
|
||||||
|
|
||||||
|
./configure --prefix=/usr/local
|
||||||
|
|
||||||
|
will cause files to be installed into /usr/local/include, /usr/local/lib,
|
||||||
|
and /usr/local/man.
|
||||||
|
|
||||||
|
* `--with-version=(<major>.<minor>.<bugfix>-<nrev>-g<gid>|VERSION)`
|
||||||
|
|
||||||
|
The VERSION file is mandatory for successful configuration, and the
|
||||||
|
following steps are taken to assure its presence:
|
||||||
|
1) If --with-version=<major>.<minor>.<bugfix>-<nrev>-g<gid> is specified,
|
||||||
|
generate VERSION using the specified value.
|
||||||
|
2) If --with-version is not specified in either form and the source
|
||||||
|
directory is inside a git repository, try to generate VERSION via 'git
|
||||||
|
describe' invocations that pattern-match release tags.
|
||||||
|
3) If VERSION is missing, generate it with a bogus version:
|
||||||
|
0.0.0-0-g0000000000000000000000000000000000000000
|
||||||
|
|
||||||
|
Note that --with-version=VERSION bypasses (1) and (2), which simplifies
|
||||||
|
VERSION configuration when embedding a jemalloc release into another
|
||||||
|
project's git repository.
|
||||||
|
|
||||||
|
* `--with-rpath=<colon-separated-rpath>`
|
||||||
|
|
||||||
|
Embed one or more library paths, so that libjemalloc can find the libraries
|
||||||
|
it is linked to. This works only on ELF-based systems.
|
||||||
|
|
||||||
|
* `--with-mangling=<map>`
|
||||||
|
|
||||||
|
Mangle public symbols specified in <map> which is a comma-separated list of
|
||||||
|
name:mangled pairs.
|
||||||
|
|
||||||
|
For example, to use ld's --wrap option as an alternative method for
|
||||||
|
overriding libc's malloc implementation, specify something like:
|
||||||
|
|
||||||
|
--with-mangling=malloc:__wrap_malloc,free:__wrap_free[...]
|
||||||
|
|
||||||
|
Note that mangling happens prior to application of the prefix specified by
|
||||||
|
--with-jemalloc-prefix, and mangled symbols are then ignored when applying
|
||||||
|
the prefix.
|
||||||
|
|
||||||
|
* `--with-jemalloc-prefix=<prefix>`
|
||||||
|
|
||||||
|
Prefix all public APIs with <prefix>. For example, if <prefix> is
|
||||||
|
"prefix_", API changes like the following occur:
|
||||||
|
|
||||||
|
malloc() --> prefix_malloc()
|
||||||
|
malloc_conf --> prefix_malloc_conf
|
||||||
|
/etc/malloc.conf --> /etc/prefix_malloc.conf
|
||||||
|
MALLOC_CONF --> PREFIX_MALLOC_CONF
|
||||||
|
|
||||||
|
This makes it possible to use jemalloc at the same time as the system
|
||||||
|
allocator, or even to use multiple copies of jemalloc simultaneously.
|
||||||
|
|
||||||
|
By default, the prefix is "", except on OS X, where it is "je_". On OS X,
|
||||||
|
jemalloc overlays the default malloc zone, but makes no attempt to actually
|
||||||
|
replace the "malloc", "calloc", etc. symbols.
|
||||||
|
|
||||||
|
* `--without-export`
|
||||||
|
|
||||||
|
Don't export public APIs. This can be useful when building jemalloc as a
|
||||||
|
static library, or to avoid exporting public APIs when using the zone
|
||||||
|
allocator on OSX.
|
||||||
|
|
||||||
|
* `--with-private-namespace=<prefix>`
|
||||||
|
|
||||||
|
Prefix all library-private APIs with <prefix>je_. For shared libraries,
|
||||||
|
symbol visibility mechanisms prevent these symbols from being exported, but
|
||||||
|
for static libraries, naming collisions are a real possibility. By
|
||||||
|
default, <prefix> is empty, which results in a symbol prefix of je_ .
|
||||||
|
|
||||||
|
* `--with-install-suffix=<suffix>`
|
||||||
|
|
||||||
|
Append <suffix> to the base name of all installed files, such that multiple
|
||||||
|
versions of jemalloc can coexist in the same installation directory. For
|
||||||
|
example, libjemalloc.so.0 becomes libjemalloc<suffix>.so.0.
|
||||||
|
|
||||||
|
* `--with-malloc-conf=<malloc_conf>`
|
||||||
|
|
||||||
|
Embed `<malloc_conf>` as a run-time options string that is processed prior to
|
||||||
|
the malloc_conf global variable, the /etc/malloc.conf symlink, and the
|
||||||
|
MALLOC_CONF environment variable. For example, to change the default decay
|
||||||
|
time to 30 seconds:
|
||||||
|
|
||||||
|
--with-malloc-conf=decay_ms:30000
|
||||||
|
|
||||||
|
* `--enable-debug`
|
||||||
|
|
||||||
|
Enable assertions and validation code. This incurs a substantial
|
||||||
|
performance hit, but is very useful during application development.
|
||||||
|
|
||||||
|
* `--disable-stats`
|
||||||
|
|
||||||
|
Disable statistics gathering functionality. See the "opt.stats_print"
|
||||||
|
option documentation for usage details.
|
||||||
|
|
||||||
|
* `--enable-prof`
|
||||||
|
|
||||||
|
Enable heap profiling and leak detection functionality. See the "opt.prof"
|
||||||
|
option documentation for usage details. When enabled, there are several
|
||||||
|
approaches to backtracing, and the configure script chooses the first one
|
||||||
|
in the following list that appears to function correctly:
|
||||||
|
|
||||||
|
+ libunwind (requires --enable-prof-libunwind)
|
||||||
|
+ libgcc (unless --disable-prof-libgcc)
|
||||||
|
+ gcc intrinsics (unless --disable-prof-gcc)
|
||||||
|
|
||||||
|
* `--enable-prof-libunwind`
|
||||||
|
|
||||||
|
Use the libunwind library (http://www.nongnu.org/libunwind/) for stack
|
||||||
|
backtracing.
|
||||||
|
|
||||||
|
* `--disable-prof-libgcc`
|
||||||
|
|
||||||
|
Disable the use of libgcc's backtracing functionality.
|
||||||
|
|
||||||
|
* `--disable-prof-gcc`
|
||||||
|
|
||||||
|
Disable the use of gcc intrinsics for backtracing.
|
||||||
|
|
||||||
|
* `--with-static-libunwind=<libunwind.a>`
|
||||||
|
|
||||||
|
Statically link against the specified libunwind.a rather than dynamically
|
||||||
|
linking with -lunwind.
|
||||||
|
|
||||||
|
* `--disable-thp`
|
||||||
|
|
||||||
|
Disable transparent huge page (THP) integration. This option can be useful
|
||||||
|
when cross compiling.
|
||||||
|
|
||||||
|
* `--disable-fill`
|
||||||
|
|
||||||
|
Disable support for junk/zero filling of memory. See the "opt.junk" and
|
||||||
|
"opt.zero" option documentation for usage details.
|
||||||
|
|
||||||
|
* `--disable-zone-allocator`
|
||||||
|
|
||||||
|
Disable zone allocator for Darwin. This means jemalloc won't be hooked as
|
||||||
|
the default allocator on OSX/iOS.
|
||||||
|
|
||||||
|
* `--enable-utrace`
|
||||||
|
|
||||||
|
Enable utrace(2)-based allocation tracing. This feature is not broadly
|
||||||
|
portable (FreeBSD has it, but Linux and OS X do not).
|
||||||
|
|
||||||
|
* `--enable-xmalloc`
|
||||||
|
|
||||||
|
Enable support for optional immediate termination due to out-of-memory
|
||||||
|
errors, as is commonly implemented by "xmalloc" wrapper function for malloc.
|
||||||
|
See the "opt.xmalloc" option documentation for usage details.
|
||||||
|
|
||||||
|
* `--enable-lazy-lock`
|
||||||
|
|
||||||
|
Enable code that wraps pthread_create() to detect when an application
|
||||||
|
switches from single-threaded to multi-threaded mode, so that it can avoid
|
||||||
|
mutex locking/unlocking operations while in single-threaded mode. In
|
||||||
|
practice, this feature usually has little impact on performance unless
|
||||||
|
thread-specific caching is disabled.
|
||||||
|
|
||||||
|
* `--disable-cache-oblivious`
|
||||||
|
|
||||||
|
Disable cache-oblivious large allocation alignment for large allocation
|
||||||
|
requests with no alignment constraints. If this feature is disabled, all
|
||||||
|
large allocations are page-aligned as an implementation artifact, which can
|
||||||
|
severely harm CPU cache utilization. However, the cache-oblivious layout
|
||||||
|
comes at the cost of one extra page per large allocation, which in the
|
||||||
|
most extreme case increases physical memory usage for the 16 KiB size class
|
||||||
|
to 20 KiB.
|
||||||
|
|
||||||
|
* `--disable-syscall`
|
||||||
|
|
||||||
|
Disable use of syscall(2) rather than {open,read,write,close}(2). This is
|
||||||
|
intended as a workaround for systems that place security limitations on
|
||||||
|
syscall(2).
|
||||||
|
|
||||||
|
* `--disable-cxx`
|
||||||
|
|
||||||
|
Disable C++ integration. This will cause new and delete operator
|
||||||
|
implementations to be omitted.
|
||||||
|
|
||||||
|
* `--with-xslroot=<path>`
|
||||||
|
|
||||||
|
Specify where to find DocBook XSL stylesheets when building the
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
* `--with-lg-page=<lg-page>`
|
||||||
|
|
||||||
|
Specify the base 2 log of the allocator page size, which must in turn be at
|
||||||
|
least as large as the system page size. By default the configure script
|
||||||
|
determines the host's page size and sets the allocator page size equal to
|
||||||
|
the system page size, so this option need not be specified unless the
|
||||||
|
system page size may change between configuration and execution, e.g. when
|
||||||
|
cross compiling.
|
||||||
|
|
||||||
|
* `--with-lg-page-sizes=<lg-page-sizes>`
|
||||||
|
|
||||||
|
Specify the comma-separated base 2 logs of the page sizes to support. This
|
||||||
|
option may be useful when cross compiling in combination with
|
||||||
|
`--with-lg-page`, but its primary use case is for integration with FreeBSD's
|
||||||
|
libc, wherein jemalloc is embedded.
|
||||||
|
|
||||||
|
* `--with-lg-hugepage=<lg-hugepage>`
|
||||||
|
|
||||||
|
Specify the base 2 log of the system huge page size. This option is useful
|
||||||
|
when cross compiling, or when overriding the default for systems that do
|
||||||
|
not explicitly support huge pages.
|
||||||
|
|
||||||
|
* `--with-lg-quantum=<lg-quantum>`
|
||||||
|
|
||||||
|
Specify the base 2 log of the minimum allocation alignment. jemalloc needs
|
||||||
|
to know the minimum alignment that meets the following C standard
|
||||||
|
requirement (quoted from the April 12, 2011 draft of the C11 standard):
|
||||||
|
|
||||||
|
> The pointer returned if the allocation succeeds is suitably aligned so
|
||||||
|
that it may be assigned to a pointer to any type of object with a
|
||||||
|
fundamental alignment requirement and then used to access such an object
|
||||||
|
or an array of such objects in the space allocated [...]
|
||||||
|
|
||||||
|
This setting is architecture-specific, and although jemalloc includes known
|
||||||
|
safe values for the most commonly used modern architectures, there is a
|
||||||
|
wrinkle related to GNU libc (glibc) that may impact your choice of
|
||||||
|
<lg-quantum>. On most modern architectures, this mandates 16-byte
|
||||||
|
alignment (<lg-quantum>=4), but the glibc developers chose not to meet this
|
||||||
|
requirement for performance reasons. An old discussion can be found at
|
||||||
|
<https://sourceware.org/bugzilla/show_bug.cgi?id=206> . Unlike glibc,
|
||||||
|
jemalloc does follow the C standard by default (caveat: jemalloc
|
||||||
|
technically cheats for size classes smaller than the quantum), but the fact
|
||||||
|
that Linux systems already work around this allocator noncompliance means
|
||||||
|
that it is generally safe in practice to let jemalloc's minimum alignment
|
||||||
|
follow glibc's lead. If you specify `--with-lg-quantum=3` during
|
||||||
|
configuration, jemalloc will provide additional size classes that are not
|
||||||
|
16-byte-aligned (24, 40, and 56).
|
||||||
|
|
||||||
|
The following environment variables (not a definitive list) impact configure's
|
||||||
|
behavior:
|
||||||
|
|
||||||
|
* `CFLAGS="?"`
|
||||||
|
* `CXXFLAGS="?"`
|
||||||
|
|
||||||
|
Pass these flags to the C/C++ compiler. Any flags set by the configure
|
||||||
|
script are prepended, which means explicitly set flags generally take
|
||||||
|
precedence. Take care when specifying flags such as -Werror, because
|
||||||
|
configure tests may be affected in undesirable ways.
|
||||||
|
|
||||||
|
* `EXTRA_CFLAGS="?"`
|
||||||
|
* `EXTRA_CXXFLAGS="?"`
|
||||||
|
|
||||||
|
Append these flags to CFLAGS/CXXFLAGS, without passing them to the
|
||||||
|
compiler(s) during configuration. This makes it possible to add flags such
|
||||||
|
as -Werror, while allowing the configure script to determine what other
|
||||||
|
flags are appropriate for the specified configuration.
|
||||||
|
|
||||||
|
* `CPPFLAGS="?"`
|
||||||
|
|
||||||
|
Pass these flags to the C preprocessor. Note that CFLAGS is not passed to
|
||||||
|
'cpp' when 'configure' is looking for include files, so you must use
|
||||||
|
CPPFLAGS instead if you need to help 'configure' find header files.
|
||||||
|
|
||||||
|
* `LD_LIBRARY_PATH="?"`
|
||||||
|
|
||||||
|
'ld' uses this colon-separated list to find libraries.
|
||||||
|
|
||||||
|
* `LDFLAGS="?"`
|
||||||
|
|
||||||
|
Pass these flags when linking.
|
||||||
|
|
||||||
|
* `PATH="?"`
|
||||||
|
|
||||||
|
'configure' uses this to find programs.
|
||||||
|
|
||||||
|
In some cases it may be necessary to work around configuration results that do
|
||||||
|
not match reality. For example, Linux 4.5 added support for the MADV_FREE flag
|
||||||
|
to madvise(2), which can cause problems if building on a host with MADV_FREE
|
||||||
|
support and deploying to a target without. To work around this, use a cache
|
||||||
|
file to override the relevant configuration variable defined in configure.ac,
|
||||||
|
e.g.:
|
||||||
|
|
||||||
|
echo "je_cv_madv_free=no" > config.cache && ./configure -C
|
||||||
|
|
||||||
|
|
||||||
|
## Advanced compilation
|
||||||
|
|
||||||
|
To build only parts of jemalloc, use the following targets:
|
||||||
|
|
||||||
|
build_lib_shared
|
||||||
|
build_lib_static
|
||||||
|
build_lib
|
||||||
|
build_doc_html
|
||||||
|
build_doc_man
|
||||||
|
build_doc
|
||||||
|
|
||||||
|
To install only parts of jemalloc, use the following targets:
|
||||||
|
|
||||||
|
install_bin
|
||||||
|
install_include
|
||||||
|
install_lib_shared
|
||||||
|
install_lib_static
|
||||||
|
install_lib
|
||||||
|
install_doc_html
|
||||||
|
install_doc_man
|
||||||
|
install_doc
|
||||||
|
|
||||||
|
To clean up build results to varying degrees, use the following make targets:
|
||||||
|
|
||||||
|
clean
|
||||||
|
distclean
|
||||||
|
relclean
|
||||||
|
|
||||||
|
|
||||||
|
## Advanced installation
|
||||||
|
|
||||||
|
Optionally, define make variables when invoking make, including (not
|
||||||
|
exclusively):
|
||||||
|
|
||||||
|
* `INCLUDEDIR="?"`
|
||||||
|
|
||||||
|
Use this as the installation prefix for header files.
|
||||||
|
|
||||||
|
* `LIBDIR="?"`
|
||||||
|
|
||||||
|
Use this as the installation prefix for libraries.
|
||||||
|
|
||||||
|
* `MANDIR="?"`
|
||||||
|
|
||||||
|
Use this as the installation prefix for man pages.
|
||||||
|
|
||||||
|
* `DESTDIR="?"`
|
||||||
|
|
||||||
|
Prepend DESTDIR to INCLUDEDIR, LIBDIR, DATADIR, and MANDIR. This is useful
|
||||||
|
when installing to a different path than was specified via --prefix.
|
||||||
|
|
||||||
|
* `CC="?"`
|
||||||
|
|
||||||
|
Use this to invoke the C compiler.
|
||||||
|
|
||||||
|
* `CFLAGS="?"`
|
||||||
|
|
||||||
|
Pass these flags to the compiler.
|
||||||
|
|
||||||
|
* `CPPFLAGS="?"`
|
||||||
|
|
||||||
|
Pass these flags to the C preprocessor.
|
||||||
|
|
||||||
|
* `LDFLAGS="?"`
|
||||||
|
|
||||||
|
Pass these flags when linking.
|
||||||
|
|
||||||
|
* `PATH="?"`
|
||||||
|
|
||||||
|
Use this to search for programs used during configuration and building.
|
||||||
|
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
If you intend to make non-trivial changes to jemalloc, use the 'autogen.sh'
|
||||||
|
script rather than 'configure'. This re-generates 'configure', enables
|
||||||
|
configuration dependency rules, and enables re-generation of automatically
|
||||||
|
generated source files.
|
||||||
|
|
||||||
|
The build system supports using an object directory separate from the source
|
||||||
|
tree. For example, you can create an 'obj' directory, and from within that
|
||||||
|
directory, issue configuration and build commands:
|
||||||
|
|
||||||
|
autoconf
|
||||||
|
mkdir obj
|
||||||
|
cd obj
|
||||||
|
../configure --enable-autogen
|
||||||
|
make
|
||||||
|
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
The manual page is generated in both html and roff formats. Any web browser
|
||||||
|
can be used to view the html manual. The roff manual page can be formatted
|
||||||
|
prior to installation via the following command:
|
||||||
|
|
||||||
|
nroff -man -t doc/jemalloc.3
|
563
jemalloc/Makefile.in
Normal file
563
jemalloc/Makefile.in
Normal file
@ -0,0 +1,563 @@
|
|||||||
|
# Clear out all vpaths, then set just one (default vpath) for the main build
|
||||||
|
# directory.
|
||||||
|
vpath
|
||||||
|
vpath % .
|
||||||
|
|
||||||
|
# Clear the default suffixes, so that built-in rules are not used.
|
||||||
|
.SUFFIXES :
|
||||||
|
|
||||||
|
SHELL := /bin/sh
|
||||||
|
|
||||||
|
CC := @CC@
|
||||||
|
CXX := @CXX@
|
||||||
|
|
||||||
|
# Configuration parameters.
|
||||||
|
DESTDIR =
|
||||||
|
BINDIR := $(DESTDIR)@BINDIR@
|
||||||
|
INCLUDEDIR := $(DESTDIR)@INCLUDEDIR@
|
||||||
|
LIBDIR := $(DESTDIR)@LIBDIR@
|
||||||
|
DATADIR := $(DESTDIR)@DATADIR@
|
||||||
|
MANDIR := $(DESTDIR)@MANDIR@
|
||||||
|
srcroot := @srcroot@
|
||||||
|
objroot := @objroot@
|
||||||
|
abs_srcroot := @abs_srcroot@
|
||||||
|
abs_objroot := @abs_objroot@
|
||||||
|
|
||||||
|
# Build parameters.
|
||||||
|
CPPFLAGS := @CPPFLAGS@ -I$(srcroot)include -I$(objroot)include
|
||||||
|
CONFIGURE_CFLAGS := @CONFIGURE_CFLAGS@
|
||||||
|
SPECIFIED_CFLAGS := @SPECIFIED_CFLAGS@
|
||||||
|
EXTRA_CFLAGS := @EXTRA_CFLAGS@
|
||||||
|
CFLAGS := $(strip $(CONFIGURE_CFLAGS) $(SPECIFIED_CFLAGS) $(EXTRA_CFLAGS))
|
||||||
|
CONFIGURE_CXXFLAGS := @CONFIGURE_CXXFLAGS@
|
||||||
|
SPECIFIED_CXXFLAGS := @SPECIFIED_CXXFLAGS@
|
||||||
|
EXTRA_CXXFLAGS := @EXTRA_CXXFLAGS@
|
||||||
|
CXXFLAGS := $(strip $(CONFIGURE_CXXFLAGS) $(SPECIFIED_CXXFLAGS) $(EXTRA_CXXFLAGS))
|
||||||
|
LDFLAGS := @LDFLAGS@
|
||||||
|
EXTRA_LDFLAGS := @EXTRA_LDFLAGS@
|
||||||
|
LIBS := @LIBS@
|
||||||
|
RPATH_EXTRA := @RPATH_EXTRA@
|
||||||
|
SO := @so@
|
||||||
|
IMPORTLIB := @importlib@
|
||||||
|
O := @o@
|
||||||
|
A := @a@
|
||||||
|
EXE := @exe@
|
||||||
|
LIBPREFIX := @libprefix@
|
||||||
|
REV := @rev@
|
||||||
|
install_suffix := @install_suffix@
|
||||||
|
ABI := @abi@
|
||||||
|
XSLTPROC := @XSLTPROC@
|
||||||
|
AUTOCONF := @AUTOCONF@
|
||||||
|
_RPATH = @RPATH@
|
||||||
|
RPATH = $(if $(1),$(call _RPATH,$(1)))
|
||||||
|
cfghdrs_in := $(addprefix $(srcroot),@cfghdrs_in@)
|
||||||
|
cfghdrs_out := @cfghdrs_out@
|
||||||
|
cfgoutputs_in := $(addprefix $(srcroot),@cfgoutputs_in@)
|
||||||
|
cfgoutputs_out := @cfgoutputs_out@
|
||||||
|
enable_autogen := @enable_autogen@
|
||||||
|
enable_prof := @enable_prof@
|
||||||
|
enable_zone_allocator := @enable_zone_allocator@
|
||||||
|
MALLOC_CONF := @JEMALLOC_CPREFIX@MALLOC_CONF
|
||||||
|
link_whole_archive := @link_whole_archive@
|
||||||
|
DSO_LDFLAGS = @DSO_LDFLAGS@
|
||||||
|
SOREV = @SOREV@
|
||||||
|
PIC_CFLAGS = @PIC_CFLAGS@
|
||||||
|
CTARGET = @CTARGET@
|
||||||
|
LDTARGET = @LDTARGET@
|
||||||
|
TEST_LD_MODE = @TEST_LD_MODE@
|
||||||
|
MKLIB = @MKLIB@
|
||||||
|
AR = @AR@
|
||||||
|
ARFLAGS = @ARFLAGS@
|
||||||
|
DUMP_SYMS = @DUMP_SYMS@
|
||||||
|
AWK := @AWK@
|
||||||
|
CC_MM = @CC_MM@
|
||||||
|
LM := @LM@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
|
||||||
|
ifeq (macho, $(ABI))
|
||||||
|
TEST_LIBRARY_PATH := DYLD_FALLBACK_LIBRARY_PATH="$(objroot)lib"
|
||||||
|
else
|
||||||
|
ifeq (pecoff, $(ABI))
|
||||||
|
TEST_LIBRARY_PATH := PATH="$(PATH):$(objroot)lib"
|
||||||
|
else
|
||||||
|
TEST_LIBRARY_PATH :=
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
LIBJEMALLOC := $(LIBPREFIX)jemalloc$(install_suffix)
|
||||||
|
|
||||||
|
# Lists of files.
|
||||||
|
BINS := $(objroot)bin/jemalloc-config $(objroot)bin/jemalloc.sh $(objroot)bin/jeprof
|
||||||
|
C_HDRS := $(objroot)include/jemalloc/jemalloc$(install_suffix).h
|
||||||
|
C_SRCS := $(srcroot)src/jemalloc.c \
|
||||||
|
$(srcroot)src/arena.c \
|
||||||
|
$(srcroot)src/background_thread.c \
|
||||||
|
$(srcroot)src/base.c \
|
||||||
|
$(srcroot)src/bitmap.c \
|
||||||
|
$(srcroot)src/ckh.c \
|
||||||
|
$(srcroot)src/ctl.c \
|
||||||
|
$(srcroot)src/extent.c \
|
||||||
|
$(srcroot)src/extent_dss.c \
|
||||||
|
$(srcroot)src/extent_mmap.c \
|
||||||
|
$(srcroot)src/hash.c \
|
||||||
|
$(srcroot)src/hooks.c \
|
||||||
|
$(srcroot)src/large.c \
|
||||||
|
$(srcroot)src/malloc_io.c \
|
||||||
|
$(srcroot)src/mutex.c \
|
||||||
|
$(srcroot)src/mutex_pool.c \
|
||||||
|
$(srcroot)src/nstime.c \
|
||||||
|
$(srcroot)src/pages.c \
|
||||||
|
$(srcroot)src/prng.c \
|
||||||
|
$(srcroot)src/prof.c \
|
||||||
|
$(srcroot)src/rtree.c \
|
||||||
|
$(srcroot)src/stats.c \
|
||||||
|
$(srcroot)src/spin.c \
|
||||||
|
$(srcroot)src/sz.c \
|
||||||
|
$(srcroot)src/tcache.c \
|
||||||
|
$(srcroot)src/ticker.c \
|
||||||
|
$(srcroot)src/tsd.c \
|
||||||
|
$(srcroot)src/witness.c
|
||||||
|
ifeq ($(enable_zone_allocator), 1)
|
||||||
|
C_SRCS += $(srcroot)src/zone.c
|
||||||
|
endif
|
||||||
|
ifeq ($(IMPORTLIB),$(SO))
|
||||||
|
STATIC_LIBS := $(objroot)lib/$(LIBJEMALLOC).$(A)
|
||||||
|
endif
|
||||||
|
ifdef PIC_CFLAGS
|
||||||
|
STATIC_LIBS += $(objroot)lib/$(LIBJEMALLOC)_pic.$(A)
|
||||||
|
else
|
||||||
|
STATIC_LIBS += $(objroot)lib/$(LIBJEMALLOC)_s.$(A)
|
||||||
|
endif
|
||||||
|
DSOS := $(objroot)lib/$(LIBJEMALLOC).$(SOREV)
|
||||||
|
ifneq ($(SOREV),$(SO))
|
||||||
|
DSOS += $(objroot)lib/$(LIBJEMALLOC).$(SO)
|
||||||
|
endif
|
||||||
|
ifeq (1, $(link_whole_archive))
|
||||||
|
LJEMALLOC := -Wl,--whole-archive -L$(objroot)lib -l$(LIBJEMALLOC) -Wl,--no-whole-archive
|
||||||
|
else
|
||||||
|
LJEMALLOC := $(objroot)lib/$(LIBJEMALLOC).$(IMPORTLIB)
|
||||||
|
endif
|
||||||
|
PC := $(objroot)jemalloc.pc
|
||||||
|
MAN3 := $(objroot)doc/jemalloc$(install_suffix).3
|
||||||
|
DOCS_XML := $(objroot)doc/jemalloc$(install_suffix).xml
|
||||||
|
DOCS_HTML := $(DOCS_XML:$(objroot)%.xml=$(objroot)%.html)
|
||||||
|
DOCS_MAN3 := $(DOCS_XML:$(objroot)%.xml=$(objroot)%.3)
|
||||||
|
DOCS := $(DOCS_HTML) $(DOCS_MAN3)
|
||||||
|
C_TESTLIB_SRCS := $(srcroot)test/src/btalloc.c $(srcroot)test/src/btalloc_0.c \
|
||||||
|
$(srcroot)test/src/btalloc_1.c $(srcroot)test/src/math.c \
|
||||||
|
$(srcroot)test/src/mtx.c $(srcroot)test/src/mq.c \
|
||||||
|
$(srcroot)test/src/SFMT.c $(srcroot)test/src/test.c \
|
||||||
|
$(srcroot)test/src/thd.c $(srcroot)test/src/timer.c
|
||||||
|
ifeq (1, $(link_whole_archive))
|
||||||
|
C_UTIL_INTEGRATION_SRCS :=
|
||||||
|
C_UTIL_CPP_SRCS :=
|
||||||
|
else
|
||||||
|
C_UTIL_INTEGRATION_SRCS := $(srcroot)src/nstime.c $(srcroot)src/malloc_io.c
|
||||||
|
C_UTIL_CPP_SRCS := $(srcroot)src/nstime.c $(srcroot)src/malloc_io.c
|
||||||
|
endif
|
||||||
|
TESTS_UNIT := \
|
||||||
|
$(srcroot)test/unit/a0.c \
|
||||||
|
$(srcroot)test/unit/arena_reset.c \
|
||||||
|
$(srcroot)test/unit/atomic.c \
|
||||||
|
$(srcroot)test/unit/background_thread.c \
|
||||||
|
$(srcroot)test/unit/base.c \
|
||||||
|
$(srcroot)test/unit/bitmap.c \
|
||||||
|
$(srcroot)test/unit/ckh.c \
|
||||||
|
$(srcroot)test/unit/decay.c \
|
||||||
|
$(srcroot)test/unit/extent_quantize.c \
|
||||||
|
$(srcroot)test/unit/fork.c \
|
||||||
|
$(srcroot)test/unit/hash.c \
|
||||||
|
$(srcroot)test/unit/hooks.c \
|
||||||
|
$(srcroot)test/unit/junk.c \
|
||||||
|
$(srcroot)test/unit/junk_alloc.c \
|
||||||
|
$(srcroot)test/unit/junk_free.c \
|
||||||
|
$(srcroot)test/unit/mallctl.c \
|
||||||
|
$(srcroot)test/unit/malloc_io.c \
|
||||||
|
$(srcroot)test/unit/math.c \
|
||||||
|
$(srcroot)test/unit/mq.c \
|
||||||
|
$(srcroot)test/unit/mtx.c \
|
||||||
|
$(srcroot)test/unit/pack.c \
|
||||||
|
$(srcroot)test/unit/pages.c \
|
||||||
|
$(srcroot)test/unit/ph.c \
|
||||||
|
$(srcroot)test/unit/prng.c \
|
||||||
|
$(srcroot)test/unit/prof_accum.c \
|
||||||
|
$(srcroot)test/unit/prof_active.c \
|
||||||
|
$(srcroot)test/unit/prof_gdump.c \
|
||||||
|
$(srcroot)test/unit/prof_idump.c \
|
||||||
|
$(srcroot)test/unit/prof_reset.c \
|
||||||
|
$(srcroot)test/unit/prof_tctx.c \
|
||||||
|
$(srcroot)test/unit/prof_thread_name.c \
|
||||||
|
$(srcroot)test/unit/ql.c \
|
||||||
|
$(srcroot)test/unit/qr.c \
|
||||||
|
$(srcroot)test/unit/rb.c \
|
||||||
|
$(srcroot)test/unit/retained.c \
|
||||||
|
$(srcroot)test/unit/rtree.c \
|
||||||
|
$(srcroot)test/unit/SFMT.c \
|
||||||
|
$(srcroot)test/unit/size_classes.c \
|
||||||
|
$(srcroot)test/unit/slab.c \
|
||||||
|
$(srcroot)test/unit/smoothstep.c \
|
||||||
|
$(srcroot)test/unit/spin.c \
|
||||||
|
$(srcroot)test/unit/stats.c \
|
||||||
|
$(srcroot)test/unit/stats_print.c \
|
||||||
|
$(srcroot)test/unit/ticker.c \
|
||||||
|
$(srcroot)test/unit/nstime.c \
|
||||||
|
$(srcroot)test/unit/tsd.c \
|
||||||
|
$(srcroot)test/unit/witness.c \
|
||||||
|
$(srcroot)test/unit/zero.c
|
||||||
|
ifeq (@enable_prof@, 1)
|
||||||
|
TESTS_UNIT += \
|
||||||
|
$(srcroot)test/unit/arena_reset_prof.c
|
||||||
|
endif
|
||||||
|
TESTS_INTEGRATION := $(srcroot)test/integration/aligned_alloc.c \
|
||||||
|
$(srcroot)test/integration/allocated.c \
|
||||||
|
$(srcroot)test/integration/extent.c \
|
||||||
|
$(srcroot)test/integration/mallocx.c \
|
||||||
|
$(srcroot)test/integration/MALLOCX_ARENA.c \
|
||||||
|
$(srcroot)test/integration/overflow.c \
|
||||||
|
$(srcroot)test/integration/posix_memalign.c \
|
||||||
|
$(srcroot)test/integration/rallocx.c \
|
||||||
|
$(srcroot)test/integration/sdallocx.c \
|
||||||
|
$(srcroot)test/integration/thread_arena.c \
|
||||||
|
$(srcroot)test/integration/thread_tcache_enabled.c \
|
||||||
|
$(srcroot)test/integration/xallocx.c
|
||||||
|
ifeq (@enable_cxx@, 1)
|
||||||
|
CPP_SRCS := $(srcroot)src/jemalloc_cpp.cpp
|
||||||
|
TESTS_INTEGRATION_CPP := $(srcroot)test/integration/cpp/basic.cpp
|
||||||
|
else
|
||||||
|
CPP_SRCS :=
|
||||||
|
TESTS_INTEGRATION_CPP :=
|
||||||
|
endif
|
||||||
|
TESTS_STRESS := $(srcroot)test/stress/microbench.c
|
||||||
|
|
||||||
|
TESTS := $(TESTS_UNIT) $(TESTS_INTEGRATION) $(TESTS_INTEGRATION_CPP) $(TESTS_STRESS)
|
||||||
|
|
||||||
|
PRIVATE_NAMESPACE_HDRS := $(objroot)include/jemalloc/internal/private_namespace.h $(objroot)include/jemalloc/internal/private_namespace_jet.h
|
||||||
|
PRIVATE_NAMESPACE_GEN_HDRS := $(PRIVATE_NAMESPACE_HDRS:%.h=%.gen.h)
|
||||||
|
C_SYM_OBJS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.sym.$(O))
|
||||||
|
C_SYMS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.sym)
|
||||||
|
C_OBJS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
|
CPP_OBJS := $(CPP_SRCS:$(srcroot)%.cpp=$(objroot)%.$(O))
|
||||||
|
C_PIC_OBJS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.pic.$(O))
|
||||||
|
CPP_PIC_OBJS := $(CPP_SRCS:$(srcroot)%.cpp=$(objroot)%.pic.$(O))
|
||||||
|
C_JET_SYM_OBJS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.jet.sym.$(O))
|
||||||
|
C_JET_SYMS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.jet.sym)
|
||||||
|
C_JET_OBJS := $(C_SRCS:$(srcroot)%.c=$(objroot)%.jet.$(O))
|
||||||
|
C_TESTLIB_UNIT_OBJS := $(C_TESTLIB_SRCS:$(srcroot)%.c=$(objroot)%.unit.$(O))
|
||||||
|
C_TESTLIB_INTEGRATION_OBJS := $(C_TESTLIB_SRCS:$(srcroot)%.c=$(objroot)%.integration.$(O))
|
||||||
|
C_UTIL_INTEGRATION_OBJS := $(C_UTIL_INTEGRATION_SRCS:$(srcroot)%.c=$(objroot)%.integration.$(O))
|
||||||
|
C_TESTLIB_STRESS_OBJS := $(C_TESTLIB_SRCS:$(srcroot)%.c=$(objroot)%.stress.$(O))
|
||||||
|
C_TESTLIB_OBJS := $(C_TESTLIB_UNIT_OBJS) $(C_TESTLIB_INTEGRATION_OBJS) $(C_UTIL_INTEGRATION_OBJS) $(C_TESTLIB_STRESS_OBJS)
|
||||||
|
|
||||||
|
TESTS_UNIT_OBJS := $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
|
TESTS_INTEGRATION_OBJS := $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
|
TESTS_INTEGRATION_CPP_OBJS := $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%.$(O))
|
||||||
|
TESTS_STRESS_OBJS := $(TESTS_STRESS:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
|
TESTS_OBJS := $(TESTS_UNIT_OBJS) $(TESTS_INTEGRATION_OBJS) $(TESTS_STRESS_OBJS)
|
||||||
|
TESTS_CPP_OBJS := $(TESTS_INTEGRATION_CPP_OBJS)
|
||||||
|
|
||||||
|
.PHONY: all dist build_doc_html build_doc_man build_doc
|
||||||
|
.PHONY: install_bin install_include install_lib
|
||||||
|
.PHONY: install_doc_html install_doc_man install_doc install
|
||||||
|
.PHONY: tests check clean distclean relclean
|
||||||
|
|
||||||
|
.SECONDARY : $(PRIVATE_NAMESPACE_GEN_HDRS) $(TESTS_OBJS) $(TESTS_CPP_OBJS)
|
||||||
|
|
||||||
|
# Default target.
|
||||||
|
all: build_lib
|
||||||
|
|
||||||
|
dist: build_doc
|
||||||
|
|
||||||
|
$(objroot)doc/%.html : $(objroot)doc/%.xml $(srcroot)doc/stylesheet.xsl $(objroot)doc/html.xsl
|
||||||
|
$(XSLTPROC) -o $@ $(objroot)doc/html.xsl $<
|
||||||
|
|
||||||
|
$(objroot)doc/%.3 : $(objroot)doc/%.xml $(srcroot)doc/stylesheet.xsl $(objroot)doc/manpages.xsl
|
||||||
|
$(XSLTPROC) -o $@ $(objroot)doc/manpages.xsl $<
|
||||||
|
|
||||||
|
build_doc_html: $(DOCS_HTML)
|
||||||
|
build_doc_man: $(DOCS_MAN3)
|
||||||
|
build_doc: $(DOCS)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Include generated dependency files.
|
||||||
|
#
|
||||||
|
ifdef CC_MM
|
||||||
|
-include $(C_SYM_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(C_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(CPP_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(C_PIC_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(CPP_PIC_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(C_JET_SYM_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(C_JET_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(C_TESTLIB_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(TESTS_OBJS:%.$(O)=%.d)
|
||||||
|
-include $(TESTS_CPP_OBJS:%.$(O)=%.d)
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(C_SYM_OBJS): $(objroot)src/%.sym.$(O): $(srcroot)src/%.c
|
||||||
|
$(C_SYM_OBJS): CPPFLAGS += -DJEMALLOC_NO_PRIVATE_NAMESPACE
|
||||||
|
$(C_SYMS): $(objroot)src/%.sym: $(objroot)src/%.sym.$(O)
|
||||||
|
$(C_OBJS): $(objroot)src/%.$(O): $(srcroot)src/%.c
|
||||||
|
$(CPP_OBJS): $(objroot)src/%.$(O): $(srcroot)src/%.cpp
|
||||||
|
$(C_PIC_OBJS): $(objroot)src/%.pic.$(O): $(srcroot)src/%.c
|
||||||
|
$(C_PIC_OBJS): CFLAGS += $(PIC_CFLAGS)
|
||||||
|
$(CPP_PIC_OBJS): $(objroot)src/%.pic.$(O): $(srcroot)src/%.cpp
|
||||||
|
$(CPP_PIC_OBJS): CXXFLAGS += $(PIC_CFLAGS)
|
||||||
|
$(C_JET_SYM_OBJS): $(objroot)src/%.jet.sym.$(O): $(srcroot)src/%.c
|
||||||
|
$(C_JET_SYM_OBJS): CPPFLAGS += -DJEMALLOC_JET -DJEMALLOC_NO_PRIVATE_NAMESPACE
|
||||||
|
$(C_JET_SYMS): $(objroot)src/%.jet.sym: $(objroot)src/%.jet.sym.$(O)
|
||||||
|
$(C_JET_OBJS): $(objroot)src/%.jet.$(O): $(srcroot)src/%.c
|
||||||
|
$(C_JET_OBJS): CPPFLAGS += -DJEMALLOC_JET
|
||||||
|
$(C_TESTLIB_UNIT_OBJS): $(objroot)test/src/%.unit.$(O): $(srcroot)test/src/%.c
|
||||||
|
$(C_TESTLIB_UNIT_OBJS): CPPFLAGS += -DJEMALLOC_UNIT_TEST
|
||||||
|
$(C_TESTLIB_INTEGRATION_OBJS): $(objroot)test/src/%.integration.$(O): $(srcroot)test/src/%.c
|
||||||
|
$(C_TESTLIB_INTEGRATION_OBJS): CPPFLAGS += -DJEMALLOC_INTEGRATION_TEST
|
||||||
|
$(C_UTIL_INTEGRATION_OBJS): $(objroot)src/%.integration.$(O): $(srcroot)src/%.c
|
||||||
|
$(C_TESTLIB_STRESS_OBJS): $(objroot)test/src/%.stress.$(O): $(srcroot)test/src/%.c
|
||||||
|
$(C_TESTLIB_STRESS_OBJS): CPPFLAGS += -DJEMALLOC_STRESS_TEST -DJEMALLOC_STRESS_TESTLIB
|
||||||
|
$(C_TESTLIB_OBJS): CPPFLAGS += -I$(srcroot)test/include -I$(objroot)test/include
|
||||||
|
$(TESTS_UNIT_OBJS): CPPFLAGS += -DJEMALLOC_UNIT_TEST
|
||||||
|
$(TESTS_INTEGRATION_OBJS): CPPFLAGS += -DJEMALLOC_INTEGRATION_TEST
|
||||||
|
$(TESTS_INTEGRATION_CPP_OBJS): CPPFLAGS += -DJEMALLOC_INTEGRATION_CPP_TEST
|
||||||
|
$(TESTS_STRESS_OBJS): CPPFLAGS += -DJEMALLOC_STRESS_TEST
|
||||||
|
$(TESTS_OBJS): $(objroot)test/%.$(O): $(srcroot)test/%.c
|
||||||
|
$(TESTS_CPP_OBJS): $(objroot)test/%.$(O): $(srcroot)test/%.cpp
|
||||||
|
$(TESTS_OBJS): CPPFLAGS += -I$(srcroot)test/include -I$(objroot)test/include
|
||||||
|
$(TESTS_CPP_OBJS): CPPFLAGS += -I$(srcroot)test/include -I$(objroot)test/include
|
||||||
|
ifneq ($(IMPORTLIB),$(SO))
|
||||||
|
$(CPP_OBJS) $(C_SYM_OBJS) $(C_OBJS) $(C_JET_SYM_OBJS) $(C_JET_OBJS): CPPFLAGS += -DDLLEXPORT
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Dependencies.
|
||||||
|
ifndef CC_MM
|
||||||
|
HEADER_DIRS = $(srcroot)include/jemalloc/internal \
|
||||||
|
$(objroot)include/jemalloc $(objroot)include/jemalloc/internal
|
||||||
|
HEADERS = $(filter-out $(PRIVATE_NAMESPACE_HDRS),$(wildcard $(foreach dir,$(HEADER_DIRS),$(dir)/*.h)))
|
||||||
|
$(C_SYM_OBJS) $(C_OBJS) $(CPP_OBJS) $(C_PIC_OBJS) $(CPP_PIC_OBJS) $(C_JET_SYM_OBJS) $(C_JET_OBJS) $(C_TESTLIB_OBJS) $(TESTS_OBJS) $(TESTS_CPP_OBJS): $(HEADERS)
|
||||||
|
$(TESTS_OBJS) $(TESTS_CPP_OBJS): $(objroot)test/include/test/jemalloc_test.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(C_OBJS) $(CPP_OBJS) $(C_PIC_OBJS) $(CPP_PIC_OBJS) $(C_TESTLIB_INTEGRATION_OBJS) $(C_UTIL_INTEGRATION_OBJS) $(TESTS_INTEGRATION_OBJS) $(TESTS_INTEGRATION_CPP_OBJS): $(objroot)include/jemalloc/internal/private_namespace.h
|
||||||
|
$(C_JET_OBJS) $(C_TESTLIB_UNIT_OBJS) $(C_TESTLIB_STRESS_OBJS) $(TESTS_UNIT_OBJS) $(TESTS_STRESS_OBJS): $(objroot)include/jemalloc/internal/private_namespace_jet.h
|
||||||
|
|
||||||
|
$(C_SYM_OBJS) $(C_OBJS) $(C_PIC_OBJS) $(C_JET_SYM_OBJS) $(C_JET_OBJS) $(C_TESTLIB_OBJS) $(TESTS_OBJS): %.$(O):
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(CFLAGS) -c $(CPPFLAGS) $(CTARGET) $<
|
||||||
|
ifdef CC_MM
|
||||||
|
@$(CC) -MM $(CPPFLAGS) -MT $@ -o $(@:%.$(O)=%.d) $<
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(C_SYMS): %.sym:
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(DUMP_SYMS) $< | $(AWK) -f $(objroot)include/jemalloc/internal/private_symbols.awk > $@
|
||||||
|
|
||||||
|
$(C_JET_SYMS): %.sym:
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(DUMP_SYMS) $< | $(AWK) -f $(objroot)include/jemalloc/internal/private_symbols_jet.awk > $@
|
||||||
|
|
||||||
|
$(objroot)include/jemalloc/internal/private_namespace.gen.h: $(C_SYMS)
|
||||||
|
$(SHELL) $(srcroot)include/jemalloc/internal/private_namespace.sh $^ > $@
|
||||||
|
|
||||||
|
$(objroot)include/jemalloc/internal/private_namespace_jet.gen.h: $(C_JET_SYMS)
|
||||||
|
$(SHELL) $(srcroot)include/jemalloc/internal/private_namespace.sh $^ > $@
|
||||||
|
|
||||||
|
%.h: %.gen.h
|
||||||
|
@if ! `cmp -s $< $@` ; then echo "cp $< $<"; cp $< $@ ; fi
|
||||||
|
|
||||||
|
$(CPP_OBJS) $(CPP_PIC_OBJS) $(TESTS_CPP_OBJS): %.$(O):
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CXX) $(CXXFLAGS) -c $(CPPFLAGS) $(CTARGET) $<
|
||||||
|
ifdef CC_MM
|
||||||
|
@$(CXX) -MM $(CPPFLAGS) -MT $@ -o $(@:%.$(O)=%.d) $<
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(SOREV),$(SO))
|
||||||
|
%.$(SO) : %.$(SOREV)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
ln -sf $(<F) $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(objroot)lib/$(LIBJEMALLOC).$(SOREV) : $(if $(PIC_CFLAGS),$(C_PIC_OBJS),$(C_OBJS)) $(if $(PIC_CFLAGS),$(CPP_PIC_OBJS),$(CPP_OBJS))
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(DSO_LDFLAGS) $(call RPATH,$(RPATH_EXTRA)) $(LDTARGET) $+ $(LDFLAGS) $(LIBS) $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
|
$(objroot)lib/$(LIBJEMALLOC)_pic.$(A) : $(C_PIC_OBJS) $(CPP_PIC_OBJS)
|
||||||
|
$(objroot)lib/$(LIBJEMALLOC).$(A) : $(C_OBJS) $(CPP_OBJS)
|
||||||
|
$(objroot)lib/$(LIBJEMALLOC)_s.$(A) : $(C_OBJS) $(CPP_OBJS)
|
||||||
|
|
||||||
|
$(STATIC_LIBS):
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(AR) $(ARFLAGS)@AROUT@ $+
|
||||||
|
|
||||||
|
$(objroot)test/unit/%$(EXE): $(objroot)test/unit/%.$(O) $(C_JET_OBJS) $(C_TESTLIB_UNIT_OBJS)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(LDTARGET) $(filter %.$(O),$^) $(call RPATH,$(objroot)lib) $(LDFLAGS) $(filter-out -lm,$(LIBS)) $(LM) $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
|
$(objroot)test/integration/%$(EXE): $(objroot)test/integration/%.$(O) $(C_TESTLIB_INTEGRATION_OBJS) $(C_UTIL_INTEGRATION_OBJS) $(objroot)lib/$(LIBJEMALLOC).$(IMPORTLIB)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(TEST_LD_MODE) $(LDTARGET) $(filter %.$(O),$^) $(call RPATH,$(objroot)lib) $(LJEMALLOC) $(LDFLAGS) $(filter-out -lm,$(filter -lrt -lpthread -lstdc++,$(LIBS))) $(LM) $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
|
$(objroot)test/integration/cpp/%$(EXE): $(objroot)test/integration/cpp/%.$(O) $(C_TESTLIB_INTEGRATION_OBJS) $(C_UTIL_INTEGRATION_OBJS) $(objroot)lib/$(LIBJEMALLOC).$(IMPORTLIB)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CXX) $(LDTARGET) $(filter %.$(O),$^) $(call RPATH,$(objroot)lib) $(objroot)lib/$(LIBJEMALLOC).$(IMPORTLIB) $(LDFLAGS) $(filter-out -lm,$(LIBS)) -lm $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
|
$(objroot)test/stress/%$(EXE): $(objroot)test/stress/%.$(O) $(C_JET_OBJS) $(C_TESTLIB_STRESS_OBJS) $(objroot)lib/$(LIBJEMALLOC).$(IMPORTLIB)
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
$(CC) $(TEST_LD_MODE) $(LDTARGET) $(filter %.$(O),$^) $(call RPATH,$(objroot)lib) $(objroot)lib/$(LIBJEMALLOC).$(IMPORTLIB) $(LDFLAGS) $(filter-out -lm,$(LIBS)) $(LM) $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
|
build_lib_shared: $(DSOS)
|
||||||
|
build_lib_static: $(STATIC_LIBS)
|
||||||
|
build_lib: build_lib_shared build_lib_static
|
||||||
|
|
||||||
|
install_bin:
|
||||||
|
$(INSTALL) -d $(BINDIR)
|
||||||
|
@for b in $(BINS); do \
|
||||||
|
echo "$(INSTALL) -m 755 $$b $(BINDIR)"; \
|
||||||
|
$(INSTALL) -m 755 $$b $(BINDIR); \
|
||||||
|
done
|
||||||
|
|
||||||
|
install_include:
|
||||||
|
$(INSTALL) -d $(INCLUDEDIR)/jemalloc
|
||||||
|
@for h in $(C_HDRS); do \
|
||||||
|
echo "$(INSTALL) -m 644 $$h $(INCLUDEDIR)/jemalloc"; \
|
||||||
|
$(INSTALL) -m 644 $$h $(INCLUDEDIR)/jemalloc; \
|
||||||
|
done
|
||||||
|
|
||||||
|
install_lib_shared: $(DSOS)
|
||||||
|
$(INSTALL) -d $(LIBDIR)
|
||||||
|
$(INSTALL) -m 755 $(objroot)lib/$(LIBJEMALLOC).$(SOREV) $(LIBDIR)
|
||||||
|
ifneq ($(SOREV),$(SO))
|
||||||
|
ln -sf $(LIBJEMALLOC).$(SOREV) $(LIBDIR)/$(LIBJEMALLOC).$(SO)
|
||||||
|
endif
|
||||||
|
|
||||||
|
install_lib_static: $(STATIC_LIBS)
|
||||||
|
$(INSTALL) -d $(LIBDIR)
|
||||||
|
@for l in $(STATIC_LIBS); do \
|
||||||
|
echo "$(INSTALL) -m 755 $$l $(LIBDIR)"; \
|
||||||
|
$(INSTALL) -m 755 $$l $(LIBDIR); \
|
||||||
|
done
|
||||||
|
|
||||||
|
install_lib_pc: $(PC)
|
||||||
|
$(INSTALL) -d $(LIBDIR)/pkgconfig
|
||||||
|
@for l in $(PC); do \
|
||||||
|
echo "$(INSTALL) -m 644 $$l $(LIBDIR)/pkgconfig"; \
|
||||||
|
$(INSTALL) -m 644 $$l $(LIBDIR)/pkgconfig; \
|
||||||
|
done
|
||||||
|
|
||||||
|
install_lib: install_lib_shared install_lib_static install_lib_pc
|
||||||
|
|
||||||
|
install_doc_html:
|
||||||
|
$(INSTALL) -d $(DATADIR)/doc/jemalloc$(install_suffix)
|
||||||
|
@for d in $(DOCS_HTML); do \
|
||||||
|
echo "$(INSTALL) -m 644 $$d $(DATADIR)/doc/jemalloc$(install_suffix)"; \
|
||||||
|
$(INSTALL) -m 644 $$d $(DATADIR)/doc/jemalloc$(install_suffix); \
|
||||||
|
done
|
||||||
|
|
||||||
|
install_doc_man:
|
||||||
|
$(INSTALL) -d $(MANDIR)/man3
|
||||||
|
@for d in $(DOCS_MAN3); do \
|
||||||
|
echo "$(INSTALL) -m 644 $$d $(MANDIR)/man3"; \
|
||||||
|
$(INSTALL) -m 644 $$d $(MANDIR)/man3; \
|
||||||
|
done
|
||||||
|
|
||||||
|
install_doc: install_doc_html install_doc_man
|
||||||
|
|
||||||
|
install: install_bin install_include install_lib install_doc
|
||||||
|
|
||||||
|
tests_unit: $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%$(EXE))
|
||||||
|
tests_integration: $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%$(EXE)) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%$(EXE))
|
||||||
|
tests_stress: $(TESTS_STRESS:$(srcroot)%.c=$(objroot)%$(EXE))
|
||||||
|
tests: tests_unit tests_integration tests_stress
|
||||||
|
|
||||||
|
check_unit_dir:
|
||||||
|
@mkdir -p $(objroot)test/unit
|
||||||
|
check_integration_dir:
|
||||||
|
@mkdir -p $(objroot)test/integration
|
||||||
|
stress_dir:
|
||||||
|
@mkdir -p $(objroot)test/stress
|
||||||
|
check_dir: check_unit_dir check_integration_dir
|
||||||
|
|
||||||
|
check_unit: tests_unit check_unit_dir
|
||||||
|
$(SHELL) $(objroot)test/test.sh $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%)
|
||||||
|
check_integration_prof: tests_integration check_integration_dir
|
||||||
|
ifeq ($(enable_prof), 1)
|
||||||
|
$(MALLOC_CONF)="prof:true" $(SHELL) $(objroot)test/test.sh $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%)
|
||||||
|
$(MALLOC_CONF)="prof:true,prof_active:false" $(SHELL) $(objroot)test/test.sh $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%)
|
||||||
|
endif
|
||||||
|
check_integration_decay: tests_integration check_integration_dir
|
||||||
|
$(MALLOC_CONF)="dirty_decay_ms:-1,muzzy_decay_ms:-1" $(SHELL) $(objroot)test/test.sh $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%)
|
||||||
|
$(MALLOC_CONF)="dirty_decay_ms:0,muzzy_decay_ms:0" $(SHELL) $(objroot)test/test.sh $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%)
|
||||||
|
check_integration: tests_integration check_integration_dir
|
||||||
|
$(SHELL) $(objroot)test/test.sh $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%)
|
||||||
|
stress: tests_stress stress_dir
|
||||||
|
$(SHELL) $(objroot)test/test.sh $(TESTS_STRESS:$(srcroot)%.c=$(objroot)%)
|
||||||
|
check: check_unit check_integration check_integration_decay check_integration_prof
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(PRIVATE_NAMESPACE_HDRS)
|
||||||
|
rm -f $(PRIVATE_NAMESPACE_GEN_HDRS)
|
||||||
|
rm -f $(C_SYM_OBJS)
|
||||||
|
rm -f $(C_SYMS)
|
||||||
|
rm -f $(C_OBJS)
|
||||||
|
rm -f $(CPP_OBJS)
|
||||||
|
rm -f $(C_PIC_OBJS)
|
||||||
|
rm -f $(CPP_PIC_OBJS)
|
||||||
|
rm -f $(C_JET_SYM_OBJS)
|
||||||
|
rm -f $(C_JET_SYMS)
|
||||||
|
rm -f $(C_JET_OBJS)
|
||||||
|
rm -f $(C_TESTLIB_OBJS)
|
||||||
|
rm -f $(C_SYM_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(C_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(CPP_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(C_PIC_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(CPP_PIC_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(C_JET_SYM_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(C_JET_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(C_TESTLIB_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(TESTS_OBJS:%.$(O)=%$(EXE))
|
||||||
|
rm -f $(TESTS_OBJS)
|
||||||
|
rm -f $(TESTS_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(TESTS_OBJS:%.$(O)=%.out)
|
||||||
|
rm -f $(TESTS_CPP_OBJS:%.$(O)=%$(EXE))
|
||||||
|
rm -f $(TESTS_CPP_OBJS)
|
||||||
|
rm -f $(TESTS_CPP_OBJS:%.$(O)=%.d)
|
||||||
|
rm -f $(TESTS_CPP_OBJS:%.$(O)=%.out)
|
||||||
|
rm -f $(DSOS) $(STATIC_LIBS)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(objroot)bin/jemalloc-config
|
||||||
|
rm -f $(objroot)bin/jemalloc.sh
|
||||||
|
rm -f $(objroot)bin/jeprof
|
||||||
|
rm -f $(objroot)config.log
|
||||||
|
rm -f $(objroot)config.status
|
||||||
|
rm -f $(objroot)config.stamp
|
||||||
|
rm -f $(cfghdrs_out)
|
||||||
|
rm -f $(cfgoutputs_out)
|
||||||
|
|
||||||
|
relclean: distclean
|
||||||
|
rm -f $(objroot)configure
|
||||||
|
rm -f $(objroot)VERSION
|
||||||
|
rm -f $(DOCS_HTML)
|
||||||
|
rm -f $(DOCS_MAN3)
|
||||||
|
|
||||||
|
#===============================================================================
|
||||||
|
# Re-configuration rules.
|
||||||
|
|
||||||
|
ifeq ($(enable_autogen), 1)
|
||||||
|
$(srcroot)configure : $(srcroot)configure.ac
|
||||||
|
cd ./$(srcroot) && $(AUTOCONF)
|
||||||
|
|
||||||
|
$(objroot)config.status : $(srcroot)configure
|
||||||
|
./$(objroot)config.status --recheck
|
||||||
|
|
||||||
|
$(srcroot)config.stamp.in : $(srcroot)configure.ac
|
||||||
|
echo stamp > $(srcroot)config.stamp.in
|
||||||
|
|
||||||
|
$(objroot)config.stamp : $(cfgoutputs_in) $(cfghdrs_in) $(srcroot)configure
|
||||||
|
./$(objroot)config.status
|
||||||
|
@touch $@
|
||||||
|
|
||||||
|
# There must be some action in order for make to re-read Makefile when it is
|
||||||
|
# out of date.
|
||||||
|
$(cfgoutputs_out) $(cfghdrs_out) : $(objroot)config.stamp
|
||||||
|
@true
|
||||||
|
endif
|
20
jemalloc/README
Normal file
20
jemalloc/README
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
jemalloc is a general purpose malloc(3) implementation that emphasizes
|
||||||
|
fragmentation avoidance and scalable concurrency support. jemalloc first came
|
||||||
|
into use as the FreeBSD libc allocator in 2005, and since then it has found its
|
||||||
|
way into numerous applications that rely on its predictable behavior. In 2010
|
||||||
|
jemalloc development efforts broadened to include developer support features
|
||||||
|
such as heap profiling and extensive monitoring/tuning hooks. Modern jemalloc
|
||||||
|
releases continue to be integrated back into FreeBSD, and therefore versatility
|
||||||
|
remains critical. Ongoing development efforts trend toward making jemalloc
|
||||||
|
among the best allocators for a broad range of demanding applications, and
|
||||||
|
eliminating/mitigating weaknesses that have practical repercussions for real
|
||||||
|
world applications.
|
||||||
|
|
||||||
|
The COPYING file contains copyright and licensing information.
|
||||||
|
|
||||||
|
The INSTALL file contains information on how to configure, build, and install
|
||||||
|
jemalloc.
|
||||||
|
|
||||||
|
The ChangeLog file contains a brief summary of changes for each release.
|
||||||
|
|
||||||
|
URL: http://jemalloc.net/
|
17
jemalloc/autogen.sh
Executable file
17
jemalloc/autogen.sh
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
for i in autoconf; do
|
||||||
|
echo "$i"
|
||||||
|
$i
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error $? in $i"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "./configure --enable-autogen $@"
|
||||||
|
./configure --enable-autogen $@
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error $? in ./configure"
|
||||||
|
exit 1
|
||||||
|
fi
|
83
jemalloc/bin/jemalloc-config.in
Normal file
83
jemalloc/bin/jemalloc-config.in
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Usage:
|
||||||
|
@BINDIR@/jemalloc-config <option>
|
||||||
|
Options:
|
||||||
|
--help | -h : Print usage.
|
||||||
|
--version : Print jemalloc version.
|
||||||
|
--revision : Print shared library revision number.
|
||||||
|
--config : Print configure options used to build jemalloc.
|
||||||
|
--prefix : Print installation directory prefix.
|
||||||
|
--bindir : Print binary installation directory.
|
||||||
|
--datadir : Print data installation directory.
|
||||||
|
--includedir : Print include installation directory.
|
||||||
|
--libdir : Print library installation directory.
|
||||||
|
--mandir : Print manual page installation directory.
|
||||||
|
--cc : Print compiler used to build jemalloc.
|
||||||
|
--cflags : Print compiler flags used to build jemalloc.
|
||||||
|
--cppflags : Print preprocessor flags used to build jemalloc.
|
||||||
|
--cxxflags : Print C++ compiler flags used to build jemalloc.
|
||||||
|
--ldflags : Print library flags used to build jemalloc.
|
||||||
|
--libs : Print libraries jemalloc was linked against.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix="@prefix@"
|
||||||
|
exec_prefix="@exec_prefix@"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
--help | -h)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
--version)
|
||||||
|
echo "@jemalloc_version@"
|
||||||
|
;;
|
||||||
|
--revision)
|
||||||
|
echo "@rev@"
|
||||||
|
;;
|
||||||
|
--config)
|
||||||
|
echo "@CONFIG@"
|
||||||
|
;;
|
||||||
|
--prefix)
|
||||||
|
echo "@PREFIX@"
|
||||||
|
;;
|
||||||
|
--bindir)
|
||||||
|
echo "@BINDIR@"
|
||||||
|
;;
|
||||||
|
--datadir)
|
||||||
|
echo "@DATADIR@"
|
||||||
|
;;
|
||||||
|
--includedir)
|
||||||
|
echo "@INCLUDEDIR@"
|
||||||
|
;;
|
||||||
|
--libdir)
|
||||||
|
echo "@LIBDIR@"
|
||||||
|
;;
|
||||||
|
--mandir)
|
||||||
|
echo "@MANDIR@"
|
||||||
|
;;
|
||||||
|
--cc)
|
||||||
|
echo "@CC@"
|
||||||
|
;;
|
||||||
|
--cflags)
|
||||||
|
echo "@CFLAGS@"
|
||||||
|
;;
|
||||||
|
--cppflags)
|
||||||
|
echo "@CPPFLAGS@"
|
||||||
|
;;
|
||||||
|
--cxxflags)
|
||||||
|
echo "@CXXFLAGS@"
|
||||||
|
;;
|
||||||
|
--ldflags)
|
||||||
|
echo "@LDFLAGS@ @EXTRA_LDFLAGS@"
|
||||||
|
;;
|
||||||
|
--libs)
|
||||||
|
echo "@LIBS@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
9
jemalloc/bin/jemalloc.sh.in
Normal file
9
jemalloc/bin/jemalloc.sh.in
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
libdir=@libdir@
|
||||||
|
|
||||||
|
@LD_PRELOAD_VAR@=${libdir}/libjemalloc.@SOREV@
|
||||||
|
export @LD_PRELOAD_VAR@
|
||||||
|
exec "$@"
|
5622
jemalloc/bin/jeprof.in
Normal file
5622
jemalloc/bin/jeprof.in
Normal file
File diff suppressed because it is too large
Load Diff
1462
jemalloc/build-aux/config.guess
vendored
Executable file
1462
jemalloc/build-aux/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1825
jemalloc/build-aux/config.sub
vendored
Executable file
1825
jemalloc/build-aux/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
250
jemalloc/build-aux/install-sh
Executable file
250
jemalloc/build-aux/install-sh
Executable file
@ -0,0 +1,250 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
#
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
# This comes from X11R5 (mit/util/scripts/install.sh).
|
||||||
|
#
|
||||||
|
# Copyright 1991 by the Massachusetts Institute of Technology
|
||||||
|
#
|
||||||
|
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
# documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
# the above copyright notice appear in all copies and that both that
|
||||||
|
# copyright notice and this permission notice appear in supporting
|
||||||
|
# documentation, and that the name of M.I.T. not be used in advertising or
|
||||||
|
# publicity pertaining to distribution of the software without specific,
|
||||||
|
# written prior permission. M.I.T. makes no representations about the
|
||||||
|
# suitability of this software for any purpose. It is provided "as is"
|
||||||
|
# without express or implied warranty.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch. It can only install one file at a time, a restriction
|
||||||
|
# shared with many OS's install programs.
|
||||||
|
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit="${DOITPROG-}"
|
||||||
|
|
||||||
|
|
||||||
|
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||||
|
|
||||||
|
mvprog="${MVPROG-mv}"
|
||||||
|
cpprog="${CPPROG-cp}"
|
||||||
|
chmodprog="${CHMODPROG-chmod}"
|
||||||
|
chownprog="${CHOWNPROG-chown}"
|
||||||
|
chgrpprog="${CHGRPPROG-chgrp}"
|
||||||
|
stripprog="${STRIPPROG-strip}"
|
||||||
|
rmprog="${RMPROG-rm}"
|
||||||
|
mkdirprog="${MKDIRPROG-mkdir}"
|
||||||
|
|
||||||
|
transformbasename=""
|
||||||
|
transform_arg=""
|
||||||
|
instcmd="$mvprog"
|
||||||
|
chmodcmd="$chmodprog 0755"
|
||||||
|
chowncmd=""
|
||||||
|
chgrpcmd=""
|
||||||
|
stripcmd=""
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
mvcmd="$mvprog"
|
||||||
|
src=""
|
||||||
|
dst=""
|
||||||
|
dir_arg=""
|
||||||
|
|
||||||
|
while [ x"$1" != x ]; do
|
||||||
|
case $1 in
|
||||||
|
-c) instcmd="$cpprog"
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-d) dir_arg=true
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-m) chmodcmd="$chmodprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-s) stripcmd="$stripprog"
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
*) if [ x"$src" = x ]
|
||||||
|
then
|
||||||
|
src=$1
|
||||||
|
else
|
||||||
|
# this colon is to work around a 386BSD /bin/sh bug
|
||||||
|
:
|
||||||
|
dst=$1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ x"$src" = x ]
|
||||||
|
then
|
||||||
|
echo "install: no input file specified"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]; then
|
||||||
|
dst=$src
|
||||||
|
src=""
|
||||||
|
|
||||||
|
if [ -d $dst ]; then
|
||||||
|
instcmd=:
|
||||||
|
else
|
||||||
|
instcmd=mkdir
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
|
||||||
|
if [ -f $src -o -d $src ]
|
||||||
|
then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
echo "install: $src does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dst" = x ]
|
||||||
|
then
|
||||||
|
echo "install: no destination specified"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; if your system
|
||||||
|
# does not like double slashes in filenames, you may need to add some logic
|
||||||
|
|
||||||
|
if [ -d $dst ]
|
||||||
|
then
|
||||||
|
dst="$dst"/`basename $src`
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
## this sed command emulates the dirname command
|
||||||
|
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||||
|
|
||||||
|
# Make sure that the destination directory exists.
|
||||||
|
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||||
|
|
||||||
|
# Skip lots of stat calls in the usual case.
|
||||||
|
if [ ! -d "$dstdir" ]; then
|
||||||
|
defaultIFS='
|
||||||
|
'
|
||||||
|
IFS="${IFS-${defaultIFS}}"
|
||||||
|
|
||||||
|
oIFS="${IFS}"
|
||||||
|
# Some sh's can't handle IFS=/ for some reason.
|
||||||
|
IFS='%'
|
||||||
|
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||||
|
IFS="${oIFS}"
|
||||||
|
|
||||||
|
pathcomp=''
|
||||||
|
|
||||||
|
while [ $# -ne 0 ] ; do
|
||||||
|
pathcomp="${pathcomp}${1}"
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ ! -d "${pathcomp}" ] ;
|
||||||
|
then
|
||||||
|
$mkdirprog "${pathcomp}"
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
pathcomp="${pathcomp}/"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]
|
||||||
|
then
|
||||||
|
$doit $instcmd $dst &&
|
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# If we're going to rename the final executable, determine the name now.
|
||||||
|
|
||||||
|
if [ x"$transformarg" = x ]
|
||||||
|
then
|
||||||
|
dstfile=`basename $dst`
|
||||||
|
else
|
||||||
|
dstfile=`basename $dst $transformbasename |
|
||||||
|
sed $transformarg`$transformbasename
|
||||||
|
fi
|
||||||
|
|
||||||
|
# don't allow the sed command to completely eliminate the filename
|
||||||
|
|
||||||
|
if [ x"$dstfile" = x ]
|
||||||
|
then
|
||||||
|
dstfile=`basename $dst`
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make a temp file name in the proper directory.
|
||||||
|
|
||||||
|
dsttmp=$dstdir/#inst.$$#
|
||||||
|
|
||||||
|
# Move or copy the file name to the temp name
|
||||||
|
|
||||||
|
$doit $instcmd $src $dsttmp &&
|
||||||
|
|
||||||
|
trap "rm -f ${dsttmp}" 0 &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits
|
||||||
|
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
|
||||||
|
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||||
|
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||||
|
|
||||||
|
fi &&
|
||||||
|
|
||||||
|
|
||||||
|
exit 0
|
0
jemalloc/config.stamp.in
Normal file
0
jemalloc/config.stamp.in
Normal file
2189
jemalloc/configure.ac
Normal file
2189
jemalloc/configure.ac
Normal file
File diff suppressed because it is too large
Load Diff
5
jemalloc/doc/html.xsl.in
Normal file
5
jemalloc/doc/html.xsl.in
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||||
|
<xsl:import href="@XSLROOT@/html/docbook.xsl"/>
|
||||||
|
<xsl:import href="@abs_srcroot@doc/stylesheet.xsl"/>
|
||||||
|
<xsl:output method="xml" encoding="utf-8"/>
|
||||||
|
</xsl:stylesheet>
|
3264
jemalloc/doc/jemalloc.xml.in
Normal file
3264
jemalloc/doc/jemalloc.xml.in
Normal file
File diff suppressed because it is too large
Load Diff
4
jemalloc/doc/manpages.xsl.in
Normal file
4
jemalloc/doc/manpages.xsl.in
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||||
|
<xsl:import href="@XSLROOT@/manpages/docbook.xsl"/>
|
||||||
|
<xsl:import href="@abs_srcroot@doc/stylesheet.xsl"/>
|
||||||
|
</xsl:stylesheet>
|
10
jemalloc/doc/stylesheet.xsl
Normal file
10
jemalloc/doc/stylesheet.xsl
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||||
|
<xsl:param name="funcsynopsis.style">ansi</xsl:param>
|
||||||
|
<xsl:param name="function.parens" select="0"/>
|
||||||
|
<xsl:template match="function">
|
||||||
|
<xsl:call-template name="inline.monoseq"/>
|
||||||
|
</xsl:template>
|
||||||
|
<xsl:template match="mallctl">
|
||||||
|
<quote><xsl:call-template name="inline.monoseq"/></quote>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
96
jemalloc/include/jemalloc/internal/arena_externs.h
Normal file
96
jemalloc/include/jemalloc/internal/arena_externs.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#ifndef JEMALLOC_INTERNAL_ARENA_EXTERNS_H
|
||||||
|
#define JEMALLOC_INTERNAL_ARENA_EXTERNS_H
|
||||||
|
|
||||||
|
#include "jemalloc/internal/extent_dss.h"
|
||||||
|
#include "jemalloc/internal/pages.h"
|
||||||
|
#include "jemalloc/internal/size_classes.h"
|
||||||
|
#include "jemalloc/internal/stats.h"
|
||||||
|
|
||||||
|
extern ssize_t opt_dirty_decay_ms;
|
||||||
|
extern ssize_t opt_muzzy_decay_ms;
|
||||||
|
|
||||||
|
extern const arena_bin_info_t arena_bin_info[NBINS];
|
||||||
|
|
||||||
|
extern percpu_arena_mode_t opt_percpu_arena;
|
||||||
|
extern const char *percpu_arena_mode_names[];
|
||||||
|
|
||||||
|
extern const uint64_t h_steps[SMOOTHSTEP_NSTEPS];
|
||||||
|
extern malloc_mutex_t arenas_lock;
|
||||||
|
|
||||||
|
void arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats,
|
||||||
|
szind_t szind, uint64_t nrequests);
|
||||||
|
void arena_stats_mapped_add(tsdn_t *tsdn, arena_stats_t *arena_stats,
|
||||||
|
size_t size);
|
||||||
|
void arena_basic_stats_merge(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
unsigned *nthreads, const char **dss, ssize_t *dirty_decay_ms,
|
||||||
|
ssize_t *muzzy_decay_ms, size_t *nactive, size_t *ndirty, size_t *nmuzzy);
|
||||||
|
void arena_stats_merge(tsdn_t *tsdn, arena_t *arena, unsigned *nthreads,
|
||||||
|
const char **dss, ssize_t *dirty_decay_ms, ssize_t *muzzy_decay_ms,
|
||||||
|
size_t *nactive, size_t *ndirty, size_t *nmuzzy, arena_stats_t *astats,
|
||||||
|
malloc_bin_stats_t *bstats, malloc_large_stats_t *lstats);
|
||||||
|
void arena_extents_dirty_dalloc(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
extent_hooks_t **r_extent_hooks, extent_t *extent);
|
||||||
|
#ifdef JEMALLOC_JET
|
||||||
|
size_t arena_slab_regind(extent_t *slab, szind_t binind, const void *ptr);
|
||||||
|
#endif
|
||||||
|
extent_t *arena_extent_alloc_large(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
size_t usize, size_t alignment, bool *zero);
|
||||||
|
void arena_extent_dalloc_large_prep(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
extent_t *extent);
|
||||||
|
void arena_extent_ralloc_large_shrink(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
extent_t *extent, size_t oldsize);
|
||||||
|
void arena_extent_ralloc_large_expand(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
extent_t *extent, size_t oldsize);
|
||||||
|
ssize_t arena_dirty_decay_ms_get(arena_t *arena);
|
||||||
|
bool arena_dirty_decay_ms_set(tsdn_t *tsdn, arena_t *arena, ssize_t decay_ms);
|
||||||
|
ssize_t arena_muzzy_decay_ms_get(arena_t *arena);
|
||||||
|
bool arena_muzzy_decay_ms_set(tsdn_t *tsdn, arena_t *arena, ssize_t decay_ms);
|
||||||
|
void arena_decay(tsdn_t *tsdn, arena_t *arena, bool is_background_thread,
|
||||||
|
bool all);
|
||||||
|
void arena_reset(tsd_t *tsd, arena_t *arena);
|
||||||
|
void arena_destroy(tsd_t *tsd, arena_t *arena);
|
||||||
|
void arena_tcache_fill_small(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache,
|
||||||
|
tcache_bin_t *tbin, szind_t binind, uint64_t prof_accumbytes);
|
||||||
|
void arena_alloc_junk_small(void *ptr, const arena_bin_info_t *bin_info,
|
||||||
|
bool zero);
|
||||||
|
|
||||||
|
typedef void (arena_dalloc_junk_small_t)(void *, const arena_bin_info_t *);
|
||||||
|
extern arena_dalloc_junk_small_t *JET_MUTABLE arena_dalloc_junk_small;
|
||||||
|
|
||||||
|
void *arena_malloc_hard(tsdn_t *tsdn, arena_t *arena, size_t size,
|
||||||
|
szind_t ind, bool zero);
|
||||||
|
void *arena_palloc(tsdn_t *tsdn, arena_t *arena, size_t usize,
|
||||||
|
size_t alignment, bool zero, tcache_t *tcache);
|
||||||
|
void arena_prof_promote(tsdn_t *tsdn, const void *ptr, size_t usize);
|
||||||
|
void arena_dalloc_promoted(tsdn_t *tsdn, void *ptr, tcache_t *tcache,
|
||||||
|
bool slow_path);
|
||||||
|
void arena_dalloc_bin_junked_locked(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
extent_t *extent, void *ptr);
|
||||||
|
void arena_dalloc_small(tsdn_t *tsdn, void *ptr);
|
||||||
|
bool arena_ralloc_no_move(tsdn_t *tsdn, void *ptr, size_t oldsize, size_t size,
|
||||||
|
size_t extra, bool zero);
|
||||||
|
void *arena_ralloc(tsdn_t *tsdn, arena_t *arena, void *ptr, size_t oldsize,
|
||||||
|
size_t size, size_t alignment, bool zero, tcache_t *tcache);
|
||||||
|
dss_prec_t arena_dss_prec_get(arena_t *arena);
|
||||||
|
bool arena_dss_prec_set(arena_t *arena, dss_prec_t dss_prec);
|
||||||
|
ssize_t arena_dirty_decay_ms_default_get(void);
|
||||||
|
bool arena_dirty_decay_ms_default_set(ssize_t decay_ms);
|
||||||
|
ssize_t arena_muzzy_decay_ms_default_get(void);
|
||||||
|
bool arena_muzzy_decay_ms_default_set(ssize_t decay_ms);
|
||||||
|
unsigned arena_nthreads_get(arena_t *arena, bool internal);
|
||||||
|
void arena_nthreads_inc(arena_t *arena, bool internal);
|
||||||
|
void arena_nthreads_dec(arena_t *arena, bool internal);
|
||||||
|
size_t arena_extent_sn_next(arena_t *arena);
|
||||||
|
arena_t *arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks);
|
||||||
|
void arena_boot(void);
|
||||||
|
void arena_prefork0(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_prefork1(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_prefork2(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_prefork3(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_prefork4(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_prefork5(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_prefork6(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_postfork_parent(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
void arena_postfork_child(tsdn_t *tsdn, arena_t *arena);
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_ARENA_EXTERNS_H */
|
57
jemalloc/include/jemalloc/internal/arena_inlines_a.h
Normal file
57
jemalloc/include/jemalloc/internal/arena_inlines_a.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#ifndef JEMALLOC_INTERNAL_ARENA_INLINES_A_H
|
||||||
|
#define JEMALLOC_INTERNAL_ARENA_INLINES_A_H
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
arena_ind_get(const arena_t *arena) {
|
||||||
|
return base_ind_get(arena->base);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
arena_internal_add(arena_t *arena, size_t size) {
|
||||||
|
atomic_fetch_add_zu(&arena->stats.internal, size, ATOMIC_RELAXED);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
arena_internal_sub(arena_t *arena, size_t size) {
|
||||||
|
atomic_fetch_sub_zu(&arena->stats.internal, size, ATOMIC_RELAXED);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t
|
||||||
|
arena_internal_get(arena_t *arena) {
|
||||||
|
return atomic_load_zu(&arena->stats.internal, ATOMIC_RELAXED);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
arena_prof_accum(tsdn_t *tsdn, arena_t *arena, uint64_t accumbytes) {
|
||||||
|
cassert(config_prof);
|
||||||
|
|
||||||
|
if (likely(prof_interval == 0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prof_accum_add(tsdn, &arena->prof_accum, accumbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
percpu_arena_update(tsd_t *tsd, unsigned cpu) {
|
||||||
|
assert(have_percpu_arena);
|
||||||
|
arena_t *oldarena = tsd_arena_get(tsd);
|
||||||
|
assert(oldarena != NULL);
|
||||||
|
unsigned oldind = arena_ind_get(oldarena);
|
||||||
|
|
||||||
|
if (oldind != cpu) {
|
||||||
|
unsigned newind = cpu;
|
||||||
|
arena_t *newarena = arena_get(tsd_tsdn(tsd), newind, true);
|
||||||
|
assert(newarena != NULL);
|
||||||
|
|
||||||
|
/* Set new arena/tcache associations. */
|
||||||
|
arena_migrate(tsd, oldind, newind);
|
||||||
|
tcache_t *tcache = tcache_get(tsd);
|
||||||
|
if (tcache != NULL) {
|
||||||
|
tcache_arena_reassociate(tsd_tsdn(tsd), tcache,
|
||||||
|
newarena);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_ARENA_INLINES_A_H */
|
361
jemalloc/include/jemalloc/internal/arena_inlines_b.h
Normal file
361
jemalloc/include/jemalloc/internal/arena_inlines_b.h
Normal file
@ -0,0 +1,361 @@
|
|||||||
|
#ifndef JEMALLOC_INTERNAL_ARENA_INLINES_B_H
|
||||||
|
#define JEMALLOC_INTERNAL_ARENA_INLINES_B_H
|
||||||
|
|
||||||
|
#include "jemalloc/internal/jemalloc_internal_types.h"
|
||||||
|
#include "jemalloc/internal/mutex.h"
|
||||||
|
#include "jemalloc/internal/rtree.h"
|
||||||
|
#include "jemalloc/internal/size_classes.h"
|
||||||
|
#include "jemalloc/internal/sz.h"
|
||||||
|
#include "jemalloc/internal/ticker.h"
|
||||||
|
|
||||||
|
static inline szind_t
|
||||||
|
arena_bin_index(arena_t *arena, arena_bin_t *bin) {
|
||||||
|
szind_t binind = (szind_t)(bin - arena->bins);
|
||||||
|
assert(binind < NBINS);
|
||||||
|
return binind;
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE prof_tctx_t *
|
||||||
|
arena_prof_tctx_get(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx) {
|
||||||
|
cassert(config_prof);
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
/* Static check. */
|
||||||
|
if (alloc_ctx == NULL) {
|
||||||
|
const extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
if (unlikely(!extent_slab_get(extent))) {
|
||||||
|
return large_prof_tctx_get(tsdn, extent);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (unlikely(!alloc_ctx->slab)) {
|
||||||
|
return large_prof_tctx_get(tsdn, iealloc(tsdn, ptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (prof_tctx_t *)(uintptr_t)1U;
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
arena_prof_tctx_set(tsdn_t *tsdn, const void *ptr, size_t usize,
|
||||||
|
alloc_ctx_t *alloc_ctx, prof_tctx_t *tctx) {
|
||||||
|
cassert(config_prof);
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
/* Static check. */
|
||||||
|
if (alloc_ctx == NULL) {
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
if (unlikely(!extent_slab_get(extent))) {
|
||||||
|
large_prof_tctx_set(tsdn, extent, tctx);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (unlikely(!alloc_ctx->slab)) {
|
||||||
|
large_prof_tctx_set(tsdn, iealloc(tsdn, ptr), tctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
arena_prof_tctx_reset(tsdn_t *tsdn, const void *ptr, prof_tctx_t *tctx) {
|
||||||
|
cassert(config_prof);
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
assert(!extent_slab_get(extent));
|
||||||
|
|
||||||
|
large_prof_tctx_reset(tsdn, extent);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
arena_decay_ticks(tsdn_t *tsdn, arena_t *arena, unsigned nticks) {
|
||||||
|
tsd_t *tsd;
|
||||||
|
ticker_t *decay_ticker;
|
||||||
|
|
||||||
|
if (unlikely(tsdn_null(tsdn))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tsd = tsdn_tsd(tsdn);
|
||||||
|
decay_ticker = decay_ticker_get(tsd, arena_ind_get(arena));
|
||||||
|
if (unlikely(decay_ticker == NULL)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (unlikely(ticker_ticks(decay_ticker, nticks))) {
|
||||||
|
arena_decay(tsdn, arena, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
arena_decay_tick(tsdn_t *tsdn, arena_t *arena) {
|
||||||
|
malloc_mutex_assert_not_owner(tsdn, &arena->decay_dirty.mtx);
|
||||||
|
malloc_mutex_assert_not_owner(tsdn, &arena->decay_muzzy.mtx);
|
||||||
|
|
||||||
|
arena_decay_ticks(tsdn, arena, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void *
|
||||||
|
arena_malloc(tsdn_t *tsdn, arena_t *arena, size_t size, szind_t ind, bool zero,
|
||||||
|
tcache_t *tcache, bool slow_path) {
|
||||||
|
assert(!tsdn_null(tsdn) || tcache == NULL);
|
||||||
|
assert(size != 0);
|
||||||
|
|
||||||
|
if (likely(tcache != NULL)) {
|
||||||
|
if (likely(size <= SMALL_MAXCLASS)) {
|
||||||
|
return tcache_alloc_small(tsdn_tsd(tsdn), arena,
|
||||||
|
tcache, size, ind, zero, slow_path);
|
||||||
|
}
|
||||||
|
if (likely(size <= tcache_maxclass)) {
|
||||||
|
return tcache_alloc_large(tsdn_tsd(tsdn), arena,
|
||||||
|
tcache, size, ind, zero, slow_path);
|
||||||
|
}
|
||||||
|
/* (size > tcache_maxclass) case falls through. */
|
||||||
|
assert(size > tcache_maxclass);
|
||||||
|
}
|
||||||
|
|
||||||
|
return arena_malloc_hard(tsdn, arena, size, ind, zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE arena_t *
|
||||||
|
arena_aalloc(tsdn_t *tsdn, const void *ptr) {
|
||||||
|
return extent_arena_get(iealloc(tsdn, ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE size_t
|
||||||
|
arena_salloc(tsdn_t *tsdn, const void *ptr) {
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
rtree_ctx_t rtree_ctx_fallback;
|
||||||
|
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
|
||||||
|
|
||||||
|
szind_t szind = rtree_szind_read(tsdn, &extents_rtree, rtree_ctx,
|
||||||
|
(uintptr_t)ptr, true);
|
||||||
|
assert(szind != NSIZES);
|
||||||
|
|
||||||
|
return sz_index2size(szind);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE size_t
|
||||||
|
arena_vsalloc(tsdn_t *tsdn, const void *ptr) {
|
||||||
|
/*
|
||||||
|
* Return 0 if ptr is not within an extent managed by jemalloc. This
|
||||||
|
* function has two extra costs relative to isalloc():
|
||||||
|
* - The rtree calls cannot claim to be dependent lookups, which induces
|
||||||
|
* rtree lookup load dependencies.
|
||||||
|
* - The lookup may fail, so there is an extra branch to check for
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtree_ctx_t rtree_ctx_fallback;
|
||||||
|
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
|
||||||
|
|
||||||
|
extent_t *extent;
|
||||||
|
szind_t szind;
|
||||||
|
if (rtree_extent_szind_read(tsdn, &extents_rtree, rtree_ctx,
|
||||||
|
(uintptr_t)ptr, false, &extent, &szind)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extent == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
assert(extent_state_get(extent) == extent_state_active);
|
||||||
|
/* Only slab members should be looked up via interior pointers. */
|
||||||
|
assert(extent_addr_get(extent) == ptr || extent_slab_get(extent));
|
||||||
|
|
||||||
|
assert(szind != NSIZES);
|
||||||
|
|
||||||
|
return sz_index2size(szind);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
arena_dalloc_no_tcache(tsdn_t *tsdn, void *ptr) {
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
rtree_ctx_t rtree_ctx_fallback;
|
||||||
|
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback);
|
||||||
|
|
||||||
|
szind_t szind;
|
||||||
|
bool slab;
|
||||||
|
rtree_szind_slab_read(tsdn, &extents_rtree, rtree_ctx, (uintptr_t)ptr,
|
||||||
|
true, &szind, &slab);
|
||||||
|
|
||||||
|
if (config_debug) {
|
||||||
|
extent_t *extent = rtree_extent_read(tsdn, &extents_rtree,
|
||||||
|
rtree_ctx, (uintptr_t)ptr, true);
|
||||||
|
assert(szind == extent_szind_get(extent));
|
||||||
|
assert(szind < NSIZES);
|
||||||
|
assert(slab == extent_slab_get(extent));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (likely(slab)) {
|
||||||
|
/* Small allocation. */
|
||||||
|
arena_dalloc_small(tsdn, ptr);
|
||||||
|
} else {
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
large_dalloc(tsdn, extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
arena_dalloc(tsdn_t *tsdn, void *ptr, tcache_t *tcache,
|
||||||
|
alloc_ctx_t *alloc_ctx, bool slow_path) {
|
||||||
|
assert(!tsdn_null(tsdn) || tcache == NULL);
|
||||||
|
assert(ptr != NULL);
|
||||||
|
|
||||||
|
if (unlikely(tcache == NULL)) {
|
||||||
|
arena_dalloc_no_tcache(tsdn, ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
szind_t szind;
|
||||||
|
bool slab;
|
||||||
|
rtree_ctx_t *rtree_ctx;
|
||||||
|
if (alloc_ctx != NULL) {
|
||||||
|
szind = alloc_ctx->szind;
|
||||||
|
slab = alloc_ctx->slab;
|
||||||
|
assert(szind != NSIZES);
|
||||||
|
} else {
|
||||||
|
rtree_ctx = tsd_rtree_ctx(tsdn_tsd(tsdn));
|
||||||
|
rtree_szind_slab_read(tsdn, &extents_rtree, rtree_ctx,
|
||||||
|
(uintptr_t)ptr, true, &szind, &slab);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config_debug) {
|
||||||
|
rtree_ctx = tsd_rtree_ctx(tsdn_tsd(tsdn));
|
||||||
|
extent_t *extent = rtree_extent_read(tsdn, &extents_rtree,
|
||||||
|
rtree_ctx, (uintptr_t)ptr, true);
|
||||||
|
assert(szind == extent_szind_get(extent));
|
||||||
|
assert(szind < NSIZES);
|
||||||
|
assert(slab == extent_slab_get(extent));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (likely(slab)) {
|
||||||
|
/* Small allocation. */
|
||||||
|
tcache_dalloc_small(tsdn_tsd(tsdn), tcache, ptr, szind,
|
||||||
|
slow_path);
|
||||||
|
} else {
|
||||||
|
if (szind < nhbins) {
|
||||||
|
if (config_prof && unlikely(szind < NBINS)) {
|
||||||
|
arena_dalloc_promoted(tsdn, ptr, tcache,
|
||||||
|
slow_path);
|
||||||
|
} else {
|
||||||
|
tcache_dalloc_large(tsdn_tsd(tsdn), tcache, ptr,
|
||||||
|
szind, slow_path);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
large_dalloc(tsdn, extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
arena_sdalloc_no_tcache(tsdn_t *tsdn, void *ptr, size_t size) {
|
||||||
|
assert(ptr != NULL);
|
||||||
|
assert(size <= LARGE_MAXCLASS);
|
||||||
|
|
||||||
|
szind_t szind;
|
||||||
|
bool slab;
|
||||||
|
if (!config_prof || !opt_prof) {
|
||||||
|
/*
|
||||||
|
* There is no risk of being confused by a promoted sampled
|
||||||
|
* object, so base szind and slab on the given size.
|
||||||
|
*/
|
||||||
|
szind = sz_size2index(size);
|
||||||
|
slab = (szind < NBINS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((config_prof && opt_prof) || config_debug) {
|
||||||
|
rtree_ctx_t rtree_ctx_fallback;
|
||||||
|
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn,
|
||||||
|
&rtree_ctx_fallback);
|
||||||
|
|
||||||
|
rtree_szind_slab_read(tsdn, &extents_rtree, rtree_ctx,
|
||||||
|
(uintptr_t)ptr, true, &szind, &slab);
|
||||||
|
|
||||||
|
assert(szind == sz_size2index(size));
|
||||||
|
assert((config_prof && opt_prof) || slab == (szind < NBINS));
|
||||||
|
|
||||||
|
if (config_debug) {
|
||||||
|
extent_t *extent = rtree_extent_read(tsdn,
|
||||||
|
&extents_rtree, rtree_ctx, (uintptr_t)ptr, true);
|
||||||
|
assert(szind == extent_szind_get(extent));
|
||||||
|
assert(slab == extent_slab_get(extent));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (likely(slab)) {
|
||||||
|
/* Small allocation. */
|
||||||
|
arena_dalloc_small(tsdn, ptr);
|
||||||
|
} else {
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
large_dalloc(tsdn, extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
arena_sdalloc(tsdn_t *tsdn, void *ptr, size_t size, tcache_t *tcache,
|
||||||
|
alloc_ctx_t *alloc_ctx, bool slow_path) {
|
||||||
|
assert(!tsdn_null(tsdn) || tcache == NULL);
|
||||||
|
assert(ptr != NULL);
|
||||||
|
assert(size <= LARGE_MAXCLASS);
|
||||||
|
|
||||||
|
if (unlikely(tcache == NULL)) {
|
||||||
|
arena_sdalloc_no_tcache(tsdn, ptr, size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
szind_t szind;
|
||||||
|
bool slab;
|
||||||
|
UNUSED alloc_ctx_t local_ctx;
|
||||||
|
if (config_prof && opt_prof) {
|
||||||
|
if (alloc_ctx == NULL) {
|
||||||
|
/* Uncommon case and should be a static check. */
|
||||||
|
rtree_ctx_t rtree_ctx_fallback;
|
||||||
|
rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn,
|
||||||
|
&rtree_ctx_fallback);
|
||||||
|
rtree_szind_slab_read(tsdn, &extents_rtree, rtree_ctx,
|
||||||
|
(uintptr_t)ptr, true, &local_ctx.szind,
|
||||||
|
&local_ctx.slab);
|
||||||
|
assert(local_ctx.szind == sz_size2index(size));
|
||||||
|
alloc_ctx = &local_ctx;
|
||||||
|
}
|
||||||
|
slab = alloc_ctx->slab;
|
||||||
|
szind = alloc_ctx->szind;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* There is no risk of being confused by a promoted sampled
|
||||||
|
* object, so base szind and slab on the given size.
|
||||||
|
*/
|
||||||
|
szind = sz_size2index(size);
|
||||||
|
slab = (szind < NBINS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config_debug) {
|
||||||
|
rtree_ctx_t *rtree_ctx = tsd_rtree_ctx(tsdn_tsd(tsdn));
|
||||||
|
rtree_szind_slab_read(tsdn, &extents_rtree, rtree_ctx,
|
||||||
|
(uintptr_t)ptr, true, &szind, &slab);
|
||||||
|
extent_t *extent = rtree_extent_read(tsdn,
|
||||||
|
&extents_rtree, rtree_ctx, (uintptr_t)ptr, true);
|
||||||
|
assert(szind == extent_szind_get(extent));
|
||||||
|
assert(slab == extent_slab_get(extent));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (likely(slab)) {
|
||||||
|
/* Small allocation. */
|
||||||
|
tcache_dalloc_small(tsdn_tsd(tsdn), tcache, ptr, szind,
|
||||||
|
slow_path);
|
||||||
|
} else {
|
||||||
|
if (szind < nhbins) {
|
||||||
|
if (config_prof && unlikely(szind < NBINS)) {
|
||||||
|
arena_dalloc_promoted(tsdn, ptr, tcache,
|
||||||
|
slow_path);
|
||||||
|
} else {
|
||||||
|
tcache_dalloc_large(tsdn_tsd(tsdn),
|
||||||
|
tcache, ptr, szind, slow_path);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
large_dalloc(tsdn, extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_ARENA_INLINES_B_H */
|
11
jemalloc/include/jemalloc/internal/arena_structs_a.h
Normal file
11
jemalloc/include/jemalloc/internal/arena_structs_a.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef JEMALLOC_INTERNAL_ARENA_STRUCTS_A_H
|
||||||
|
#define JEMALLOC_INTERNAL_ARENA_STRUCTS_A_H
|
||||||
|
|
||||||
|
#include "jemalloc/internal/bitmap.h"
|
||||||
|
|
||||||
|
struct arena_slab_data_s {
|
||||||
|
/* Per region allocated/deallocated bitmap. */
|
||||||
|
bitmap_t bitmap[BITMAP_GROUPS_MAX];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_ARENA_STRUCTS_A_H */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user