libstdc++: Fix memory leak in PSTL TBB backend [PR117276]

Backport of upstream patch:
https://github.com/uxlfoundation/oneDPL/pull/1589

libstdc++-v3/ChangeLog:

	PR libstdc++/117276
	* include/pstl/parallel_backend_tbb.h (__func_task::finalize):
	Make deallocation unconditional.
This commit is contained in:
Jonathan Wakely 2025-09-12 12:49:39 +01:00 committed by Jonathan Wakely
parent f534db54a6
commit d8f1655a78
No known key found for this signature in database
1 changed files with 9 additions and 3 deletions

View File

@ -521,7 +521,7 @@ class __root_task
friend class __func_task<_Func>;
};
#else // TBB_INTERFACE_VERSION <= 12000
#else // TBB_INTERFACE_VERSION > 12000
class __task : public tbb::detail::d1::task
{
protected:
@ -656,10 +656,16 @@ class __func_task : public __task
_PSTL_ASSERT(__parent != nullptr);
_PSTL_ASSERT(__parent->_M_refcount.load(std::memory_order_relaxed) > 0);
if (--__parent->_M_refcount == 0)
auto __refcount = --__parent->_M_refcount;
// Placing the deallocation after the refcount decrement allows another thread to proceed with tree
// folding concurrently with this task cleanup.
__alloc.deallocate(this, *__ed);
if (__refcount == 0)
{
_PSTL_ASSERT(__next == nullptr);
__alloc.deallocate(this, *__ed);
return __parent;
}