File indexing completed on 2024-05-05 04:38:46

0001 /*
0002     SPDX-FileCopyrightText: 2009 David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #ifndef KDEVPLATFORM_KSHAREDOBJECT_H
0008 #define KDEVPLATFORM_KSHAREDOBJECT_H
0009 
0010 #include <QSharedData>
0011 #include <QObject>
0012 
0013 namespace KDevelop {
0014 
0015 struct FakeAtomic
0016 {
0017     inline FakeAtomic(QObject& object, QSharedData& real) : m_object(object)
0018         , m_real(real)
0019     {
0020     }
0021     inline operator int() const
0022     {
0023         const int value = m_real.ref.loadAcquire();
0024         if (value == 0)
0025             return 1; //Always return true, because we handle the deleting by ourself using deleteLater
0026         return value;
0027     }
0028 
0029     inline bool ref()
0030     {
0031         return m_real.ref.ref();
0032     }
0033 
0034     inline bool deref()
0035     {
0036         bool ret = m_real.ref.deref();
0037         if (!ret)
0038             m_object.deleteLater();
0039 
0040         return true; //Always return true, because we handle the deleting by ourself
0041     }
0042 
0043     inline int loadRelaxed() const
0044     {
0045         return m_real.ref.loadRelaxed();
0046     }
0047 
0048     QObject& m_object;
0049     QSharedData& m_real;
0050 };
0051 
0052 /**
0053  * Wrapper around QSharedData for use with KSharedPtr when the object is based on QObject as well.
0054  * Instead of deleting the object once the reference-count reaches zero, QObject::deleteLater() is called.
0055  * This prevents a possible crash when the reference-count reaches zero during event-processing while the queue
0056  * contains events to be delivered to that object.
0057  *
0058  * Notice however that the object will not be deleted immediately, which may lead to unintended behavior.
0059  */
0060 struct KSharedObject : public QSharedData
0061 {
0062     inline explicit KSharedObject(QObject& object) : ref(object, *this)
0063     {
0064     }
0065 
0066     mutable FakeAtomic ref;
0067 };
0068 
0069 }
0070 
0071 #endif