8#include <QGlobalStatic>
10#include <QMutexLocker>
13#include <QApplication>
25 int guiThreadLockCount = 0;
47 if (QThread::currentThread() != qApp->thread())
return;
49 bool needsStartCallback =
false;
52 QMutexLocker l(&
m_d->lock);
54 m_d->guiThreadLockCount++;
55 m_d->waitingOnImages[image]++;
57 needsStartCallback =
m_d->waitingOnImages[image] == 1;
60 if (
m_d->feedbackCallback && needsStartCallback && image->
refCount()) {
61 m_d->feedbackCallback(image);
67 if (QThread::currentThread() != qApp->thread())
return;
70 QMutexLocker l(&
m_d->lock);
71 m_d->guiThreadLockCount--;
73 m_d->waitingOnImages[image]--;
76 if (
m_d->waitingOnImages[image] == 0) {
77 m_d->waitingOnImages.remove(image);
84 if (QThread::currentThread() != qApp->thread())
return;
86 QMutexLocker l(&
m_d->lock);
87 m_d->guiThreadLockCount++;
92 if (QThread::currentThread() != qApp->thread())
return;
94 QMutexLocker l(&
m_d->lock);
95 m_d->guiThreadLockCount--;
100 m_d->feedbackCallback = callback;
105 return m_d->guiThreadLockCount;
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 notifyGeneralWaitStarted()
void notifyWaitOnImageStarted(KisImage *image)
void setFeedbackCallback(std::function< void(KisImageSP)> callback)
void notifyWaitOnImageEnded(KisImage *image)
void notifyGeneralWaitEnded()
bool guiThreadIsWaitingForBetterWeather() const
static KisBusyWaitBroker * instance()
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
std::function< void(KisImageSP)> feedbackCallback
QHash< KisImage *, int > waitingOnImages