toolkit/source/awt/asynccallback.cxx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
New commits: commit 4c15b15a2018c3b8afc6d78fd7ff51beb3fc940e Author: Noel Grandin <[email protected]> AuthorDate: Sat Jun 14 17:42:21 2025 +0200 Commit: Noel Grandin <[email protected]> CommitDate: Sun Jun 15 13:43:39 2025 +0200 make AsyncCallback a little safer (1) remove the callback if the object destructs. (2) assert if addCallback() is not going to do anything, so we dont get subtle failure modes Change-Id: Ibc4a8634c237858eb6add5e1db8ac1ca982590f2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186510 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> diff --git a/toolkit/source/awt/asynccallback.cxx b/toolkit/source/awt/asynccallback.cxx index 4d5e07e47bc1..80c1ea73d3da 100644 --- a/toolkit/source/awt/asynccallback.cxx +++ b/toolkit/source/awt/asynccallback.cxx @@ -59,9 +59,15 @@ private: css::uno::Any aData; }; - DECL_STATIC_LINK( AsyncCallback, Notify_Impl, void*, void ); + DECL_LINK( Notify_Impl, void*, void ); - virtual ~AsyncCallback() override {} + virtual ~AsyncCallback() override + { + if (mpCallbackId) + Application::RemoveUserEvent(mpCallbackId); + } + + ImplSVEvent* mpCallbackId { nullptr }; }; // com.sun.star.uno.XServiceInfo: @@ -87,13 +93,17 @@ void SAL_CALL AsyncCallback::addCallback(const css::uno::Reference< css::awt::XC { // NOTE: We don't need SolarMutexGuard here as Application::PostUserEvent is thread-safe CallbackData* pCallbackData = new CallbackData( xCallback, aData ); - Application::PostUserEvent( LINK( this, AsyncCallback, Notify_Impl ), pCallbackData ); + mpCallbackId = Application::PostUserEvent( LINK( this, AsyncCallback, Notify_Impl ), pCallbackData ); } + else + assert(false && "addCallback will not succeed"); } // private asynchronous link to call reference to the callback object -IMPL_STATIC_LINK( AsyncCallback, Notify_Impl, void*, p, void ) +IMPL_LINK( AsyncCallback, Notify_Impl, void*, p, void ) { + mpCallbackId = nullptr; + CallbackData* pCallbackData = static_cast<CallbackData*>(p); try {
