summaryrefslogtreecommitdiff
path: root/core/templates/paged_array.h
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2020-12-26 21:33:37 -0300
committerGitHub <noreply@github.com>2020-12-26 21:33:37 -0300
commit3dc52c2b6a52bc1fe7e9ad29f435ab63cc013a5a (patch)
tree1f5b1bf898f3137875f5a160c4588f6ded764651 /core/templates/paged_array.h
parentfb16b1e39bb9ff7fe2e551bbf6659e8d502f84a7 (diff)
parent548524152ebb96a176b57266514003ad2e348f6e (diff)
Merge pull request #44699 from reduz/cache-thread-friendly-culling
Rewrite culling to be more cache/thread friendly.
Diffstat (limited to 'core/templates/paged_array.h')
-rw-r--r--core/templates/paged_array.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/core/templates/paged_array.h b/core/templates/paged_array.h
index aaf3893715..9bbaac35c4 100644
--- a/core/templates/paged_array.h
+++ b/core/templates/paged_array.h
@@ -206,6 +206,24 @@ public:
count++;
}
+ _FORCE_INLINE_ void pop_back() {
+ ERR_FAIL_COND(count == 0);
+
+ if (!__has_trivial_destructor(T)) {
+ uint32_t page = (count - 1) >> page_size_shift;
+ uint32_t offset = (count - 1) & page_size_mask;
+ page_data[page][offset].~T();
+ }
+
+ uint32_t remainder = count & page_size_mask;
+ if (unlikely(remainder == 1)) {
+ // one element remained, so page must be freed.
+ uint32_t last_page = _get_pages_in_use() - 1;
+ page_pool->free_page(page_ids[last_page]);
+ }
+ count--;
+ }
+
void clear() {
//destruct if needed
if (!__has_trivial_destructor(T)) {