Commit: a84bc16220dfd662ceeb4f2f1419b1b38fc95e50
Author: Brecht Van Lommel
Date:   Fri May 20 10:56:10 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rBa84bc16220dfd662ceeb4f2f1419b1b38fc95e50

Fix T48472: issue in array refactor, causing performance regression in BVH 
build.

===================================================================

M       intern/cycles/util/util_vector.h

===================================================================

diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h
index a8a1c4c..8f833af 100644
--- a/intern/cycles/util/util_vector.h
+++ b/intern/cycles/util/util_vector.h
@@ -130,14 +130,8 @@ public:
        array& operator=(const array& from)
        {
                if(this != &from) {
-                       clear();
-
-                       if(from.datasize_ > 0) {
-                               data_ = mem_allocate(from.datasize_);
-                               memcpy(data_, from.data_, 
from.datasize_*sizeof(T));
-                               datasize_ = from.datasize_;
-                               capacity_ = datasize_;
-                       }
+                       resize(from.size());
+                       memcpy(data_, from.data_, datasize_*sizeof(T));
                }
 
                return *this;
@@ -145,12 +139,9 @@ public:
 
        array& operator=(const vector<T>& from)
        {
-               clear();
+               resize(from.size());
 
                if(from.size() > 0) {
-                       datasize_ = from.size();
-                       capacity_ = datasize_;
-                       data_ = mem_allocate(datasize_);
                        memcpy(data_, &from[0], datasize_*sizeof(T));
                }
 
@@ -164,42 +155,34 @@ public:
 
        bool operator==(const vector<T>& other)
        {
-               if(datasize_ != other.datasize_)
+               if(datasize_ != other.datasize_) {
                        return false;
+               }
 
                return memcmp(data_, other.data_, datasize_*sizeof(T)) == 0;
        }
 
-       void steal_data(array& from)
-       {
-               if(this != &from)
-               {
-                       clear();
-
-                       data_ = from.data_;
-                       datasize_ = from.datasize_;
-                       capacity_ = from.capacity_;
-
-                       from.data_ = NULL;
-                       from.datasize_ = 0;
-                       from.capacity_ = 0;
-               }
-       }
-
        T* resize(size_t newsize)
        {
                if(newsize == 0) {
                        clear();
                }
-               else if(newsize != capacity_) {
-                       T *newdata = mem_allocate(newsize);
-                       if(data_ != NULL) {
-                               memcpy(newdata, data_, ((datasize_ < newsize)? 
datasize_: newsize)*sizeof(T));
-                               mem_free(data_, capacity_);
+               else if(newsize != datasize_) {
+                       if(newsize > capacity_) {
+                               T *newdata = mem_allocate(newsize);
+                               if(newdata == NULL) {
+                                       /* Allocation failed, likely out of 
memory. */
+                                       clear();
+                                       return NULL;
+                               }
+                               else if(data_ != NULL) {
+                                       memcpy(newdata, data_, ((datasize_ < 
newsize)? datasize_: newsize)*sizeof(T));
+                                       mem_free(data_, capacity_);
+                               }
+                               data_ = newdata;
+                               capacity_ = newsize;
                        }
-                       data_ = newdata;
                        datasize_ = newsize;
-                       capacity_ = newsize;
                }
                return data_;
        }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to