diff options
Diffstat (limited to 'plugin/src/Caelestia/Services/service.cpp')
| -rw-r--r-- | plugin/src/Caelestia/Services/service.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/plugin/src/Caelestia/Services/service.cpp b/plugin/src/Caelestia/Services/service.cpp new file mode 100644 index 0000000..bc919c9 --- /dev/null +++ b/plugin/src/Caelestia/Services/service.cpp @@ -0,0 +1,70 @@ +#include "service.hpp" + +#include <qdebug.h> +#include <qpointer.h> + +namespace caelestia { + +Service::Service(QObject* parent) + : QObject(parent) + , m_refCount(0) {} + +int Service::refCount() const { + QMutexLocker locker(&m_mutex); + return m_refCount; +} + +void Service::ref() { + bool needsStart = false; + + { + QMutexLocker locker(&m_mutex); + if (m_refCount == 0) { + needsStart = true; + } + m_refCount++; + } + emit refCountChanged(); + + if (needsStart) { + const QPointer<Service> self(this); + QMetaObject::invokeMethod( + this, + [self]() { + if (self) { + self->start(); + } + }, + Qt::QueuedConnection); + } +} + +void Service::unref() { + bool needsStop = false; + + { + QMutexLocker locker(&m_mutex); + if (m_refCount == 0) { + return; + } + m_refCount--; + if (m_refCount == 0) { + needsStop = true; + } + } + emit refCountChanged(); + + if (needsStop) { + const QPointer<Service> self(this); + QMetaObject::invokeMethod( + this, + [self]() { + if (self) { + self->stop(); + } + }, + Qt::QueuedConnection); + } +} + +} // namespace caelestia |