This is an automated email from the ASF dual-hosted git repository.
jimjag pushed a commit to branch AOO50X
in repository https://gitbox.apache.org/repos/asf/openoffice.git
The following commit(s) were added to refs/heads/AOO50X by this push:
new 45f5c5a28b Run the report and Calc data source warm-up loads on our
main thread
45f5c5a28b is described below
commit 45f5c5a28bd6a97a67e734076cd1032ccd6b6702
Author: Jim Jagielski <[email protected]>
AuthorDate: Thu Oct 22 10:16:25 2026 -0400
Run the report and Calc data source warm-up loads on our main thread
As detached threads they could outlive DeInitVCL and crash when the office
terminated right after the first report or Calc data source load.
(cherry picked from commit 3a0630bdd7a494db803a60f9f8c27232168f1b68)
---
main/dbaccess/source/filter/xml/xmlfilter.cxx | 12 +++++++-
.../source/core/api/ReportDefinition.cxx | 32 +++++++++++-----------
2 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/main/dbaccess/source/filter/xml/xmlfilter.cxx
b/main/dbaccess/source/filter/xml/xmlfilter.cxx
index a29fc19aa8..92f7e89cb2 100644
--- a/main/dbaccess/source/filter/xml/xmlfilter.cxx
+++ b/main/dbaccess/source/filter/xml/xmlfilter.cxx
@@ -154,6 +154,10 @@ namespace dbaxml
,m_eWhat(_eType)
{}
+ // E_CALC runs as a main-thread user event: as a detached thread
it could outlive
+ // DeInitVCL, and its frame creation then restarted VCL while the
office was exiting.
+ DECL_STATIC_LINK( FastLoader, RunHdl, FastLoader* );
+
protected:
virtual ~FastLoader(){}
@@ -236,6 +240,12 @@ namespace dbaxml
{
delete this;
}
+ IMPL_STATIC_LINK_NOINSTANCE( FastLoader, RunHdl, FastLoader*, pLoader )
+ {
+ pLoader->run();
+ delete pLoader;
+ return 0;
+ }
class DatasourceURLListener : public ::cppu::WeakImplHelper1<
beans::XPropertyChangeListener >
{
@@ -260,7 +270,7 @@ namespace dbaxml
} // if ( m_aTypeCollection.needsJVM(sURL) )
else if ( sURL.matchIgnoreAsciiCaseAsciiL("sdbc:calc:",10,0) )
{
- pCreatorThread = new
FastLoader(m_xFactory,FastLoader::E_CALC);
+ Application::PostUserEvent( STATIC_LINK( NULL, FastLoader,
RunHdl ), new FastLoader(m_xFactory,FastLoader::E_CALC) );
}
if ( pCreatorThread )
{
diff --git a/main/reportdesign/source/core/api/ReportDefinition.cxx
b/main/reportdesign/source/core/api/ReportDefinition.cxx
index 8f40f39364..442d5113b4 100644
--- a/main/reportdesign/source/core/api/ReportDefinition.cxx
+++ b/main/reportdesign/source/core/api/ReportDefinition.cxx
@@ -104,7 +104,6 @@
#include <dbaccess/dbaundomanager.hxx>
#include <editeng/paperinf.hxx>
#include <framework/titlehelper.hxx>
-#include <osl/thread.hxx>
#include <svl/itempool.hxx>
#include <svl/undo.hxx>
#include <svx/svdlayer.hxx>
@@ -504,7 +503,9 @@ uno::Sequence< uno::Any > SAL_CALL
OStyle::getPropertyDefaults( const uno::Seque
}
namespace
{
- class FactoryLoader : public ::osl::Thread
+ // Runs as a main-thread user event: as a detached thread it could outlive
DeInitVCL
+ // and use the already deleted SolarMutex if the office terminated right
after the first report.
+ class FactoryLoader
{
::rtl::OUString m_sMimeType;
uno::Reference< uno::XComponentContext > m_xContext;
@@ -514,15 +515,20 @@ namespace
,m_xContext(_xContext)
{}
- protected:
- virtual ~FactoryLoader(){}
+ DECL_STATIC_LINK( FactoryLoader, LoadHdl, FactoryLoader* );
- /// Working method which should be overridden.
- virtual void SAL_CALL run();
- virtual void SAL_CALL onTerminated();
+ private:
+ void load();
};
- void SAL_CALL FactoryLoader::run()
+ IMPL_STATIC_LINK_NOINSTANCE( FactoryLoader, LoadHdl, FactoryLoader*,
pLoader )
+ {
+ pLoader->load();
+ delete pLoader;
+ return 0;
+ }
+
+ void FactoryLoader::load()
{
try
{
@@ -565,10 +571,6 @@ namespace
DBG_UNHANDLED_EXCEPTION();
}
}
- void SAL_CALL FactoryLoader::onTerminated()
- {
- delete this;
- }
}
//
-----------------------------------------------------------------------------
struct OReportDefinitionImpl
@@ -763,10 +765,8 @@ void OReportDefinition::init()
const ::rtl::OUString* pEnd = pIter + aMimeTypes.getLength();
for ( ; pIter != pEnd; ++pIter )
{
- FactoryLoader* pCreatorThread = new
FactoryLoader(*pIter,m_aProps->m_xContext);
- pCreatorThread->createSuspended();
- pCreatorThread->setPriority(osl_Thread_PriorityBelowNormal);
- pCreatorThread->resume();
+ FactoryLoader* pLoader = new
FactoryLoader(*pIter,m_aProps->m_xContext);
+ Application::PostUserEvent( STATIC_LINK( NULL, FactoryLoader,
LoadHdl ), pLoader );
}
}