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

Side by Side Diff: courgette/streams.cc

Issue 6716006: Identifying call sites that need to handle out of memory situations in Courgette. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « courgette/streams.h ('k') | courgette/streams_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 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Streams classes. 5 // Streams classes.
6 // 6 //
7 // These memory-resident streams are used for serializing data into a sequential 7 // These memory-resident streams are used for serializing data into a sequential
8 // region of memory. 8 // region of memory.
9 // 9 //
10 // Streams are divided into SourceStreams for reading and SinkStreams for 10 // Streams are divided into SourceStreams for reading and SinkStreams for
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 return true; 174 return true;
175 } 175 }
176 176
177 bool SourceStream::Skip(size_t byte_count) { 177 bool SourceStream::Skip(size_t byte_count) {
178 if (current_ + byte_count > end_) 178 if (current_ + byte_count > end_)
179 return false; 179 return false;
180 current_ += byte_count; 180 current_ += byte_count;
181 return true; 181 return true;
182 } 182 }
183 183
184 void SinkStream::Write(const void* data, size_t byte_count) { 184 CheckBool SinkStream::Write(const void* data, size_t byte_count) {
185 buffer_.append(static_cast<const char*>(data), byte_count); 185 buffer_.append(static_cast<const char*>(data), byte_count);
186 //TODO(tommi): return error on failure.
187 return true;
186 } 188 }
187 189
188 void SinkStream::WriteVarint32(uint32 value) { 190 CheckBool SinkStream::WriteVarint32(uint32 value) {
189 uint8 buffer[Varint::kMax32]; 191 uint8 buffer[Varint::kMax32];
190 uint8* end = Varint::Encode32(buffer, value); 192 uint8* end = Varint::Encode32(buffer, value);
191 Write(buffer, end - buffer); 193 return Write(buffer, end - buffer);
192 } 194 }
193 195
194 void SinkStream::WriteVarint32Signed(int32 value) { 196 CheckBool SinkStream::WriteVarint32Signed(int32 value) {
195 // Encode signed numbers so that numbers nearer zero have shorter 197 // Encode signed numbers so that numbers nearer zero have shorter
196 // varint encoding. 198 // varint encoding.
197 // 0000xxxx encoded as 000xxxx0. 199 // 0000xxxx encoded as 000xxxx0.
198 // 1111xxxx encoded as 000yyyy1 where yyyy is complement of xxxx. 200 // 1111xxxx encoded as 000yyyy1 where yyyy is complement of xxxx.
201 bool ret;
199 if (value < 0) 202 if (value < 0)
200 WriteVarint32(~value * 2 + 1); 203 ret = WriteVarint32(~value * 2 + 1);
201 else 204 else
202 WriteVarint32(value * 2); 205 ret = WriteVarint32(value * 2);
206 return ret;
203 } 207 }
204 208
205 void SinkStream::WriteSizeVarint32(size_t value) { 209 CheckBool SinkStream::WriteSizeVarint32(size_t value) {
206 uint32 narrowed_value = static_cast<uint32>(value); 210 uint32 narrowed_value = static_cast<uint32>(value);
207 // On 32-bit, the compiler should figure out this test always fails. 211 // On 32-bit, the compiler should figure out this test always fails.
208 LOG_ASSERT(value == narrowed_value); 212 LOG_ASSERT(value == narrowed_value);
209 WriteVarint32(narrowed_value); 213 return WriteVarint32(narrowed_value);
210 } 214 }
211 215
212 void SinkStream::Append(SinkStream* other) { 216 CheckBool SinkStream::Append(SinkStream* other) {
213 Write(other->buffer_.c_str(), other->buffer_.size()); 217 bool ret = Write(other->buffer_.c_str(), other->buffer_.size());
214 other->Retire(); 218 if (ret)
219 other->Retire();
220 return ret;
215 } 221 }
216 222
217 void SinkStream::Retire() { 223 void SinkStream::Retire() {
218 buffer_.clear(); 224 buffer_.clear();
219 buffer_.reserve(0); // Non-binding request to reduce storage. 225 buffer_.reserve(0); // Non-binding request to reduce storage.
220 } 226 }
221 227
222 //////////////////////////////////////////////////////////////////////////////// 228 ////////////////////////////////////////////////////////////////////////////////
223 229
224 SourceStreamSet::SourceStreamSet() 230 SourceStreamSet::SourceStreamSet()
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 325
320 SinkStreamSet::~SinkStreamSet() { 326 SinkStreamSet::~SinkStreamSet() {
321 } 327 }
322 328
323 void SinkStreamSet::Init(size_t stream_index_limit) { 329 void SinkStreamSet::Init(size_t stream_index_limit) {
324 count_ = stream_index_limit; 330 count_ = stream_index_limit;
325 } 331 }
326 332
327 // The header for a stream set for N streams is serialized as 333 // The header for a stream set for N streams is serialized as
328 // <version><N><length1><length2>...<lengthN> 334 // <version><N><length1><length2>...<lengthN>
329 void SinkStreamSet::CopyHeaderTo(SinkStream* header) { 335 CheckBool SinkStreamSet::CopyHeaderTo(SinkStream* header) {
330 header->WriteVarint32(kStreamsSerializationFormatVersion); 336 bool ret = header->WriteVarint32(kStreamsSerializationFormatVersion);
331 header->WriteSizeVarint32(count_); 337 if (ret) {
332 for (size_t i = 0; i < count_; ++i) { 338 ret = header->WriteSizeVarint32(count_);
333 header->WriteSizeVarint32(stream(i)->Length()); 339 for (size_t i = 0; ret && i < count_; ++i) {
340 ret = header->WriteSizeVarint32(stream(i)->Length());
341 }
334 } 342 }
343 return ret;
335 } 344 }
336 345
337 // Writes |this| to |combined_stream|. See SourceStreamSet::Init for the layout 346 // Writes |this| to |combined_stream|. See SourceStreamSet::Init for the layout
338 // of the stream metadata and contents. 347 // of the stream metadata and contents.
339 bool SinkStreamSet::CopyTo(SinkStream *combined_stream) { 348 CheckBool SinkStreamSet::CopyTo(SinkStream *combined_stream) {
340 SinkStream header; 349 SinkStream header;
341 CopyHeaderTo(&header); 350 bool ret = CopyHeaderTo(&header);
351 if (!ret)
352 return ret;
342 353
343 // Reserve the correct amount of storage. 354 // Reserve the correct amount of storage.
344 size_t length = header.Length(); 355 size_t length = header.Length();
345 for (size_t i = 0; i < count_; ++i) { 356 for (size_t i = 0; i < count_; ++i) {
346 length += stream(i)->Length(); 357 length += stream(i)->Length();
347 } 358 }
348 combined_stream->Reserve(length); 359 ret = combined_stream->Reserve(length);
349 360 if (ret) {
350 combined_stream->Append(&header); 361 ret = combined_stream->Append(&header);
351 for (size_t i = 0; i < count_; ++i) { 362 for (size_t i = 0; ret && i < count_; ++i) {
352 combined_stream->Append(stream(i)); 363 ret = combined_stream->Append(stream(i));
364 }
353 } 365 }
354 return true; 366 return ret;
355 } 367 }
356 368
357 bool SinkStreamSet::WriteSet(SinkStreamSet* set) { 369 CheckBool SinkStreamSet::WriteSet(SinkStreamSet* set) {
358 uint32 lengths[kMaxStreams]; 370 uint32 lengths[kMaxStreams];
359 // 'stream_count' includes all non-empty streams and all empty stream numbered 371 // 'stream_count' includes all non-empty streams and all empty stream numbered
360 // lower than a non-empty stream. 372 // lower than a non-empty stream.
361 size_t stream_count = 0; 373 size_t stream_count = 0;
362 for (size_t i = 0; i < kMaxStreams; ++i) { 374 for (size_t i = 0; i < kMaxStreams; ++i) {
363 SinkStream* stream = set->stream(i); 375 SinkStream* stream = set->stream(i);
364 lengths[i] = static_cast<uint32>(stream->Length()); 376 lengths[i] = static_cast<uint32>(stream->Length());
365 if (lengths[i] > 0) 377 if (lengths[i] > 0)
366 stream_count = i + 1; 378 stream_count = i + 1;
367 } 379 }
368 380
369 SinkStream* control_stream = this->stream(0); 381 SinkStream* control_stream = this->stream(0);
370 control_stream->WriteSizeVarint32(stream_count); 382 bool ret = control_stream->WriteSizeVarint32(stream_count);
371 for (size_t i = 0; i < stream_count; ++i) { 383 for (size_t i = 0; ret && i < stream_count; ++i) {
372 control_stream->WriteSizeVarint32(lengths[i]); 384 ret = control_stream->WriteSizeVarint32(lengths[i]);
373 } 385 }
374 386
375 for (size_t i = 0; i < stream_count; ++i) { 387 for (size_t i = 0; ret && i < stream_count; ++i) {
376 this->stream(i)->Append(set->stream(i)); 388 ret = this->stream(i)->Append(set->stream(i));
377 } 389 }
378 return true; 390 return ret;
379 } 391 }
380 392
381 } // namespace 393 } // namespace
OLDNEW
« no previous file with comments | « courgette/streams.h ('k') | courgette/streams_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698