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