From e6c50609c8a098304ab6b2a41aa371563ba45d2e Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 20 Aug 2012 15:52:19 +0200 Subject: [PATCH] QSlotObjectBase: make 'impl' and 'ref' private This allows to fold the deref() and the destroy() operations into one, destroyIfLastRef(). The member variables were renamed since there's now a member function of the same name (ref()). Change-Id: Ib94416d9e658065bbf5d3711ecafaf0eb063af17 Reviewed-by: Thiago Macieira Reviewed-by: Olivier Goffart --- src/corelib/kernel/qobject.cpp | 24 +++++++++++------------- src/corelib/kernel/qobject_impl.h | 17 ++++++++++------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 84c4653..c1f8a6c 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -74,7 +74,7 @@ static int DIRECT_CONNECTION_ONLY = 0; struct QSlotObjectBaseDeleter { // for use with QScopedPointer static void cleanup(QtPrivate::QSlotObjectBase *slot) { - if (slot && !slot->ref.deref() ) slot->destroy(); + if (slot) slot->destroyIfLastRef(); } }; static int *queuedConnectionTypes(const QList &typeNames) @@ -444,7 +444,7 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, const QObject callFunction_(0), method_offset_(0), method_relative_(ushort(-1)) { if (slotObj_) - slotObj_->ref.ref(); + slotObj_->ref(); } /*! @@ -464,8 +464,8 @@ QMetaCallEvent::~QMetaCallEvent() if (semaphore_) semaphore_->release(); #endif - if (slotObj_ && !slotObj_->ref.deref()) - slotObj_->destroy(); + if (slotObj_) + slotObj_->destroyIfLastRef(); } /*! @@ -869,8 +869,8 @@ QObjectPrivate::Connection::~Connection() if (v != &DIRECT_CONNECTION_ONLY) delete [] v; } - if (isSlotObject && !slotObj->ref.deref()) - slotObj->destroy(); + if (isSlotObject) + slotObj->destroyIfLastRef(); } @@ -3426,7 +3426,7 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction; const int method_relative = c->method_relative; if (c->isSlotObject) { - c->slotObj->ref.ref(); + c->slotObj->ref(); const QScopedPointer obj(c->slotObj); locker.unlock(); obj->call(receiver, argv ? argv : empty_argv); @@ -4205,8 +4205,8 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa { if (!sender || !signal || !slotObj || !senderMetaObject) { qWarning("QObject::connect: invalid null parametter"); - if (slotObj && !slotObj->ref.deref()) - slotObj->destroy(); + if (slotObj) + slotObj->destroyIfLastRef(); return QMetaObject::Connection(); } int signal_index = -1; @@ -4214,8 +4214,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); if (signal_index < 0 || signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount) { qWarning("QObject::connect: signal not found in %s", senderMetaObject->className()); - if (!slotObj->ref.deref()) - slotObj->destroy(); + slotObj->destroyIfLastRef(); return QMetaObject::Connection(0); } signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); @@ -4234,8 +4233,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa while (c2) { if (c2->receiver == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { - if (!slotObj->ref.deref()) - slotObj->destroy(); + slotObj->destroyIfLastRef(); return QMetaObject::Connection(); } c2 = c2->nextConnectionList; diff --git a/src/corelib/kernel/qobject_impl.h b/src/corelib/kernel/qobject_impl.h index 9eda421..3ed4708 100644 --- a/src/corelib/kernel/qobject_impl.h +++ b/src/corelib/kernel/qobject_impl.h @@ -101,13 +101,13 @@ namespace QtPrivate { #endif // internal base class (interface) containing functions required to call a slot managed by a pointer to function. - struct QSlotObjectBase { - QAtomicInt ref; + class QSlotObjectBase { + QAtomicInt m_ref; // don't use virtual functions here; we don't want the // compiler to create tons of per-polymorphic-class stuff that // we'll never need. We just use one function pointer. typedef void (*ImplFn)(int which, QSlotObjectBase* this_, QObject *receiver, void **args, bool *ret); - const ImplFn impl; + const ImplFn m_impl; protected: enum Operation { Destroy, @@ -117,11 +117,14 @@ namespace QtPrivate { NumOperations }; public: - explicit QSlotObjectBase(ImplFn fn) : ref(1), impl(fn) {} + explicit QSlotObjectBase(ImplFn fn) : m_ref(1), m_impl(fn) {} - inline void destroy() { impl(Destroy, this, 0, 0, 0); } - inline bool compare(void **a) { bool ret; impl(Compare, this, 0, a, &ret); return ret; } - inline void call(QObject *r, void **a) { impl(Call, this, r, a, 0); } + inline int ref() Q_DECL_NOTHROW { return m_ref.ref(); } + inline void destroyIfLastRef() Q_DECL_NOTHROW + { if (!m_ref.deref()) m_impl(Destroy, this, 0, 0, 0); } + + inline bool compare(void **a) { bool ret; m_impl(Compare, this, 0, a, &ret); return ret; } + inline void call(QObject *r, void **a) { m_impl(Call, this, r, a, 0); } protected: ~QSlotObjectBase() {} }; -- 2.7.4