Remove shared_empty and unsharable_empty from API
authorJoão Abecasis <joao.abecasis@nokia.com>
Thu, 5 Jan 2012 15:29:42 +0000 (16:29 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 6 Jan 2012 20:22:07 +0000 (21:22 +0100)
They still exist and help avoid allocation of "empty" array headers, but
they're no longer part of the public API, thus reducing relocatable
symbols and relocations in inline code.

This means an extra non-inline call on QArrayDataPointer::clear and
setSharable operations, which are (expensive) detaching operations,
anyway.

Change-Id: Iea804e5ddc8af55ebc0951ca17a7a4e8401abc55
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/tools/qarraydata.cpp
src/corelib/tools/qarraydata.h
src/corelib/tools/qarraydatapointer.h
tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp

index c6e96c7..150f23c 100644 (file)
@@ -44,8 +44,9 @@
 QT_BEGIN_NAMESPACE
 
 const QArrayData QArrayData::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, 0 };
-const QArrayData QArrayData::shared_empty = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, 0 };
-const QArrayData QArrayData::unsharable_empty = { { Q_BASIC_ATOMIC_INITIALIZER(0) }, 0, 0, 0, 0 };
+
+static const QArrayData qt_array_empty = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, 0 };
+static const QArrayData qt_array_unsharable_empty = { { Q_BASIC_ATOMIC_INITIALIZER(0) }, 0, 0, 0, 0 };
 
 QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
         size_t capacity, bool reserve, bool sharable)
@@ -57,8 +58,8 @@ QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
     // Don't allocate empty headers
     if (!capacity)
         return sharable
-            ? const_cast<QArrayData *>(&shared_empty)
-            : const_cast<QArrayData *>(&unsharable_empty);
+            ? const_cast<QArrayData *>(&qt_array_empty)
+            : const_cast<QArrayData *>(&qt_array_unsharable_empty);
 
     // Allocate extra (alignment - Q_ALIGNOF(QArrayData)) padding bytes so we
     // can properly align the data array. This assumes malloc is able to
@@ -90,7 +91,7 @@ void QArrayData::deallocate(QArrayData *data, size_t objectSize,
             && !(alignment & (alignment - 1)));
     Q_UNUSED(objectSize) Q_UNUSED(alignment)
 
-    if (data == &unsharable_empty)
+    if (data == &qt_array_unsharable_empty)
         return;
 
     qFree(data);
index 1fd60e2..2486beb 100644 (file)
@@ -79,8 +79,6 @@ struct Q_CORE_EXPORT QArrayData
             size_t alignment);
 
     static const QArrayData shared_null;
-    static const QArrayData shared_empty;
-    static const QArrayData unsharable_empty;
 };
 
 template <class T>
@@ -117,18 +115,6 @@ struct QTypedArrayData
         return static_cast<QTypedArrayData *>(
                 const_cast<QArrayData *>(&QArrayData::shared_null));
     }
-
-    static QTypedArrayData *sharedEmpty()
-    {
-        return static_cast<QTypedArrayData *>(
-                const_cast<QArrayData *>(&QArrayData::shared_empty));
-    }
-
-    static QTypedArrayData *unsharableEmpty()
-    {
-        return static_cast<QTypedArrayData *>(
-                const_cast<QArrayData *>(&QArrayData::unsharable_empty));
-    }
 };
 
 template <class T, size_t N>
index e42d146..c03e2ef 100644 (file)
@@ -115,12 +115,7 @@ public:
     void setSharable(bool sharable)
     {
         if (d->alloc == 0 && d->size == 0) {
-            Q_ASSERT(Data::sharedNull() == d
-                    || Data::sharedEmpty() == d
-                    || Data::unsharableEmpty() == d);
-            d = sharable
-                ? Data::sharedEmpty()
-                : Data::unsharableEmpty();
+            d = Data::allocate(0, false, sharable);
             return;
         }
 
@@ -136,7 +131,7 @@ public:
     void clear()
     {
         QArrayDataPointer tmp(d);
-        d = Data::sharedEmpty();
+        d = Data::allocate(0);
     }
 
     bool detach()
index e8edab2..47d5e2a 100644 (file)
@@ -153,7 +153,7 @@ void tst_QArrayData::referenceCounting()
 void tst_QArrayData::sharedNullEmpty()
 {
     QArrayData *null = const_cast<QArrayData *>(&QArrayData::shared_null);
-    QArrayData *empty = const_cast<QArrayData *>(&QArrayData::shared_empty);
+    QArrayData *empty = QArrayData::allocate(1, Q_ALIGNOF(QArrayData), 0, false, true);
 
     QVERIFY(null->ref.isStatic());
     QVERIFY(null->ref.isSharable());
@@ -492,16 +492,22 @@ void tst_QArrayData::allocate_data()
         { "void *", sizeof(void *), Q_ALIGNOF(void *) }
     };
 
+    QArrayData *shared_empty = QArrayData::allocate(0, Q_ALIGNOF(QArrayData), 0, false, true);
+    QArrayData *unsharable_empty = QArrayData::allocate(0, Q_ALIGNOF(QArrayData), 0, false, false);
+
+    QVERIFY(shared_empty);
+    QVERIFY(unsharable_empty);
+
     struct {
         char const *description;
         bool isCapacityReserved;
         bool isSharable;
         const QArrayData *commonEmpty;
     } options[] = {
-        { "Default", false, true, &QArrayData::shared_empty },
-        { "Reserved", true, true, &QArrayData::shared_empty },
-        { "Reserved | Unsharable", true, false, &QArrayData::unsharable_empty },
-        { "Unsharable", false, false, &QArrayData::unsharable_empty },
+        { "Default", false, true, shared_empty },
+        { "Reserved", true, true, shared_empty },
+        { "Reserved | Unsharable", true, false, unsharable_empty },
+        { "Unsharable", false, false, unsharable_empty },
     };
 
     for (size_t i = 0; i < sizeof(types)/sizeof(types[0]); ++i)
@@ -635,7 +641,7 @@ void tst_QArrayData::typedData()
 
     {
         QTypedArrayData<int> *null = QTypedArrayData<int>::sharedNull();
-        QTypedArrayData<int> *empty = QTypedArrayData<int>::sharedEmpty();
+        QTypedArrayData<int> *empty = QTypedArrayData<int>::allocate(0);
 
         QVERIFY(null != empty);