diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-04-25 14:50:27 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-04-25 14:50:27 +0300 |
commit | 42fd1b9abe90c301632c9279fd29ec6650243430 (patch) | |
tree | 21f21a6e430d2c9043a84db99bd2348deeff7ad5 /intern/cycles/util/util_stack_allocator.h | |
parent | 34f4c31692fc35b45fc15b9973bf147079d7e35d (diff) |
Cycles: Fix issues with stack allocator in MSVC
Couple of issues here:
- Was a bug in heap memory allocation when run out
of allowed stack memory.
- Debug MSVC was failing because it uses separate
allocator for some sort of internal proxy thing,
which seems to be unable to be using stack memory
because allocator is being created in non-persistent
stack location.
Diffstat (limited to 'intern/cycles/util/util_stack_allocator.h')
-rw-r--r-- | intern/cycles/util/util_stack_allocator.h | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/intern/cycles/util/util_stack_allocator.h b/intern/cycles/util/util_stack_allocator.h index 1acd2b18bc7..d7aab5b250c 100644 --- a/intern/cycles/util/util_stack_allocator.h +++ b/intern/cycles/util/util_stack_allocator.h @@ -40,14 +40,17 @@ public: /* Allocator construction/destruction. */ StackAllocator() - : pointer_(0) {} + : pointer_(0), + use_stack_(true) {} StackAllocator(const StackAllocator&) - : pointer_(0) {} + : pointer_(0), + use_stack_(true) {} template <class U> StackAllocator(const StackAllocator<SIZE, U>&) - : pointer_(0) {} + : pointer_(0), + use_stack_(false) {} /* Memory allocation/deallocation. */ @@ -57,7 +60,7 @@ public: if(n == 0) { return NULL; } - if(pointer_ + n >= SIZE) { + if(pointer_ + n >= SIZE || use_stack_ == false) { size_t size = n * sizeof(T); util_guarded_mem_alloc(size); T *mem; @@ -69,6 +72,7 @@ public: if(mem == NULL) { throw std::bad_alloc(); } + return mem; } T *mem = &data_[pointer_]; pointer_ += n; @@ -157,6 +161,7 @@ public: private: int pointer_; + bool use_stack_; T data_[SIZE]; }; |