Commit d7e9357c authored by Dan Melnic's avatar Dan Melnic Committed by Facebook Github Bot

Change SharedInfoObserverEntryBase::beforeFreeExtBuffer to...

Change SharedInfoObserverEntryBase::beforeFreeExtBuffer to SharedInfoObserverEntryBase::afterFreeExtBuffer

Summary: Change SharedInfoObserverEntryBase::beforeFreeExtBuffer to SharedInfoObserverEntryBase::afterFreeExtBuffer

Reviewed By: yfeldblum

Differential Revision: D15687084

fbshipit-source-id: 8f77a123f1bdc0e0ee7391dee7da47d9b9addc6d
parent 873fd33e
...@@ -951,23 +951,28 @@ void IOBuf::freeExtBuffer() noexcept { ...@@ -951,23 +951,28 @@ void IOBuf::freeExtBuffer() noexcept {
SharedInfo* info = sharedInfo(); SharedInfo* info = sharedInfo();
DCHECK(info); DCHECK(info);
if (info->observerListHead) { // save the observerListHead
// since the SharedInfo can be freed
auto* observerListHead = info->observerListHead;
info->observerListHead = nullptr;
if (info->freeFn) {
info->freeFn(buf_, info->userData);
} else {
free(buf_);
}
if (observerListHead) {
// break the chain // break the chain
info->observerListHead->prev->next = nullptr; observerListHead->prev->next = nullptr;
auto* entry = info->observerListHead; auto* entry = observerListHead;
while (entry) { while (entry) {
auto* tmp = entry->next; auto* tmp = entry->next;
entry->beforeFreeExtBuffer(); entry->afterFreeExtBuffer();
delete entry; delete entry;
entry = tmp; entry = tmp;
} }
} }
if (info->freeFn) {
info->freeFn(buf_, info->userData);
} else {
free(buf_);
}
} }
void IOBuf::allocExtBuffer( void IOBuf::allocExtBuffer(
......
...@@ -1417,7 +1417,7 @@ class IOBuf { ...@@ -1417,7 +1417,7 @@ class IOBuf {
virtual ~SharedInfoObserverEntryBase() = default; virtual ~SharedInfoObserverEntryBase() = default;
virtual void beforeFreeExtBuffer() const noexcept = 0; virtual void afterFreeExtBuffer() const noexcept = 0;
}; };
template <typename Observer> template <typename Observer>
...@@ -1428,8 +1428,8 @@ class IOBuf { ...@@ -1428,8 +1428,8 @@ class IOBuf {
noexcept(Observer(std::forward<Observer>(obs)))) noexcept(Observer(std::forward<Observer>(obs))))
: observer(std::forward<Observer>(obs)) {} : observer(std::forward<Observer>(obs)) {}
void beforeFreeExtBuffer() const noexcept final { void afterFreeExtBuffer() const noexcept final {
observer.beforeFreeExtBuffer(); observer.afterFreeExtBuffer();
} }
}; };
......
...@@ -1610,7 +1610,7 @@ TEST(IOBuf, FreeFn) { ...@@ -1610,7 +1610,7 @@ TEST(IOBuf, FreeFn) {
public: public:
using Func = std::function<void()>; using Func = std::function<void()>;
explicit IOBufFreeObserver(Func&& func) : func_(std::move(func)) {} explicit IOBufFreeObserver(Func&& func) : func_(std::move(func)) {}
void beforeFreeExtBuffer() const noexcept { void afterFreeExtBuffer() const noexcept {
func_(); func_();
} }
......
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