Make CopyOnWriteBuffer keep capacity

for SetData and Clear functions too.

This way result of all functions is same
for shared and non-shared buffer cases

R=kwiberg@webrtc.org

Review URL: https://codereview.webrtc.org/2328553002 .

Cr-Commit-Position: refs/heads/master@{#14196}
This commit is contained in:
Danil Chapovalov
2016-09-13 14:15:10 +02:00
parent 9708884c31
commit 2b2779f3f1
2 changed files with 107 additions and 44 deletions

View File

@ -153,9 +153,10 @@ class CopyOnWriteBuffer {
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
void SetData(const T* data, size_t size) {
RTC_DCHECK(IsConsistent());
if (!buffer_ || !buffer_->HasOneRef()) {
buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size)
: nullptr;
if (!buffer_) {
buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size) : nullptr;
} else if (!buffer_->HasOneRef()) {
buffer_ = new RefCountedObject<Buffer>(data, size, buffer_->capacity());
} else {
buffer_->SetData(data, size);
}
@ -253,13 +254,16 @@ class CopyOnWriteBuffer {
RTC_DCHECK(IsConsistent());
}
// Resets the buffer to zero size and capacity.
// Resets the buffer to zero size without altering capacity. Works even if the
// buffer has been moved from.
void Clear() {
RTC_DCHECK(IsConsistent());
if (!buffer_ || !buffer_->HasOneRef()) {
buffer_ = nullptr;
} else {
if (!buffer_)
return;
if (buffer_->HasOneRef()) {
buffer_->Clear();
} else {
buffer_ = new RefCountedObject<Buffer>(0, buffer_->capacity());
}
RTC_DCHECK(IsConsistent());
}