diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2019-10-22 19:46:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-11 12:04:42 +0100 |
commit | a60edae5060664b32fd24a3970b027171f358045 (patch) | |
tree | a4a451e56cee9b44df511c016fa024389204871c | |
parent | f3f446ac75ae586c2de43f6f42b57d08a04a7517 (diff) | |
parent | e38ae8d7e4407722e1b8d2b7caf49052f2f9174b (diff) |
Merge pull request #32950 from RandomShaper/fix_rid_alloc
Fix bugs in `RID_Alloc`
-rw-r--r-- | core/rid_owner.h | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/core/rid_owner.h b/core/rid_owner.h index 26807e9a5e..ece8c6211b 100644 --- a/core/rid_owner.h +++ b/core/rid_owner.h @@ -85,7 +85,7 @@ public: T *ptr = &chunks[free_chunk][free_element]; memnew_placement(ptr, T(p_value)); - uint32_t validator = (uint32_t)(_gen_id() % 0xFFFFFFFF); + uint32_t validator = (uint32_t)(_gen_id() & 0xFFFFFFFF); uint64_t id = validator; id <<= 32; id |= free_index; @@ -234,10 +234,17 @@ public: } void get_owned_list(List<RID> *p_owned) { - for (size_t i = 0; i < alloc_count; i++) { - uint64_t idx = free_list_chunks[i / elements_in_chunk][i % elements_in_chunk]; - uint64_t validator = validator_chunks[idx / elements_in_chunk][idx % elements_in_chunk]; - p_owned->push_back(_make_from_id((validator << 32) | idx)); + if (THREAD_SAFE) { + spin_lock.lock(); + } + for (size_t i = 0; i < max_alloc; i++) { + uint64_t validator = validator_chunks[i / elements_in_chunk][i % elements_in_chunk]; + if (validator != 0xFFFFFFFF) { + p_owned->push_back(_make_from_id((validator << 32) | i)); + } + } + if (THREAD_SAFE) { + spin_lock.unlock(); } } @@ -264,9 +271,11 @@ public: print_error("ERROR: " + itos(alloc_count) + " RID allocations of type '" + typeid(T).name() + "' were leaked at exit."); } - for (uint32_t i = 0; i < alloc_count; i++) { - uint64_t idx = free_list_chunks[i / elements_in_chunk][i % elements_in_chunk]; - chunks[idx / elements_in_chunk][idx % elements_in_chunk].~T(); + for (size_t i = 0; i < max_alloc; i++) { + uint64_t validator = validator_chunks[i / elements_in_chunk][i % elements_in_chunk]; + if (validator != 0xFFFFFFFF) { + chunks[i / elements_in_chunk][i % elements_in_chunk].~T(); + } } } |