Krita Source Code Documentation
Loading...
Searching...
No Matches
KisBusyWaitBroker.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#include "KisBusyWaitBroker.h"
7
8#include <QGlobalStatic>
9#include <QMutex>
10#include <QMutexLocker>
11
12#include <QThread>
13#include <QApplication>
14
15#include "kis_image.h"
16
17
19
20
22{
23 QMutex lock;
24 QHash<KisImage*, int> waitingOnImages;
25 int guiThreadLockCount = 0;
26
28};
29
30
35
39
41{
42 return s_instance;
43}
44
46{
47 if (QThread::currentThread() != qApp->thread()) return;
48
49 bool needsStartCallback = false;
50
51 {
52 QMutexLocker l(&m_d->lock);
53
54 m_d->guiThreadLockCount++;
55 m_d->waitingOnImages[image]++;
56
57 needsStartCallback = m_d->waitingOnImages[image] == 1;
58 }
59
60 if (m_d->feedbackCallback && needsStartCallback && image->refCount()) {
61 m_d->feedbackCallback(image);
62 }
63}
64
66{
67 if (QThread::currentThread() != qApp->thread()) return;
68
69 {
70 QMutexLocker l(&m_d->lock);
71 m_d->guiThreadLockCount--;
72
73 m_d->waitingOnImages[image]--;
74 KIS_SAFE_ASSERT_RECOVER_NOOP(m_d->waitingOnImages[image] >= 0);
75
76 if (m_d->waitingOnImages[image] == 0) {
77 m_d->waitingOnImages.remove(image);
78 }
79 }
80}
81
83{
84 if (QThread::currentThread() != qApp->thread()) return;
85
86 QMutexLocker l(&m_d->lock);
87 m_d->guiThreadLockCount++;
88}
89
91{
92 if (QThread::currentThread() != qApp->thread()) return;
93
94 QMutexLocker l(&m_d->lock);
95 m_d->guiThreadLockCount--;
96}
97
98void KisBusyWaitBroker::setFeedbackCallback(std::function<void (KisImageSP)> callback)
99{
100 m_d->feedbackCallback = callback;
101}
102
104{
105 return m_d->guiThreadLockCount;
106}
107
108
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
a simple singleton class for tracking busy-waits on the image and breaking deadlock ties when needed.
QScopedPointer< Private > m_d
void notifyWaitOnImageStarted(KisImage *image)
void setFeedbackCallback(std::function< void(KisImageSP)> callback)
void notifyWaitOnImageEnded(KisImage *image)
bool guiThreadIsWaitingForBetterWeather() const
static KisBusyWaitBroker * instance()
int refCount()
Definition kis_shared.h:22
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
std::function< void(KisImageSP)> feedbackCallback
QHash< KisImage *, int > waitingOnImages