Title: [154823] trunk/Source/WebCore
- Revision
- 154823
- Author
- psola...@apple.com
- Date
- 2013-08-29 11:01:31 -0700 (Thu, 29 Aug 2013)
Log Message
SharedBuffer m_segments and m_dataArray must be exclusive
https://bugs.webkit.org/show_bug.cgi?id=77715
Patch by Pratik Solanki <pratik.sola...@gmail.com> on 2013-08-29
Reviewed by Benjamin Poulain.
When USE(NETWORK_CFDATA_ARRAY_CALLBACK) is enabled, we use m_dataArray to hold the incoming
data. We do not use m_segments. Since they are exclusive in practice, do not define or use
m_segments when NETWORK_CFDATA_ARRAY_CALLBACK is enabled.
No new tests because no functional changes.
* platform/SharedBuffer.cpp:
(WebCore::SharedBuffer::append):
(WebCore::SharedBuffer::clear):
(WebCore::SharedBuffer::copy):
(WebCore::SharedBuffer::buffer):
(WebCore::SharedBuffer::getSomeData):
* platform/SharedBuffer.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (154822 => 154823)
--- trunk/Source/WebCore/ChangeLog 2013-08-29 17:54:22 UTC (rev 154822)
+++ trunk/Source/WebCore/ChangeLog 2013-08-29 18:01:31 UTC (rev 154823)
@@ -1,3 +1,24 @@
+2013-08-29 Pratik Solanki <pratik.sola...@gmail.com>
+
+ SharedBuffer m_segments and m_dataArray must be exclusive
+ https://bugs.webkit.org/show_bug.cgi?id=77715
+
+ Reviewed by Benjamin Poulain.
+
+ When USE(NETWORK_CFDATA_ARRAY_CALLBACK) is enabled, we use m_dataArray to hold the incoming
+ data. We do not use m_segments. Since they are exclusive in practice, do not define or use
+ m_segments when NETWORK_CFDATA_ARRAY_CALLBACK is enabled.
+
+ No new tests because no functional changes.
+
+ * platform/SharedBuffer.cpp:
+ (WebCore::SharedBuffer::append):
+ (WebCore::SharedBuffer::clear):
+ (WebCore::SharedBuffer::copy):
+ (WebCore::SharedBuffer::buffer):
+ (WebCore::SharedBuffer::getSomeData):
+ * platform/SharedBuffer.h:
+
2013-08-29 Daniel Bates <daba...@apple.com>
[iOS] Upstream changes to WebCore/style
Modified: trunk/Source/WebCore/platform/SharedBuffer.cpp (154822 => 154823)
--- trunk/Source/WebCore/platform/SharedBuffer.cpp 2013-08-29 17:54:22 UTC (rev 154822)
+++ trunk/Source/WebCore/platform/SharedBuffer.cpp 2013-08-29 18:01:31 UTC (rev 154823)
@@ -171,7 +171,8 @@
return;
maybeTransferPlatformData();
-
+
+#if !USE(NETWORK_CFDATA_ARRAY_CALLBACK)
unsigned positionInSegment = offsetInSegment(m_size - m_buffer.size());
m_size += length;
@@ -204,6 +205,12 @@
m_segments.append(segment);
bytesToCopy = min(length, segmentSize);
}
+#else
+ m_size += length;
+ if (m_buffer.isEmpty())
+ m_buffer.reserveInitialCapacity(length);
+ m_buffer.append(data, length);
+#endif
}
void SharedBuffer::append(const Vector<char>& data)
@@ -215,17 +222,18 @@
{
clearPlatformData();
+#if !USE(NETWORK_CFDATA_ARRAY_CALLBACK)
for (unsigned i = 0; i < m_segments.size(); ++i)
freeSegment(m_segments[i]);
m_segments.clear();
+#else
+ m_dataArray.clear();
+#endif
+
m_size = 0;
-
m_buffer.clear();
m_purgeableBuffer.clear();
-#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
- m_dataArray.clear();
-#endif
}
PassRefPtr<SharedBuffer> SharedBuffer::copy() const
@@ -239,8 +247,13 @@
clone->m_size = m_size;
clone->m_buffer.reserveCapacity(m_size);
clone->m_buffer.append(m_buffer.data(), m_buffer.size());
+#if !USE(NETWORK_CFDATA_ARRAY_CALLBACK)
for (unsigned i = 0; i < m_segments.size(); ++i)
clone->m_buffer.append(m_segments[i], segmentSize);
+#else
+ for (unsigned i = 0; i < m_dataArray.size(); ++i)
+ clone->append(m_dataArray[i].get());
+#endif
return clone;
}
@@ -257,6 +270,7 @@
m_buffer.resize(m_size);
char* destination = m_buffer.data() + bufferSize;
unsigned bytesLeft = m_size - bufferSize;
+#if !USE(NETWORK_CFDATA_ARRAY_CALLBACK)
for (unsigned i = 0; i < m_segments.size(); ++i) {
unsigned bytesToCopy = min(bytesLeft, segmentSize);
memcpy(destination, m_segments[i], bytesToCopy);
@@ -265,7 +279,7 @@
freeSegment(m_segments[i]);
}
m_segments.clear();
-#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
+#else
copyDataArrayAndClear(destination, bytesLeft);
#endif
}
@@ -294,6 +308,7 @@
}
position -= consecutiveSize;
+#if !USE(NETWORK_CFDATA_ARRAY_CALLBACK)
unsigned segments = m_segments.size();
unsigned maxSegmentedSize = segments * segmentSize;
unsigned segment = segmentIndex(position);
@@ -305,13 +320,10 @@
someData = m_segments[segment] + positionInSegment;
return segment == segments - 1 ? segmentedSize - position : segmentSize - positionInSegment;
}
-#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
- ASSERT(maxSegmentedSize <= position);
- position -= maxSegmentedSize;
- return copySomeDataFromDataArray(someData, position);
-#else
ASSERT_NOT_REACHED();
return 0;
+#else
+ return copySomeDataFromDataArray(someData, position);
#endif
}
Modified: trunk/Source/WebCore/platform/SharedBuffer.h (154822 => 154823)
--- trunk/Source/WebCore/platform/SharedBuffer.h 2013-08-29 17:54:22 UTC (rev 154822)
+++ trunk/Source/WebCore/platform/SharedBuffer.h 2013-08-29 18:01:31 UTC (rev 154823)
@@ -137,13 +137,14 @@
unsigned m_size;
mutable Vector<char> m_buffer;
- mutable Vector<char*> m_segments;
mutable OwnPtr<PurgeableBuffer> m_purgeableBuffer;
#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
mutable Vector<RetainPtr<CFDataRef> > m_dataArray;
void copyDataArrayAndClear(char *destination, unsigned bytesToCopy) const;
unsigned copySomeDataFromDataArray(const char*& someData, unsigned position) const;
const char *singleDataArrayBuffer() const;
+#else
+ mutable Vector<char*> m_segments;
#endif
#if USE(CF)
explicit SharedBuffer(CFDataRef);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes