mirror of
https://github.com/RGBCube/serenity
synced 2025-07-28 09:07:44 +00:00
Ext2FS: Free Ext2FSInodes when the last user releases them.
The inode cache was keeping these alive forever. Added a cute little magic trick to Retainable that calls T::one_retain_left() when the retain count is decremented to 1.
This commit is contained in:
parent
42d9f18cae
commit
741349502f
4 changed files with 26 additions and 1 deletions
|
@ -17,6 +17,18 @@ constexpr auto call_will_be_destroyed_if_present(...) -> FalseType
|
|||
return { };
|
||||
}
|
||||
|
||||
template<class T>
|
||||
constexpr auto call_one_retain_left_if_present(T* object) -> decltype(object->one_retain_left(), TrueType { })
|
||||
{
|
||||
object->one_retain_left();
|
||||
return { };
|
||||
}
|
||||
|
||||
constexpr auto call_one_retain_left_if_present(...) -> FalseType
|
||||
{
|
||||
return { };
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
class Retainable {
|
||||
public:
|
||||
|
@ -29,9 +41,12 @@ public:
|
|||
void release()
|
||||
{
|
||||
ASSERT(m_retain_count);
|
||||
if (!--m_retain_count) {
|
||||
--m_retain_count;
|
||||
if (m_retain_count == 0) {
|
||||
call_will_be_destroyed_if_present(static_cast<T*>(this));
|
||||
delete static_cast<T*>(this);
|
||||
} else if (m_retain_count == 1) {
|
||||
call_one_retain_left_if_present(static_cast<T*>(this));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue