sfx2/source/control/itemdel.cxx | 47 +++++++++++----------------------------- 1 file changed, 13 insertions(+), 34 deletions(-)
New commits: commit 57145acf9ec47c23e307b7a5c0029d21d937cc35 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Tue Sep 13 22:10:15 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Sep 14 08:37:12 2022 +0200 simplify SfxItemDisruptor_Impl, just use Application::PostUserEvent Change-Id: I365fb5182bff59ace3eb0ad25222d2ee53814f72 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139882 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sfx2/source/control/itemdel.cxx b/sfx2/source/control/itemdel.cxx index 2b8e7db73fc6..8182595acea2 100644 --- a/sfx2/source/control/itemdel.cxx +++ b/sfx2/source/control/itemdel.cxx @@ -22,56 +22,35 @@ #include <itemdel.hxx> #include <svl/poolitem.hxx> #include <vcl/idle.hxx> +#include <vcl/svapp.hxx> #include <tools/debug.hxx> class SfxItemDisruptor_Impl { - std::unique_ptr<SfxPoolItem> pItem; - Idle m_Idle; - -private: - DECL_LINK(Delete, Timer*, void); - public: - explicit SfxItemDisruptor_Impl(std::unique_ptr<SfxPoolItem> pItemToDesrupt); - void LaunchDeleteOnIdle(); - ~SfxItemDisruptor_Impl(); - SfxItemDisruptor_Impl(const SfxItemDisruptor_Impl&) = delete; - SfxItemDisruptor_Impl& operator=(const SfxItemDisruptor_Impl&) = delete; + static void DeleteItemOnIdle(std::unique_ptr<SfxPoolItem> pItem) + { + pItem->SetKind(SfxItemKind::DeleteOnIdle); + Application::PostUserEvent(LINK(nullptr, SfxItemDisruptor_Impl, Delete), pItem.release()); + // coverity[leaked_storage] - pDesruptor takes care of its own destruction at idle time + } + + DECL_STATIC_LINK(SfxItemDisruptor_Impl, Delete, void*, void); }; -SfxItemDisruptor_Impl::SfxItemDisruptor_Impl(std::unique_ptr<SfxPoolItem> pItemToDisrupt) - : pItem(std::move(pItemToDisrupt)) - , m_Idle("sfx::SfxItemDisruptor_Impl m_Idle") -{ - m_Idle.SetInvokeHandler(LINK(this, SfxItemDisruptor_Impl, Delete)); - m_Idle.SetPriority(TaskPriority::DEFAULT_IDLE); - - DBG_ASSERT(0 == pItem->GetRefCount(), "disrupting pooled item"); - pItem->SetKind(SfxItemKind::DeleteOnIdle); -} - -void SfxItemDisruptor_Impl::LaunchDeleteOnIdle() { m_Idle.Start(); } - -SfxItemDisruptor_Impl::~SfxItemDisruptor_Impl() +IMPL_STATIC_LINK(SfxItemDisruptor_Impl, Delete, void*, p, void) { - m_Idle.Stop(); - + SfxPoolItem* pItem = static_cast<SfxPoolItem*>(p); // reset RefCount (was set to SFX_ITEMS_SPECIAL before!) pItem->SetRefCount(0); - - pItem.reset(); + delete pItem; } -IMPL_LINK_NOARG(SfxItemDisruptor_Impl, Delete, Timer*, void) { delete this; } - void DeleteItemOnIdle(std::unique_ptr<SfxPoolItem> pItem) { DBG_ASSERT(0 == pItem->GetRefCount(), "deleting item in use"); - SfxItemDisruptor_Impl* pDesruptor = new SfxItemDisruptor_Impl(std::move(pItem)); - pDesruptor->LaunchDeleteOnIdle(); - // coverity[leaked_storage] - pDesruptor takes care of its own destruction at idle time + SfxItemDisruptor_Impl::DeleteItemOnIdle(std::move(pItem)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */