Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: webrtc/base/copyonwritebuffer.h

Issue 2328553002: Make CopyOnWriteBuffer keep capacity (Closed)
Patch Set: heap_allocation -> original_allocation Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/base/copyonwritebuffer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 return cdata()[index]; 146 return cdata()[index];
147 } 147 }
148 148
149 // Replace the contents of the buffer. Accepts the same types as the 149 // Replace the contents of the buffer. Accepts the same types as the
150 // constructors. 150 // constructors.
151 template <typename T, 151 template <typename T,
152 typename std::enable_if< 152 typename std::enable_if<
153 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> 153 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
154 void SetData(const T* data, size_t size) { 154 void SetData(const T* data, size_t size) {
155 RTC_DCHECK(IsConsistent()); 155 RTC_DCHECK(IsConsistent());
156 if (!buffer_ || !buffer_->HasOneRef()) { 156 if (!buffer_) {
157 buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size) 157 buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size) : nullptr;
158 : nullptr; 158 } else if (!buffer_->HasOneRef()) {
159 buffer_ = new RefCountedObject<Buffer>(data, size, buffer_->capacity());
159 } else { 160 } else {
160 buffer_->SetData(data, size); 161 buffer_->SetData(data, size);
161 } 162 }
162 RTC_DCHECK(IsConsistent()); 163 RTC_DCHECK(IsConsistent());
163 } 164 }
164 165
165 template <typename T, 166 template <typename T,
166 size_t N, 167 size_t N,
167 typename std::enable_if< 168 typename std::enable_if<
168 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> 169 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 return; 247 return;
247 } else if (capacity <= buffer_->capacity()) { 248 } else if (capacity <= buffer_->capacity()) {
248 return; 249 return;
249 } 250 }
250 251
251 CloneDataIfReferenced(std::max(buffer_->capacity(), capacity)); 252 CloneDataIfReferenced(std::max(buffer_->capacity(), capacity));
252 buffer_->EnsureCapacity(capacity); 253 buffer_->EnsureCapacity(capacity);
253 RTC_DCHECK(IsConsistent()); 254 RTC_DCHECK(IsConsistent());
254 } 255 }
255 256
256 // Resets the buffer to zero size and capacity. 257 // Resets the buffer to zero size without altering capacity. Works even if the
258 // buffer has been moved from.
257 void Clear() { 259 void Clear() {
258 RTC_DCHECK(IsConsistent()); 260 if (!buffer_)
259 if (!buffer_ || !buffer_->HasOneRef()) { 261 return;
260 buffer_ = nullptr; 262
263 if (buffer_->HasOneRef()) {
264 buffer_->Clear();
261 } else { 265 } else {
262 buffer_->Clear(); 266 buffer_ = new RefCountedObject<Buffer>(0, buffer_->capacity());
263 } 267 }
264 RTC_DCHECK(IsConsistent()); 268 RTC_DCHECK(IsConsistent());
265 } 269 }
266 270
267 // Swaps two buffers. 271 // Swaps two buffers.
268 friend void swap(CopyOnWriteBuffer& a, CopyOnWriteBuffer& b) { 272 friend void swap(CopyOnWriteBuffer& a, CopyOnWriteBuffer& b) {
269 std::swap(a.buffer_, b.buffer_); 273 std::swap(a.buffer_, b.buffer_);
270 } 274 }
271 275
272 private: 276 private:
(...skipping 14 matching lines...) Expand all
287 return (!buffer_ || buffer_->capacity() > 0); 291 return (!buffer_ || buffer_->capacity() > 0);
288 } 292 }
289 293
290 // buffer_ is either null, or points to an rtc::Buffer with capacity > 0. 294 // buffer_ is either null, or points to an rtc::Buffer with capacity > 0.
291 scoped_refptr<RefCountedObject<Buffer>> buffer_; 295 scoped_refptr<RefCountedObject<Buffer>> buffer_;
292 }; 296 };
293 297
294 } // namespace rtc 298 } // namespace rtc
295 299
296 #endif // WEBRTC_BASE_COPYONWRITEBUFFER_H_ 300 #endif // WEBRTC_BASE_COPYONWRITEBUFFER_H_
OLDNEW
« no previous file with comments | « no previous file | webrtc/base/copyonwritebuffer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698