Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-03-30 11:54:35 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-03-31 11:06:21 +0300
commitffe59c54cb2aa8c45216f37943e7b4f0c4d9d540 (patch)
tree0e972f518392d08238a0752c2db0d9d488d4adcd /intern/cycles/util
parent65b375e798f9b6f48acf1e1bd14801d357a5b9da (diff)
Cycles: Add STL allocator which uses stack memory
At this point we might want to rename allocator files to util_allocator_foo.c so the stay nicely grouped in the folder.
Diffstat (limited to 'intern/cycles/util')
-rw-r--r--intern/cycles/util/CMakeLists.txt1
-rw-r--r--intern/cycles/util/util_stack_allocator.h152
2 files changed, 153 insertions, 0 deletions
diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt
index d0f634b42e1..d07c7b143fb 100644
--- a/intern/cycles/util/CMakeLists.txt
+++ b/intern/cycles/util/CMakeLists.txt
@@ -68,6 +68,7 @@ set(SRC_HEADERS
util_sseb.h
util_ssef.h
util_ssei.h
+ util_stack_allocator.h
util_stats.h
util_string.h
util_system.h
diff --git a/intern/cycles/util/util_stack_allocator.h b/intern/cycles/util/util_stack_allocator.h
new file mode 100644
index 00000000000..85edd8061ee
--- /dev/null
+++ b/intern/cycles/util/util_stack_allocator.h
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2011-2016 Blender Foundation
+ *
+ * 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.
+ */
+
+#ifndef __UTIL_STACK_ALLOCATOR_H__
+#define __UTIL_STACK_ALLOCATOR_H__
+
+#include <cstddef>
+#include <memory>
+
+#include "util_debug.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Stack allocator for the use with STL. */
+template <int SIZE, typename T>
+class ccl_try_align(16) StackAllocator {
+public:
+ 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;
+
+ /* Allocator construction/destruction. */
+
+ StackAllocator()
+ : pointer_(0) {}
+
+ StackAllocator(const StackAllocator&)
+ : pointer_(0) {}
+
+ template <class U>
+ StackAllocator(const StackAllocator<SIZE, U>&)
+ : pointer_(0) {}
+
+ /* Memory allocation/deallocation. */
+
+ T *allocate(size_t n, const void *hint = 0)
+ {
+ (void)hint;
+ if(pointer_ + n >= SIZE) {
+ assert(!"Stack allocator overallocated");
+ /* NOTE: This is just a safety feature for the release builds, so
+ * we fallback to a less efficient allocation but preventing crash
+ * from happening.
+ */
+ return (T*)malloc(n * sizeof(T));
+ }
+ T *mem = &data_[pointer_];
+ pointer_ += n;
+ return mem;
+ }
+
+ void deallocate(T *p, size_t /*n*/)
+ {
+ if(p == NULL) {
+ return;
+ }
+ if(p < data_ || p >= data_ + SIZE) {
+ /* Again this is just a safety feature for the release builds. */
+ assert(!"Should never happen");
+ free(p);
+ return;
+ }
+ /* We don't support memory free for the stack allocator. */
+ }
+
+ /* Address of an reference. */
+
+ T *address(T& x) const
+ {
+ return &x;
+ }
+
+ const T *address(const T& x) const
+ {
+ return &x;
+ }
+
+ /* Object construction/destruction. */
+
+ void construct(T *p, const T& val)
+ {
+ new ((T *)p) T(val);
+ }
+
+ void destroy(T *p)
+ {
+ p->~T();
+ }
+
+ /* Maximum allocation size. */
+
+ size_t max_size() const
+ {
+ return size_t(-1);
+ }
+
+ /* Rebind to other ype of allocator. */
+
+ template <class U>
+ struct rebind {
+ typedef StackAllocator<SIZE, U> other;
+ };
+
+ /* Operators */
+
+ template <class U>
+ inline StackAllocator& operator=(const StackAllocator<SIZE, U>&)
+ {
+ return *this;
+ }
+
+ StackAllocator<SIZE, T>& operator=(const StackAllocator&)
+ {
+ return *this;
+ }
+
+ inline bool operator==(StackAllocator const& /*other*/) const
+ {
+ return true;
+ }
+
+ inline bool operator!=(StackAllocator const& other) const
+ {
+ return !operator==(other);
+ }
+
+private:
+ int pointer_;
+ T data_[SIZE];
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_GUARDED_ALLOCATOR_H__ */