summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2012-06-11 13:38:41 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-12 20:09:39 +0200
commit08b3aceffe72668f578707c748c8180dbcf570cd (patch)
treedd71177d37ab31e6fe30c515fff3c39b56d39c99 /src/corelib
parent48b38fb2b042fba5a0e1aed4f6d4fa6f29a51af0 (diff)
Keep the #ifdef for tracking shared pointers in a single function
If we have it in different functions, then different out-of-line implementations could be selected for each object file, resulting in invalid states. The error I caught was when wrapper.cpp was compiled without tracking and, therefore, did not place a call to internalSafetyCheckAdd. However, it called an out-of-line copy of QtSharedPointer::ExternalRefCountWithCustomDeleter::create, which did set the deleter to remove the safety check. Therefore, keep everything in one function. Change-Id: Ib2c6a606699db49d102704bccdd331ec22a8bd78 Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h49
1 files changed, 26 insertions, 23 deletions
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index d22ceb2d69..4a1a499be0 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -200,18 +200,13 @@ namespace QtSharedPointer {
deleter(self);
}
- static inline Self *create(T *ptr, Deleter userDeleter)
+ static inline Self *create(T *ptr, Deleter userDeleter, DestroyerFn actualDeleter)
{
-# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
- DestroyerFn destroy = &safetyCheckDeleter;
-# else
- DestroyerFn destroy = &deleter;
-# endif
Self *d = static_cast<Self *>(::operator new(sizeof(Self)));
// initialize the two sub-objects
new (&d->extra) CustomDeleter(ptr, userDeleter);
- new (d) BaseClass(destroy); // can't throw
+ new (d) BaseClass(actualDeleter); // can't throw
return d;
}
@@ -244,13 +239,8 @@ namespace QtSharedPointer {
deleter(self);
}
- static inline ExternalRefCountData *create(T **ptr)
+ static inline ExternalRefCountData *create(T **ptr, DestroyerFn destroy)
{
-# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
- DestroyerFn destroy = &safetyCheckDeleter;
-# else
- DestroyerFn destroy = &deleter;
-# endif
ExternalRefCountWithContiguousData *d =
static_cast<ExternalRefCountWithContiguousData *>(::operator new(sizeof(ExternalRefCountWithContiguousData)));
@@ -379,12 +369,21 @@ public:
static inline QSharedPointer<T> create()
{
+ typedef QtSharedPointer::ExternalRefCountWithContiguousData<T> Private;
+# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
+ typename Private::DestroyerFn destroy = &Private::safetyCheckDeleter;
+# else
+ typename Private::DestroyerFn destroy = &Private::deleter;
+# endif
QSharedPointer<T> result(Qt::Uninitialized);
- result.d = QtSharedPointer::ExternalRefCountWithContiguousData<T>::create(&result.value);
+ result.d = Private::create(&result.value, destroy);
// now initialize the data
new (result.data()) T();
- result.internalFinishConstruction(result.data());
+ result.d->setQObjectShared(result.value, true);
+# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
+ internalSafetyCheckAdd(result.d, result.value);
+# endif
return result;
}
@@ -406,18 +405,22 @@ private:
template <typename Deleter>
inline void internalConstruct(T *ptr, Deleter deleter)
{
- if (ptr)
- d = QtSharedPointer::ExternalRefCountWithCustomDeleter<T, Deleter>::create(ptr, deleter);
- else
+ if (!ptr) {
d = 0;
- internalFinishConstruction(ptr);
- }
+ return;
+ }
+
+ typedef QtSharedPointer::ExternalRefCountWithCustomDeleter<T, Deleter> Private;
+# ifdef QT_SHAREDPOINTER_TRACK_POINTERS
+ typename Private::DestroyerFn actualDeleter = &Private::safetyCheckDeleter;
+# else
+ typename Private::DestroyerFn actualDeleter = &Private::deleter;
+# endif
+ d = Private::create(ptr, deleter, actualDeleter);
- inline void internalFinishConstruction(T *ptr)
- {
d->setQObjectShared(ptr, true);
#ifdef QT_SHAREDPOINTER_TRACK_POINTERS
- if (ptr) internalSafetyCheckAdd(d, ptr);
+ internalSafetyCheckAdd(d, ptr);
#endif
}