[Bf-blender-cvs] [d64acada22e] temp-chunk-list: progress

Jacques Lucke noreply at git.blender.org
Sat Sep 10 13:27:16 CEST 2022


Commit: d64acada22e2bbdd3aa6057acdc83ae56f7da926
Author: Jacques Lucke
Date:   Sat Sep 10 12:53:01 2022 +0200
Branches: temp-chunk-list
https://developer.blender.org/rBd64acada22e2bbdd3aa6057acdc83ae56f7da926

progress

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

M	source/blender/blenlib/BLI_chunk_list.hh

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

diff --git a/source/blender/blenlib/BLI_chunk_list.hh b/source/blender/blenlib/BLI_chunk_list.hh
index 5e72188da7d..321bb4c7d0a 100644
--- a/source/blender/blenlib/BLI_chunk_list.hh
+++ b/source/blender/blenlib/BLI_chunk_list.hh
@@ -58,6 +58,7 @@ class ChunkList {
   using RawChunk = chunk_list_detail::RawChunk<T>;
   using AllocInfo = chunk_list_detail::AllocInfo<T>;
 
+  T *active_begin_;
   T *active_end_;
   T *active_capacity_end_;
   AllocInfo *alloc_info_ = nullptr;
@@ -67,7 +68,8 @@ class ChunkList {
  public:
   ChunkList(Allocator allocator = {}) noexcept : allocator_(allocator)
   {
-    active_end_ = inline_buffer_;
+    active_begin_ = inline_buffer_;
+    active_end_ = active_begin_;
     active_capacity_end_ = active_end_ + InlineBufferCapacity;
   }
 
@@ -260,19 +262,30 @@ class ChunkList {
     active_end_--;
     std::destroy_at(active_end_);
 
+    if (active_end_ > active_begin_) {
+      return value;
+    }
     if (alloc_info_ == nullptr) {
       return value;
     }
-    RawChunk &active_chunk = alloc_info_->raw_chunks[alloc_info_->active_chunk];
-    if (active_end_ > active_chunk.begin) {
+    if (alloc_info_->active_chunk == 0) {
       return value;
     }
-    while (alloc_info_->active_chunk > 0) {
-      this->activate_previous_chunk();
-      if (active_end_ > alloc_info_->raw_chunks[alloc_info_->active_chunk].begin) {
+    RawChunk &old_chunk = alloc_info_->raw_chunks[alloc_info_->active_chunk];
+    old_chunk.end_if_inactive = active_end_;
+    int new_active = alloc_info_->active_chunk - 1;
+    while (new_active >= 0) {
+      RawChunk &chunk = alloc_info_->raw_chunks[new_active];
+      if (chunk.begin < chunk.end_if_inactive) {
         break;
       }
+      new_active--;
     }
+    RawChunk &new_chunk = alloc_info_->raw_chunks[new_active];
+    alloc_info_->active_chunk = new_active;
+    active_begin_ = new_chunk.begin;
+    active_end_ = new_chunk.end_if_inactive;
+    active_capacity_end_ = new_chunk.capacity_end;
     return value;
   }
 
@@ -360,20 +373,6 @@ class ChunkList {
     }
   }
 
-  void activate_previous_chunk()
-  {
-    BLI_assert(alloc_info_ != nullptr);
-    BLI_assert(alloc_info_->active_chunk > 0);
-    RawChunk &old_active_chunk = alloc_info_->raw_chunks[alloc_info_->active_chunk];
-    BLI_assert(active_capacity_end_ == old_active_chunk.capacity_end);
-    BLI_assert(active_end_ == old_active_chunk.begin);
-    old_active_chunk.end_if_inactive = active_end_;
-    alloc_info_->active_chunk--;
-    RawChunk &new_active_chunk = alloc_info_->raw_chunks[alloc_info_->active_chunk];
-    active_capacity_end_ = new_active_chunk.capacity_end;
-    active_end_ = new_active_chunk.end_if_inactive;
-  }
-
   void activate_next_chunk()
   {
     if (alloc_info_ != nullptr) {
@@ -391,6 +390,7 @@ class ChunkList {
       alloc_info_->active_chunk = 1;
     }
     RawChunk &new_active_chunk = alloc_info_->raw_chunks[alloc_info_->active_chunk];
+    active_begin_ = new_active_chunk.begin;
     active_end_ = new_active_chunk.end_if_inactive;
     active_capacity_end_ = new_active_chunk.capacity_end;
   }



More information about the Bf-blender-cvs mailing list