diff options
author | Josh Blum | 2012-10-07 02:46:09 -0700 |
---|---|---|
committer | Josh Blum | 2012-10-07 02:46:09 -0700 |
commit | c69c2f9e891915e43963010e1baf34740b55f8c2 (patch) | |
tree | 14158408196d42ccb7716dc6e31b9338fb4f6c58 /lib/alloc_on_node.hpp | |
parent | 84d3b87dfedf273800ea7f579a0c9a5d5c80099a (diff) | |
download | sandhi-c69c2f9e891915e43963010e1baf34740b55f8c2.tar.gz sandhi-c69c2f9e891915e43963010e1baf34740b55f8c2.tar.bz2 sandhi-c69c2f9e891915e43963010e1baf34740b55f8c2.zip |
removed numanuma dependency, replaced with AllocOnNode header
We only needed numanuma for allocation, so replace it with this header
hopefully theron will have this in the future
Diffstat (limited to 'lib/alloc_on_node.hpp')
-rw-r--r-- | lib/alloc_on_node.hpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/alloc_on_node.hpp b/lib/alloc_on_node.hpp new file mode 100644 index 0000000..de58a0f --- /dev/null +++ b/lib/alloc_on_node.hpp @@ -0,0 +1,83 @@ +// +// Copyright 2012 Josh Blum +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +#ifndef INCLUDED_LIBGRAS_ALLOC_ON_NODE_HPP +#define INCLUDED_LIBGRAS_ALLOC_ON_NODE_HPP + +#include <Theron/Assert.h> +#include <Theron/Detail/Threading/Utils.h> + +//---------------------------------------------------------------------- +//-- a little cross platform numa allocator +//-- use the existing theron defines for convenience +//---------------------------------------------------------------------- +inline void *AllocOnNode(const long node, const size_t size) +{ + +#if THERON_NUMA + +#if THERON_WINDOWS + + #if _WIN32_WINNT >= 0x0600 + return VirtualAllocExNuma( + GetCurrentProcess(), + NULL, + size, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE, + node + ); + #else + return NULL; + #endif + +#elif THERON_GCC + + if ((numa_available() < 0)) + { + return NULL; + } + + return numa_alloc_onnode(size, node); + +#endif + +#endif // THERON_NUMA + + return NULL; +} + +//---------------------------------------------------------------------- +//-- free memory allocated by AllocOnNode -- needs mem and size +//---------------------------------------------------------------------- +inline void FreeOnNode(void *mem, const size_t size) +{ +#if THERON_NUMA + +#if THERON_WINDOWS + + VirtualFree(mem, size, MEM_RELEASE); + +#elif THERON_GCC + + numa_free(mem, size); + +#endif + +#endif // THERON_NUMA +} + +#endif /*INCLUDED_LIBGRAS_ALLOC_ON_NODE_HPP*/ |