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-04-25 14:50:27 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-04-25 14:50:27 +0300
commit42fd1b9abe90c301632c9279fd29ec6650243430 (patch)
tree21f21a6e430d2c9043a84db99bd2348deeff7ad5 /intern/cycles
parent34f4c31692fc35b45fc15b9973bf147079d7e35d (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')
-rw-r--r--intern/cycles/util/util_stack_allocator.h13
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];
};