diff options
author | Armin Le Grand (allotropia) <armin.le.grand.extern@allotropia.de> | 2023-12-29 21:36:10 +0100 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@me.com> | 2024-01-02 15:05:50 +0100 |
commit | aa3bca30248436d051981c6fff03c864d0228874 (patch) | |
tree | 65efc5507d5e934b71b91a07144557ee408154ec /drawinglayer | |
parent | ddaea28c9f77bc5b9c323604d7eed4d79d5c732e (diff) |
Add flush mechanism to buffered Primitives IV
Now trying not to delete a LocalCallbackTimer if it gets
used - no limitation since this only happens when a
time is given (maCallbackSeconds).
Also added to reset callback ptr (clearCallback()) to
nullptr and make onShot dependent of that, hope is that
destruction of LocalCallbackTimer in
~BufferedDecompositionPrimitive2D gets safer that way,
excluding race conditions.
Change-Id: Id474962bdae14631afc42d2d92db635408fb67d9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161434
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand@me.com>
Diffstat (limited to 'drawinglayer')
-rw-r--r-- | drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx | 19 | ||||
-rw-r--r-- | drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx | 19 |
2 files changed, 26 insertions, 12 deletions
diff --git a/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx b/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx index 537a0106d80d..96fd72eb25ca 100644 --- a/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx +++ b/drawinglayer/source/primitive2d/BufferedDecompositionGroupPrimitive2D.cxx @@ -36,11 +36,17 @@ public: { } + void clearCallback() { pCustomer = nullptr; } + protected: virtual void SAL_CALL onShot() override; }; -void SAL_CALL LocalCallbackTimer::onShot() { flushBufferedDecomposition(*pCustomer); } +void SAL_CALL LocalCallbackTimer::onShot() +{ + if (nullptr != pCustomer) + flushBufferedDecomposition(*pCustomer); +} } namespace drawinglayer::primitive2d @@ -55,7 +61,7 @@ BufferedDecompositionGroupPrimitive2D::getBuffered2DDecomposition() const { if (0 != maCallbackSeconds && maCallbackTimer.is()) { - // decomposition was used, touch + // decomposition was used, touch/restart time maCallbackTimer->setRemainingTime(salhelper::TTimeValue(maCallbackSeconds, 0)); } @@ -70,19 +76,20 @@ void BufferedDecompositionGroupPrimitive2D::setBuffered2DDecomposition(Primitive { if (rNew.empty()) { - // no more decomposition, end callback + // stop timer maCallbackTimer->stop(); - maCallbackTimer.clear(); } else { // decomposition changed, touch maCallbackTimer->setRemainingTime(salhelper::TTimeValue(maCallbackSeconds, 0)); + if (!maCallbackTimer->isTicking()) + maCallbackTimer->start(); } } else if (!rNew.empty()) { - // decomposition changed, start callback + // decomposition defined/set/changed, init & start timer maCallbackTimer.set(new LocalCallbackTimer(*this)); maCallbackTimer->setRemainingTime(salhelper::TTimeValue(maCallbackSeconds, 0)); maCallbackTimer->start(); @@ -105,8 +112,8 @@ BufferedDecompositionGroupPrimitive2D::~BufferedDecompositionGroupPrimitive2D() if (maCallbackTimer.is()) { // no more decomposition, end callback + static_cast<LocalCallbackTimer*>(maCallbackTimer.get())->clearCallback(); maCallbackTimer->stop(); - maCallbackTimer.clear(); } } diff --git a/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx b/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx index 0ed22120c6d6..c7f3b78477b0 100644 --- a/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx +++ b/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx @@ -36,11 +36,17 @@ public: { } + void clearCallback() { pCustomer = nullptr; } + protected: virtual void SAL_CALL onShot() override; }; -void SAL_CALL LocalCallbackTimer::onShot() { flushBufferedDecomposition(*pCustomer); } +void SAL_CALL LocalCallbackTimer::onShot() +{ + if (nullptr != pCustomer) + flushBufferedDecomposition(*pCustomer); +} } namespace drawinglayer::primitive2d @@ -54,7 +60,7 @@ const Primitive2DContainer& BufferedDecompositionPrimitive2D::getBuffered2DDecom { if (0 != maCallbackSeconds && maCallbackTimer.is()) { - // decomposition was used, touch + // decomposition was used, touch/restart time maCallbackTimer->setRemainingTime(salhelper::TTimeValue(maCallbackSeconds, 0)); } @@ -69,19 +75,20 @@ void BufferedDecompositionPrimitive2D::setBuffered2DDecomposition(Primitive2DCon { if (rNew.empty()) { - // no more decomposition, end callback + // stop timer maCallbackTimer->stop(); - maCallbackTimer.clear(); } else { // decomposition changed, touch maCallbackTimer->setRemainingTime(salhelper::TTimeValue(maCallbackSeconds, 0)); + if (!maCallbackTimer->isTicking()) + maCallbackTimer->start(); } } else if (!rNew.empty()) { - // decomposition changed, start callback + // decomposition defined/set/changed, init & start timer maCallbackTimer.set(new LocalCallbackTimer(*this)); maCallbackTimer->setRemainingTime(salhelper::TTimeValue(maCallbackSeconds, 0)); maCallbackTimer->start(); @@ -104,8 +111,8 @@ BufferedDecompositionPrimitive2D::~BufferedDecompositionPrimitive2D() if (maCallbackTimer.is()) { // no more decomposition, end callback + static_cast<LocalCallbackTimer*>(maCallbackTimer.get())->clearCallback(); maCallbackTimer->stop(); - maCallbackTimer.clear(); } } |