aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkRWBuffer.h5
-rw-r--r--src/core/SkRWBuffer.cpp7
-rw-r--r--tests/DataRefTest.cpp40
3 files changed, 8 insertions, 44 deletions
diff --git a/include/core/SkRWBuffer.h b/include/core/SkRWBuffer.h
index ff807766d0..d054e0a5fd 100644
--- a/include/core/SkRWBuffer.h
+++ b/include/core/SkRWBuffer.h
@@ -67,9 +67,8 @@ private:
/**
* Accumulates bytes of memory that are "appended" to it, growing internal storage as needed.
- * The growth is done such that at any time in the writer's thread, an RBuffer or StreamAsset
- * can be snapped off (and safely passed to another thread). The RBuffer/StreamAsset snapshot
- * can see the previously stored bytes, but will be unaware of any future writes.
+ * The growth is done such that at any time, a RBuffer or StreamAsset can be snapped off, which
+ * can see the previously stored bytes, but which will be unaware of any future writes.
*/
class SK_API SkRWBuffer {
public:
diff --git a/src/core/SkRWBuffer.cpp b/src/core/SkRWBuffer.cpp
index bbf88ddfe3..f0b565edf3 100644
--- a/src/core/SkRWBuffer.cpp
+++ b/src/core/SkRWBuffer.cpp
@@ -42,8 +42,6 @@ struct SkBufferBlock {
return amount;
}
- // Do not call in the reader thread, since the writer may be updating fUsed.
- // (The assertion is still true, but TSAN still may complain about its raciness.)
void validate() const {
#ifdef SK_DEBUG
SkASSERT(fCapacity > 0);
@@ -96,7 +94,7 @@ struct SkBufferHead {
}
}
- void validate(size_t minUsed, const SkBufferBlock* tail = nullptr) const {
+ void validate(size_t minUsed, SkBufferBlock* tail = nullptr) const {
#ifdef SK_DEBUG
SkASSERT(fRefCnt > 0);
size_t totalUsed = 0;
@@ -134,6 +132,7 @@ SkROBuffer::SkROBuffer(const SkBufferHead* head, size_t available)
SkROBuffer::~SkROBuffer() {
if (fHead) {
+ fHead->validate(fAvailable);
fHead->unref();
}
}
@@ -143,7 +142,7 @@ SkROBuffer::Iter::Iter(const SkROBuffer* buffer) {
}
void SkROBuffer::Iter::reset(const SkROBuffer* buffer) {
- if (buffer && buffer->fHead) {
+ if (buffer) {
fBlock = &buffer->fHead->fBlock;
fRemaining = buffer->fAvailable;
} else {
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp
index 4bfbff4638..002abcbe89 100644
--- a/tests/DataRefTest.cpp
+++ b/tests/DataRefTest.cpp
@@ -245,7 +245,7 @@ static void check_abcs(skiatest::Reporter* reporter, const char buffer[], size_t
}
}
-// stream should contain an integral number of copies of gABC.
+// stream should contains an integral number of copies of gABC.
static void check_alphabet_stream(skiatest::Reporter* reporter, SkStream* stream) {
REPORTER_ASSERT(reporter, stream->hasLength());
size_t size = stream->getLength();
@@ -284,8 +284,6 @@ static void check_alphabet_buffer(skiatest::Reporter* reporter, const SkROBuffer
check_abcs(reporter, storage.get(), size);
}
-#include "SkTaskGroup.h"
-
DEF_TEST(RWBuffer, reporter) {
// Knowing that the default capacity is 4096, choose N large enough so we force it to use
// multiple buffers internally.
@@ -294,31 +292,17 @@ DEF_TEST(RWBuffer, reporter) {
SkStream* streams[N];
{
- SkTaskGroup tasks;
SkRWBuffer buffer;
for (int i = 0; i < N; ++i) {
buffer.append(gABC, 26);
readers[i] = buffer.newRBufferSnapshot();
streams[i] = buffer.newStreamSnapshot();
- REPORTER_ASSERT(reporter, readers[i]->size() == buffer.size());
- REPORTER_ASSERT(reporter, streams[i]->getLength() == buffer.size());
-
- tasks.add([reporter, i, &readers, &streams] {
- REPORTER_ASSERT(reporter, (i + 1) * 26U == readers[i]->size());
- REPORTER_ASSERT(reporter, streams[i]->getLength() == readers[i]->size());
- check_alphabet_buffer(reporter, readers[i]);
- check_alphabet_stream(reporter, streams[i]);
- REPORTER_ASSERT(reporter, streams[i]->rewind());
- });
}
REPORTER_ASSERT(reporter, N*26 == buffer.size());
- tasks.wait();
}
- // Test again, to verify that the snapshots work even after the SkRWBuffer is gone.
for (int i = 0; i < N; ++i) {
REPORTER_ASSERT(reporter, (i + 1) * 26U == readers[i]->size());
- REPORTER_ASSERT(reporter, streams[i]->getLength() == readers[i]->size());
check_alphabet_buffer(reporter, readers[i]);
check_alphabet_stream(reporter, streams[i]);
readers[i]->unref();
@@ -341,27 +325,9 @@ DEF_TEST(RWBuffer_size, r) {
REPORTER_ASSERT(r, 0 == iter.size());
}
-// Tests that operations (including the destructor) are safe on an SkRWBuffer
-// without any data appended.
+// Tests that it is safe to destruct an SkRWBuffer without appending
+// anything to it.
DEF_TEST(RWBuffer_noAppend, r) {
SkRWBuffer buffer;
REPORTER_ASSERT(r, 0 == buffer.size());
-
- sk_sp<SkROBuffer> roBuffer = sk_sp<SkROBuffer>(buffer.newRBufferSnapshot());
- REPORTER_ASSERT(r, roBuffer);
- if (roBuffer) {
- REPORTER_ASSERT(r, roBuffer->size() == 0);
- SkROBuffer::Iter iter(roBuffer.get());
- REPORTER_ASSERT(r, iter.size() == 0);
- REPORTER_ASSERT(r, !iter.data());
- REPORTER_ASSERT(r, !iter.next());
- }
-
- SkAutoTDelete<SkStream> stream(buffer.newStreamSnapshot());
- REPORTER_ASSERT(r, stream);
- if (stream) {
- REPORTER_ASSERT(r, stream->hasLength());
- REPORTER_ASSERT(r, stream->getLength() == 0);
- REPORTER_ASSERT(r, stream->skip(10) == 0);
- }
}