summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-01-19 09:01:14 +0100
committerGravatar bstoeger <32835590+bstoeger@users.noreply.github.com>2021-01-20 08:47:18 +0100
commite32e6d63a7c158a03a851492f4f9d3edffe2f857 (patch)
tree99942fc7e0f6fbe8c9f02f43e3942cad99b35b11
parent9e61a6372a0709a6ddaef5749a27b05d84c5f70c (diff)
downloadsubsurface-e32e6d63a7c158a03a851492f4f9d3edffe2f857.tar.gz
statistics: leak textures on exit
The scatter plot items shared their textures. These were std::unique_ptrs and cleaned up on exit. Owing to QSG's broken memory model, freeing the textures after QApplication terminated its threads led to crashes. Therefore, leak the textures. Not satisfying, but ultimately harmless and better than a crash. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--stats/chartitem.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/stats/chartitem.cpp b/stats/chartitem.cpp
index 6a69b6973..7c5339596 100644
--- a/stats/chartitem.cpp
+++ b/stats/chartitem.cpp
@@ -117,7 +117,7 @@ ChartScatterItem::~ChartScatterItem()
{
}
-static std::unique_ptr<QSGTexture> createScatterTexture(StatsView &view, const QColor &color, const QColor &borderColor)
+static QSGTexture *createScatterTexture(StatsView &view, const QColor &color, const QColor &borderColor)
{
QImage img(scatterItemDiameter, scatterItemDiameter, QImage::Format_ARGB32);
img.fill(Qt::transparent);
@@ -130,13 +130,15 @@ static std::unique_ptr<QSGTexture> createScatterTexture(StatsView &view, const Q
painter.drawEllipse(scatterItemBorder, scatterItemBorder,
scatterItemDiameter - 2 * scatterItemBorder,
scatterItemDiameter - 2 * scatterItemBorder);
- return std::unique_ptr<QSGTexture>(
- view.w()->createTextureFromImage(img, QQuickWindow::TextureHasAlphaChannel)
- );
+ return view.w()->createTextureFromImage(img, QQuickWindow::TextureHasAlphaChannel);
}
-std::unique_ptr<QSGTexture> scatterItemTexture;
-std::unique_ptr<QSGTexture> scatterItemHighlightedTexture;
+// Note: Originally these were std::unique_ptrs, which automatically
+// freed the textures on exit. However, destroying textures after
+// QApplication finished its thread leads to crashes. Therefore, these
+// are now normal pointers and the texture objects are leaked.
+static QSGTexture *scatterItemTexture = nullptr;
+static QSGTexture *scatterItemHighlightedTexture = nullptr;
void ChartScatterItem::render()
{
@@ -151,7 +153,7 @@ void ChartScatterItem::render()
}
updateVisible();
if (textureDirty) {
- node->node->setTexture(highlighted ? scatterItemHighlightedTexture.get() : scatterItemTexture.get());
+ node->node->setTexture(highlighted ? scatterItemHighlightedTexture : scatterItemTexture);
textureDirty = false;
}
if (positionDirty) {