Commit 15884e47 authored by Victor Zverovich's avatar Victor Zverovich Committed by Facebook Github Bot

Call onRecycle after element is marked as deallocated in IndexedMemPool

Summary: Make `IndexedMemPool` call `Traits::onRecycle` on the element just before it is marked as deallocated. This mirrors the allocation behavior implemented in D5177462 and simplifies preventing access to recycled elements (the client just needs to check `isAllocated` before accessing the element).

Reviewed By: nbronson

Differential Revision: D5275283

fbshipit-source-id: 58365b5b7b32b07fa56529c476078f241fc20811
parent 51e345da
...@@ -259,7 +259,6 @@ struct IndexedMemPool : boost::noncopyable { ...@@ -259,7 +259,6 @@ struct IndexedMemPool : boost::noncopyable {
/// Gives up ownership previously granted by alloc() /// Gives up ownership previously granted by alloc()
void recycleIndex(uint32_t idx) { void recycleIndex(uint32_t idx) {
assert(isAllocated(idx)); assert(isAllocated(idx));
Traits::onRecycle(&slot(idx).elem);
localPush(localHead(), idx); localPush(localHead(), idx);
} }
...@@ -422,7 +421,8 @@ struct IndexedMemPool : boost::noncopyable { ...@@ -422,7 +421,8 @@ struct IndexedMemPool : boost::noncopyable {
Slot& s = slot(idx); Slot& s = slot(idx);
TaggedPtr h = head.load(std::memory_order_acquire); TaggedPtr h = head.load(std::memory_order_acquire);
while (true) { while (true) {
s.localNext.store(h.idx, std::memory_order_relaxed); s.localNext.store(h.idx, std::memory_order_release);
Traits::onRecycle(&slot(idx).elem);
if (h.size() == LocalListLimit) { if (h.size() == LocalListLimit) {
// push will overflow local list, steal it instead // push will overflow local list, steal it instead
......
...@@ -357,7 +357,7 @@ void testTraits(TraitsTestPool& pool) { ...@@ -357,7 +357,7 @@ void testTraits(TraitsTestPool& pool) {
elem = nullptr; elem = nullptr;
EXPECT_CALL(traits, onRecycle(_)).WillOnce(Invoke([&](std::string* s) { EXPECT_CALL(traits, onRecycle(_)).WillOnce(Invoke([&](std::string* s) {
EXPECT_TRUE(pool.isAllocated(pool.locateElem(s))); EXPECT_FALSE(pool.isAllocated(pool.locateElem(s)));
elem = s; elem = s;
})); }));
pool.recycleIndex(pool.locateElem(ptr)); pool.recycleIndex(pool.locateElem(ptr));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment