cid#1606759 Data race condition

Change-Id: I1357972c5ca8c6441533f15423134707efd36e33
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177684
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
This commit is contained in:
Caolán McNamara 2024-12-01 15:19:27 +00:00
parent f75b9f7e1e
commit adfbf35c0c
3 changed files with 12 additions and 10 deletions

View file

@ -31,7 +31,7 @@ class SvxShapeCollection final
css::lang::XComponent> css::lang::XComponent>
{ {
private: private:
std::mutex m_aMutex; mutable std::mutex m_aMutex;
std::vector<css::uno::Reference<css::drawing::XShape>> maShapeContainer; std::vector<css::uno::Reference<css::drawing::XShape>> maShapeContainer;
comphelper::OInterfaceContainerHelper4<css::lang::XEventListener> maEventListeners; comphelper::OInterfaceContainerHelper4<css::lang::XEventListener> maEventListeners;
bool bDisposed = false; bool bDisposed = false;
@ -67,7 +67,7 @@ public:
virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
void getAllShapes(std::vector<css::uno::Reference<css::drawing::XShape>>& rShapes) const; std::vector<css::uno::Reference<css::drawing::XShape>> getAllShapes() const;
}; };
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -871,17 +871,19 @@ void ChildrenManagerImpl::UpdateSelection()
if (!xSelectedShape.is() && xSelectedShapeAccess.is()) if (!xSelectedShape.is() && xSelectedShapeAccess.is())
{ {
sal_Int32 nCount = xSelectedShapeAccess->getCount(); sal_Int32 nCount = xSelectedShapeAccess->getCount();
aSortedSelectedShapes.reserve(nCount);
if (auto pSvxShape = dynamic_cast<SvxShapeCollection*>(xSelectedShapeAccess.get())) if (auto pSvxShape = dynamic_cast<SvxShapeCollection*>(xSelectedShapeAccess.get()))
{ {
pSvxShape->getAllShapes(aSortedSelectedShapes); aSortedSelectedShapes = pSvxShape->getAllShapes();
} }
else else
{
aSortedSelectedShapes.reserve(nCount);
for (sal_Int32 i = 0; i < nCount; ++i) for (sal_Int32 i = 0; i < nCount; ++i)
{ {
css::uno::Reference<css::drawing::XShape> xShape(xSelectedShapeAccess->getByIndex(i), uno::UNO_QUERY); css::uno::Reference<css::drawing::XShape> xShape(xSelectedShapeAccess->getByIndex(i), uno::UNO_QUERY);
aSortedSelectedShapes.push_back(xShape); aSortedSelectedShapes.push_back(xShape);
} }
}
std::sort(aSortedSelectedShapes.begin(), aSortedSelectedShapes.end()); std::sort(aSortedSelectedShapes.begin(), aSortedSelectedShapes.end());
} }

View file

@ -147,7 +147,6 @@ sal_Int32 SAL_CALL SvxShapeCollection::getCount()
return maShapeContainer.size(); return maShapeContainer.size();
} }
uno::Any SAL_CALL SvxShapeCollection::getByIndex( sal_Int32 Index ) uno::Any SAL_CALL SvxShapeCollection::getByIndex( sal_Int32 Index )
{ {
if( Index < 0 || Index >= getCount() ) if( Index < 0 || Index >= getCount() )
@ -158,6 +157,12 @@ uno::Any SAL_CALL SvxShapeCollection::getByIndex( sal_Int32 Index )
return uno::Any( xShape ); return uno::Any( xShape );
} }
std::vector<css::uno::Reference<css::drawing::XShape>> SvxShapeCollection::getAllShapes() const
{
std::unique_lock g(m_aMutex);
return maShapeContainer;
}
// XElementAccess // XElementAccess
uno::Type SAL_CALL SvxShapeCollection::getElementType() uno::Type SAL_CALL SvxShapeCollection::getElementType()
{ {
@ -185,11 +190,6 @@ uno::Sequence< OUString > SAL_CALL SvxShapeCollection::getSupportedServiceNames(
return { u"com.sun.star.drawing.Shapes"_ustr, u"com.sun.star.drawing.ShapeCollection"_ustr }; return { u"com.sun.star.drawing.Shapes"_ustr, u"com.sun.star.drawing.ShapeCollection"_ustr };
} }
void SvxShapeCollection::getAllShapes(std::vector<css::uno::Reference<css::drawing::XShape>>& rShapes) const
{
rShapes = maShapeContainer;
}
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
com_sun_star_drawing_SvxShapeCollection_get_implementation( com_sun_star_drawing_SvxShapeCollection_get_implementation(
css::uno::XComponentContext *, css::uno::XComponentContext *,