summaryrefslogtreecommitdiff
path: root/lib/alloc_on_node.hpp
diff options
context:
space:
mode:
authorJosh Blum2012-10-07 02:46:09 -0700
committerJosh Blum2012-10-07 02:46:09 -0700
commitc69c2f9e891915e43963010e1baf34740b55f8c2 (patch)
tree14158408196d42ccb7716dc6e31b9338fb4f6c58 /lib/alloc_on_node.hpp
parent84d3b87dfedf273800ea7f579a0c9a5d5c80099a (diff)
downloadsandhi-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.hpp83
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*/