cppu/source/threadpool/thread.cxx | 25 ++ cppu/source/threadpool/thread.hxx | 2 sc/inc/global.hxx | 1 sc/source/core/data/global.cxx | 5 sc/source/core/data/table4.cxx | 232 +++++++++++++-------------- sc/source/ui/docshell/docfunc.cxx | 4 sc/source/ui/miscdlgs/scuiautofmt.cxx | 4 sc/source/ui/unoobj/afmtuno.cxx | 88 ++++------ sc/source/ui/unoobj/cellsuno.cxx | 4 sc/source/ui/view/cellsh3.cxx | 4 solenv/gbuild/platform/unxgcc_gdbforjunit.sh | 2 11 files changed, 190 insertions(+), 181 deletions(-)
New commits: commit e2dda69cfe9925e6f5d2bc922febb53a0f69c50f Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Dec 16 13:56:32 2011 +0100 Report backtraces for all threads. (cherry picked from commit 54a918bbfba47734d414832755e35434da103ed5) Signed-off-by: Michael Stahl <mst...@redhat.com> diff --git a/solenv/gbuild/platform/unxgcc_gdbforjunit.sh b/solenv/gbuild/platform/unxgcc_gdbforjunit.sh index 730d2e9..0341e7b 100755 --- a/solenv/gbuild/platform/unxgcc_gdbforjunit.sh +++ b/solenv/gbuild/platform/unxgcc_gdbforjunit.sh @@ -44,7 +44,7 @@ then echo "Found a core dump at ${COREFILE}" echo "Stacktrace:" GDBCOMMANDFILE=`mktemp` - echo "bt" > ${GDBCOMMANDFILE} + echo "thread apply all bt" > ${GDBCOMMANDFILE} gdb -x $GDBCOMMANDFILE --batch ${OFFICEFILE}.bin ${COREFILE} rm ${GDBCOMMANDFILE} echo commit c77a382e27d6ecabd98fa4788b4a372008fe7dbf Author: Stephan Bergmann <sberg...@redhat.com> Date: Wed Jan 11 09:26:41 2012 +0100 ScGlobal::GetAutoFormat not always required to create fresh instance. ...at least in ~ScAutoFormatObj it appears unnecessary and can lead to crashes during Desktop::DeregisterServices (when ScGlobal::ppRscString is already null and ScAutoFormat ctor calls ScGlobal::GetRscString). Therefore split GetAutoFormat in two, GetOrCreateAutoFormat for cases that probably need a non-null return and GetAutoFormat for those that are OK with a null return. (cherry picked from commit 0e4b36269097f8865bdbc1b9d299a2776ae0cc06) Signed-off-by: Michael Stahl <mst...@redhat.com> Signed-off-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx index a810400..ac10094 100644 --- a/sc/inc/global.hxx +++ b/sc/inc/global.hxx @@ -562,6 +562,7 @@ public: SC_DLLPUBLIC static const SvxSearchItem& GetSearchItem(); SC_DLLPUBLIC static void SetSearchItem( const SvxSearchItem& rNew ); SC_DLLPUBLIC static ScAutoFormat* GetAutoFormat(); + SC_DLLPUBLIC static ScAutoFormat* GetOrCreateAutoFormat(); static void ClearAutoFormat(); //BugId 54209 static FuncCollection* GetFuncCollection(); SC_DLLPUBLIC static ScUnoAddInCollection* GetAddInCollection(); diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx index 6de3782..c43a853 100644 --- a/sc/source/core/data/global.cxx +++ b/sc/source/core/data/global.cxx @@ -299,6 +299,11 @@ void ScGlobal::ClearAutoFormat() ScAutoFormat* ScGlobal::GetAutoFormat() { + return pAutoFormat; +} + +ScAutoFormat* ScGlobal::GetOrCreateAutoFormat() +{ if ( !pAutoFormat ) { pAutoFormat = new ScAutoFormat; diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx index 9b38214..bc99c5c 100644 --- a/sc/source/core/data/table4.cxx +++ b/sc/source/core/data/table4.cxx @@ -1592,14 +1592,10 @@ void ScTable::Fill( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, void ScTable::AutoFormatArea(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const ScPatternAttr& rAttr, sal_uInt16 nFormatNo) { - ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat(); - if (pAutoFormat) + ScAutoFormatData* pData = (*ScGlobal::GetOrCreateAutoFormat())[nFormatNo]; + if (pData) { - ScAutoFormatData* pData = (*pAutoFormat)[nFormatNo]; - if (pData) - { - ApplyPatternArea(nStartCol, nStartRow, nEndCol, nEndRow, rAttr); - } + ApplyPatternArea(nStartCol, nStartRow, nEndCol, nEndRow, rAttr); } } @@ -1608,140 +1604,136 @@ void ScTable::AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW { if (ValidColRow(nStartCol, nStartRow) && ValidColRow(nEndCol, nEndRow)) { - ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat(); - if (pAutoFormat) + ScAutoFormatData* pData = (*ScGlobal::GetOrCreateAutoFormat())[nFormatNo]; + if (pData) { - ScAutoFormatData* pData = (*pAutoFormat)[nFormatNo]; - if (pData) + ScPatternAttr* pPatternAttrs[16]; + for (sal_uInt8 i = 0; i < 16; ++i) + { + pPatternAttrs[i] = new ScPatternAttr(pDocument->GetPool()); + pData->FillToItemSet(i, pPatternAttrs[i]->GetItemSet(), *pDocument); + } + + SCCOL nCol = nStartCol; + SCROW nRow = nStartRow; + sal_uInt16 nIndex = 0; + // Linke obere Ecke + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + // Linke Spalte + if (pData->IsEqualData(4, 8)) + AutoFormatArea(nStartCol, nStartRow + 1, nStartCol, nEndRow - 1, *pPatternAttrs[4], nFormatNo); + else { - ScPatternAttr* pPatternAttrs[16]; - for (sal_uInt8 i = 0; i < 16; ++i) + nIndex = 4; + for (nRow = nStartRow + 1; nRow < nEndRow; nRow++) { - pPatternAttrs[i] = new ScPatternAttr(pDocument->GetPool()); - pData->FillToItemSet(i, pPatternAttrs[i]->GetItemSet(), *pDocument); + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + if (nIndex == 4) + nIndex = 8; + else + nIndex = 4; } - - SCCOL nCol = nStartCol; - SCROW nRow = nStartRow; - sal_uInt16 nIndex = 0; - // Linke obere Ecke - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - // Linke Spalte - if (pData->IsEqualData(4, 8)) - AutoFormatArea(nStartCol, nStartRow + 1, nStartCol, nEndRow - 1, *pPatternAttrs[4], nFormatNo); - else + } + // Linke untere Ecke + nRow = nEndRow; + nIndex = 12; + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + // Rechte obere Ecke + nCol = nEndCol; + nRow = nStartRow; + nIndex = 3; + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + // Rechte Spalte + if (pData->IsEqualData(7, 11)) + AutoFormatArea(nEndCol, nStartRow + 1, nEndCol, nEndRow - 1, *pPatternAttrs[7], nFormatNo); + else + { + nIndex = 7; + for (nRow = nStartRow + 1; nRow < nEndRow; nRow++) { - nIndex = 4; - for (nRow = nStartRow + 1; nRow < nEndRow; nRow++) - { - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - if (nIndex == 4) - nIndex = 8; - else - nIndex = 4; - } + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + if (nIndex == 7) + nIndex = 11; + else + nIndex = 7; } - // Linke untere Ecke - nRow = nEndRow; - nIndex = 12; + } + // Rechte untere Ecke + nRow = nEndRow; + nIndex = 15; + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + nRow = nStartRow; + nIndex = 1; + for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) + { AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - // Rechte obere Ecke - nCol = nEndCol; - nRow = nStartRow; - nIndex = 3; + if (nIndex == 1) + nIndex = 2; + else + nIndex = 1; + } + // Untere Zeile + nRow = nEndRow; + nIndex = 13; + for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) + { AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - // Rechte Spalte - if (pData->IsEqualData(7, 11)) - AutoFormatArea(nEndCol, nStartRow + 1, nEndCol, nEndRow - 1, *pPatternAttrs[7], nFormatNo); + if (nIndex == 13) + nIndex = 14; else + nIndex = 13; + } + // Boddy + if ((pData->IsEqualData(5, 6)) && (pData->IsEqualData(9, 10)) && (pData->IsEqualData(5, 9))) + AutoFormatArea(nStartCol + 1, nStartRow + 1, nEndCol-1, nEndRow - 1, *pPatternAttrs[5], nFormatNo); + else + { + if ((pData->IsEqualData(5, 9)) && (pData->IsEqualData(6, 10))) { - nIndex = 7; - for (nRow = nStartRow + 1; nRow < nEndRow; nRow++) + nIndex = 5; + for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) { - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - if (nIndex == 7) - nIndex = 11; + AutoFormatArea(nCol, nStartRow + 1, nCol, nEndRow - 1, *pPatternAttrs[nIndex], nFormatNo); + if (nIndex == 5) + nIndex = 6; else - nIndex = 7; + nIndex = 5; } } - // Rechte untere Ecke - nRow = nEndRow; - nIndex = 15; - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - nRow = nStartRow; - nIndex = 1; - for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) - { - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - if (nIndex == 1) - nIndex = 2; - else - nIndex = 1; - } - // Untere Zeile - nRow = nEndRow; - nIndex = 13; - for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) - { - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - if (nIndex == 13) - nIndex = 14; - else - nIndex = 13; - } - // Boddy - if ((pData->IsEqualData(5, 6)) && (pData->IsEqualData(9, 10)) && (pData->IsEqualData(5, 9))) - AutoFormatArea(nStartCol + 1, nStartRow + 1, nEndCol-1, nEndRow - 1, *pPatternAttrs[5], nFormatNo); else { - if ((pData->IsEqualData(5, 9)) && (pData->IsEqualData(6, 10))) + nIndex = 5; + for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) { - nIndex = 5; - for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) + for (nRow = nStartRow + 1; nRow < nEndRow; nRow++) { - AutoFormatArea(nCol, nStartRow + 1, nCol, nEndRow - 1, *pPatternAttrs[nIndex], nFormatNo); - if (nIndex == 5) - nIndex = 6; - else - nIndex = 5; - } - } - else - { - nIndex = 5; - for (nCol = nStartCol + 1; nCol < nEndCol; nCol++) - { - for (nRow = nStartRow + 1; nRow < nEndRow; nRow++) + AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); + if ((nIndex == 5) || (nIndex == 9)) { - AutoFormatArea(nCol, nRow, nCol, nRow, *pPatternAttrs[nIndex], nFormatNo); - if ((nIndex == 5) || (nIndex == 9)) - { - if (nIndex == 5) - nIndex = 9; - else - nIndex = 5; - } + if (nIndex == 5) + nIndex = 9; else - { - if (nIndex == 6) - nIndex = 10; - else - nIndex = 6; - } - } // for nRow - if ((nIndex == 5) || (nIndex == 9)) - nIndex = 6; + nIndex = 5; + } else - nIndex = 5; - } // for nCol - } // if not equal Column - } // if not all equal - - for (sal_uInt8 j = 0; j < 16; ++j) - delete pPatternAttrs[j]; - } // if AutoFormatData != NULL - } // if AutoFormat != NULL + { + if (nIndex == 6) + nIndex = 10; + else + nIndex = 6; + } + } // for nRow + if ((nIndex == 5) || (nIndex == 9)) + nIndex = 6; + else + nIndex = 5; + } // for nCol + } // if not equal Column + } // if not all equal + + for (sal_uInt8 j = 0; j < 16; ++j) + delete pPatternAttrs[j]; + } // if AutoFormatData != NULL } // if ValidColRow } diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 598c1ea..fd62c60 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -3693,9 +3693,9 @@ sal_Bool ScDocFunc::AutoFormat( const ScRange& rRange, const ScMarkData* pTabMar aMark.SelectTable( nTab, sal_True ); } - ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat(); + ScAutoFormat* pAutoFormat = ScGlobal::GetOrCreateAutoFormat(); ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark ); - if ( pAutoFormat && nFormatNo < pAutoFormat->GetCount() && aTester.IsEditable() ) + if ( nFormatNo < pAutoFormat->GetCount() && aTester.IsEditable() ) { WaitObject aWait( rDocShell.GetActiveDialogParent() ); diff --git a/sc/source/ui/miscdlgs/scuiautofmt.cxx b/sc/source/ui/miscdlgs/scuiautofmt.cxx index d51b420..9466a4b 100644 --- a/sc/source/ui/miscdlgs/scuiautofmt.cxx +++ b/sc/source/ui/miscdlgs/scuiautofmt.cxx @@ -194,7 +194,7 @@ IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn ) if ( pBtn == &aBtnOk || pBtn == &aBtnCancel ) { if ( bCoreDataChanged ) - ScGlobal::GetAutoFormat()->Save(); + ScGlobal::GetOrCreateAutoFormat()->Save(); EndDialog( (pBtn == &aBtnOk) ? RET_OK : RET_CANCEL ); } @@ -206,7 +206,7 @@ IMPL_LINK( ScAutoFormatDlg, CloseHdl, PushButton *, pBtn ) IMPL_LINK_INLINE_START( ScAutoFormatDlg, DblClkHdl, void *, EMPTYARG ) { if ( bCoreDataChanged ) - ScGlobal::GetAutoFormat()->Save(); + ScGlobal::GetOrCreateAutoFormat()->Save(); EndDialog( RET_OK ); return 0; diff --git a/sc/source/ui/unoobj/afmtuno.cxx b/sc/source/ui/unoobj/afmtuno.cxx index e8f9493..f072725 100644 --- a/sc/source/ui/unoobj/afmtuno.cxx +++ b/sc/source/ui/unoobj/afmtuno.cxx @@ -221,8 +221,7 @@ uno::Sequence<rtl::OUString> ScAutoFormatsObj::getSupportedServiceNames_Static() ScAutoFormatObj* ScAutoFormatsObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) { - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && nIndex < pFormats->GetCount()) + if (nIndex < ScGlobal::GetOrCreateAutoFormat()->GetCount()) return new ScAutoFormatObj(nIndex); return NULL; // falscher Index @@ -230,14 +229,11 @@ ScAutoFormatObj* ScAutoFormatsObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) ScAutoFormatObj* ScAutoFormatsObj::GetObjectByName_Impl(const rtl::OUString& aName) { - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - { - String aString(aName); - sal_uInt16 nIndex; - if (lcl_FindAutoFormatIndex( *pFormats, aString, nIndex )) - return GetObjectByIndex_Impl(nIndex); - } + String aString(aName); + sal_uInt16 nIndex; + if (lcl_FindAutoFormatIndex( + *ScGlobal::GetOrCreateAutoFormat(), aString, nIndex )) + return GetObjectByIndex_Impl(nIndex); return NULL; } @@ -257,10 +253,10 @@ void SAL_CALL ScAutoFormatsObj::insertByName( const rtl::OUString& aName, const if ( pFormatObj && !pFormatObj->IsInserted() ) // noch nicht eingefuegt? { String aNameStr(aName); - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); sal_uInt16 nDummy; - if (pFormats && !lcl_FindAutoFormatIndex( *pFormats, aNameStr, nDummy )) + if (!lcl_FindAutoFormatIndex( *pFormats, aNameStr, nDummy )) { ScAutoFormatData* pNew = new ScAutoFormatData(); pNew->SetName( aNameStr ); @@ -314,10 +310,10 @@ void SAL_CALL ScAutoFormatsObj::removeByName( const rtl::OUString& aName ) { SolarMutexGuard aGuard; String aNameStr(aName); - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); sal_uInt16 nIndex; - if (pFormats && lcl_FindAutoFormatIndex( *pFormats, aNameStr, nIndex )) + if (lcl_FindAutoFormatIndex( *pFormats, aNameStr, nIndex )) { pFormats->AtFree( nIndex ); @@ -344,11 +340,7 @@ uno::Reference<container::XEnumeration> SAL_CALL ScAutoFormatsObj::createEnumera sal_Int32 SAL_CALL ScAutoFormatsObj::getCount() throw(uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - return pFormats->GetCount(); - - return 0; + return ScGlobal::GetOrCreateAutoFormat()->GetCount(); } uno::Any SAL_CALL ScAutoFormatsObj::getByIndex( sal_Int32 nIndex ) @@ -391,35 +383,27 @@ uno::Sequence<rtl::OUString> SAL_CALL ScAutoFormatsObj::getElementNames() throw(uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); + String aName; + sal_uInt16 nCount = pFormats->GetCount(); + uno::Sequence<rtl::OUString> aSeq(nCount); + rtl::OUString* pAry = aSeq.getArray(); + for (sal_uInt16 i=0; i<nCount; i++) { - String aName; - sal_uInt16 nCount = pFormats->GetCount(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (sal_uInt16 i=0; i<nCount; i++) - { - (*pFormats)[i]->GetName(aName); - pAry[i] = aName; - } - return aSeq; + (*pFormats)[i]->GetName(aName); + pAry[i] = aName; } - return uno::Sequence<rtl::OUString>(0); + return aSeq; } sal_Bool SAL_CALL ScAutoFormatsObj::hasByName( const rtl::OUString& aName ) throw(uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - { - String aString(aName); - sal_uInt16 nDummy; - return lcl_FindAutoFormatIndex( *pFormats, aString, nDummy ); - } - return false; + String aString(aName); + sal_uInt16 nDummy; + return lcl_FindAutoFormatIndex( + *ScGlobal::GetOrCreateAutoFormat(), aString, nDummy ); } //------------------------------------------------------------------------ @@ -553,8 +537,8 @@ sal_Bool SAL_CALL ScAutoFormatObj::hasElements() throw(uno::RuntimeException) rtl::OUString SAL_CALL ScAutoFormatObj::getName() throw(uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount()) + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); + if (IsInserted() && nFormatIndex < pFormats->GetCount()) { String aName; (*pFormats)[nFormatIndex]->GetName(aName); @@ -568,10 +552,10 @@ void SAL_CALL ScAutoFormatObj::setName( const rtl::OUString& aNewName ) { SolarMutexGuard aGuard; String aNewString(aNewName); - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); sal_uInt16 nDummy; - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount() && + if (IsInserted() && nFormatIndex < pFormats->GetCount() && !lcl_FindAutoFormatIndex( *pFormats, aNewString, nDummy )) { ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; @@ -619,8 +603,8 @@ void SAL_CALL ScAutoFormatObj::setPropertyValue( uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount()) + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); + if (IsInserted() && nFormatIndex < pFormats->GetCount()) { ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; OSL_ENSURE(pData,"AutoFormat Daten nicht da"); @@ -654,8 +638,8 @@ uno::Any SAL_CALL ScAutoFormatObj::getPropertyValue( const rtl::OUString& aPrope SolarMutexGuard aGuard; uno::Any aAny; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount()) + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); + if (IsInserted() && nFormatIndex < pFormats->GetCount()) { ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; OSL_ENSURE(pData,"AutoFormat Daten nicht da"); @@ -724,11 +708,11 @@ void SAL_CALL ScAutoFormatFieldObj::setPropertyValue( uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); const SfxItemPropertySimpleEntry* pEntry = aPropSet.getPropertyMap()->getByName( aPropertyName ); - if ( pEntry && pEntry->nWID && pFormats && nFormatIndex < pFormats->GetCount() ) + if ( pEntry && pEntry->nWID && nFormatIndex < pFormats->GetCount() ) { ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; @@ -814,11 +798,11 @@ uno::Any SAL_CALL ScAutoFormatFieldObj::getPropertyValue( const rtl::OUString& a SolarMutexGuard aGuard; uno::Any aVal; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); + ScAutoFormat* pFormats = ScGlobal::GetOrCreateAutoFormat(); const SfxItemPropertySimpleEntry* pEntry = aPropSet.getPropertyMap()->getByName( aPropertyName ); - if ( pEntry && pEntry->nWID && pFormats && nFormatIndex < pFormats->GetCount() ) + if ( pEntry && pEntry->nWID && nFormatIndex < pFormats->GetCount() ) { const ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx index 6be0239..ca59caf 100644 --- a/sc/source/ui/unoobj/cellsuno.cxx +++ b/sc/source/ui/unoobj/cellsuno.cxx @@ -5500,10 +5500,10 @@ void SAL_CALL ScCellRangeObj::autoFormat( const rtl::OUString& aName ) throw(lang::IllegalArgumentException, uno::RuntimeException) { SolarMutexGuard aGuard; - ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat(); ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && pAutoFormat ) + if ( pDocSh ) { + ScAutoFormat* pAutoFormat = ScGlobal::GetOrCreateAutoFormat(); String aNameString(aName); sal_uInt16 nCount = pAutoFormat->GetCount(); sal_uInt16 nIndex; diff --git a/sc/source/ui/view/cellsh3.cxx b/sc/source/ui/view/cellsh3.cxx index 19111c8..a9950c8 100644 --- a/sc/source/ui/view/cellsh3.cxx +++ b/sc/source/ui/view/cellsh3.cxx @@ -816,7 +816,7 @@ void ScCellShell::Execute( SfxRequest& rReq ) if ( pReqArgs ) { const SfxStringItem& rNameItem = (const SfxStringItem&)pReqArgs->Get( SID_AUTOFORMAT ); - ScAutoFormat* pFormat = ScGlobal::GetAutoFormat(); + ScAutoFormat* pFormat = ScGlobal::GetOrCreateAutoFormat(); sal_uInt16 nIndex = pFormat->FindIndexPerName( rNameItem.GetValue() ); pTabViewShell->AutoFormat( nIndex ); @@ -831,7 +831,7 @@ void ScCellShell::Execute( SfxRequest& rReq ) ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); - AbstractScAutoFormatDlg* pDlg = pFact->CreateScAutoFormatDlg( pDlgParent, ScGlobal::GetAutoFormat(), pNewEntry,GetViewData()->GetDocument(), RID_SCDLG_AUTOFORMAT ); + AbstractScAutoFormatDlg* pDlg = pFact->CreateScAutoFormatDlg( pDlgParent, ScGlobal::GetOrCreateAutoFormat(), pNewEntry,GetViewData()->GetDocument(), RID_SCDLG_AUTOFORMAT ); OSL_ENSURE(pDlg, "Dialog create fail!"); if ( pDlg->Execute() == RET_OK ) commit 880b66fe31296fce70ec2e2f8a9c2ce4092cee9d Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Dec 19 14:15:28 2011 +0100 Prevent creation of new ORequestThreads during shutdown. (cherry picked from commit b68640c44ecdb1df59d704cc6c2bae8bb412d7d0) Signed-off-by: Michael Stahl <mst...@redhat.com> Signed-off-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/cppu/source/threadpool/thread.cxx b/cppu/source/threadpool/thread.cxx index 58aec56..cc22a45 100644 --- a/cppu/source/threadpool/thread.cxx +++ b/cppu/source/threadpool/thread.cxx @@ -30,12 +30,22 @@ #include <osl/diagnose.h> #include <uno/threadpool.h> +#include <com/sun/star/lang/DisposedException.hpp> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/XInterface.hpp> #include <rtl/instance.hxx> +#include <rtl/ustring.h> +#include <rtl/ustring.hxx> #include "thread.hxx" #include "jobqueue.hxx" #include "threadpool.hxx" +namespace { + +namespace css = com::sun::star; + +} using namespace osl; extern "C" { @@ -53,6 +63,8 @@ void SAL_CALL cppu_requestThreadWorker( void *pVoid ) namespace cppu_threadpool { // ---------------------------------------------------------------------------------- + ThreadAdmin::ThreadAdmin(): m_disposed(false) {} + ThreadAdmin::~ThreadAdmin() { #if OSL_DEBUG_LEVEL > 1 @@ -66,6 +78,15 @@ namespace cppu_threadpool { void ThreadAdmin::add( ORequestThread *p ) { MutexGuard aGuard( m_mutex ); + if( m_disposed ) + { + throw css::lang::DisposedException( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "cppu_threadpool::ORequestThread created after" + " cppu_threadpool::ThreadAdmin has been disposed")), + css::uno::Reference< css::uno::XInterface >()); + } m_lst.push_back( p ); } @@ -79,6 +100,10 @@ namespace cppu_threadpool { void ThreadAdmin::join() { + { + MutexGuard aGuard( m_mutex ); + m_disposed = true; + } ORequestThread *pCurrent; do { diff --git a/cppu/source/threadpool/thread.hxx b/cppu/source/threadpool/thread.hxx index bbef51e..a3ea45a 100644 --- a/cppu/source/threadpool/thread.hxx +++ b/cppu/source/threadpool/thread.hxx @@ -74,6 +74,7 @@ namespace cppu_threadpool { class ThreadAdmin { public: + ThreadAdmin(); ~ThreadAdmin (); static ThreadAdminHolder &getInstance(); void add( ORequestThread * ); @@ -83,6 +84,7 @@ namespace cppu_threadpool { private: ::osl::Mutex m_mutex; ::std::list< ORequestThread * > m_lst; + bool m_disposed; }; } // end cppu_threadpool _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits