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

Side by Side Diff: webrtc/base/stream.cc

Issue 1245143005: Remove CircularFileStream / replace it with CallSessionFileRotatingStream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Add GetSize to FileRotatingStream Created 5 years, 5 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 | « webrtc/base/stream.h ('k') | webrtc/base/stream_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 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 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 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 510
511 return flock(fileno(file_), LOCK_UN) == 0; 511 return flock(fileno(file_), LOCK_UN) == 0;
512 } 512 }
513 513
514 #endif 514 #endif
515 515
516 void FileStream::DoClose() { 516 void FileStream::DoClose() {
517 fclose(file_); 517 fclose(file_);
518 } 518 }
519 519
520 CircularFileStream::CircularFileStream(size_t max_size)
521 : max_write_size_(max_size),
522 position_(0),
523 marked_position_(max_size / 2),
524 last_write_position_(0),
525 read_segment_(READ_LATEST),
526 read_segment_available_(0) {
527 }
528
529 bool CircularFileStream::Open(const std::string& filename,
530 const char* mode,
531 int* error) {
532 if (!FileStream::Open(filename.c_str(), mode, error))
533 return false;
534
535 if (strchr(mode, "r") != NULL) { // Opened in read mode.
536 // Check if the buffer has been overwritten and determine how to read the
537 // log in time sequence.
538 size_t file_size;
539 GetSize(&file_size);
540 if (file_size == position_) {
541 // The buffer has not been overwritten yet. Read 0 .. file_size
542 read_segment_ = READ_LATEST;
543 read_segment_available_ = file_size;
544 } else {
545 // The buffer has been over written. There are three segments: The first
546 // one is 0 .. marked_position_, which is the marked earliest log. The
547 // second one is position_ .. file_size, which is the middle log. The
548 // last one is marked_position_ .. position_, which is the latest log.
549 read_segment_ = READ_MARKED;
550 read_segment_available_ = marked_position_;
551 last_write_position_ = position_;
552 }
553
554 // Read from the beginning.
555 position_ = 0;
556 SetPosition(position_);
557 }
558
559 return true;
560 }
561
562 StreamResult CircularFileStream::Read(void* buffer,
563 size_t buffer_len,
564 size_t* read,
565 int* error) {
566 if (read_segment_available_ == 0) {
567 size_t file_size;
568 switch (read_segment_) {
569 case READ_MARKED: // Finished READ_MARKED and start READ_MIDDLE.
570 read_segment_ = READ_MIDDLE;
571 position_ = last_write_position_;
572 SetPosition(position_);
573 GetSize(&file_size);
574 read_segment_available_ = file_size - position_;
575 break;
576
577 case READ_MIDDLE: // Finished READ_MIDDLE and start READ_LATEST.
578 read_segment_ = READ_LATEST;
579 position_ = marked_position_;
580 SetPosition(position_);
581 read_segment_available_ = last_write_position_ - position_;
582 break;
583
584 default: // Finished READ_LATEST and return EOS.
585 return rtc::SR_EOS;
586 }
587 }
588
589 size_t local_read;
590 if (!read)
591 read = &local_read;
592
593 size_t to_read = std::min(buffer_len, read_segment_available_);
594 rtc::StreamResult result =
595 rtc::FileStream::Read(buffer, to_read, read, error);
596 if (result == rtc::SR_SUCCESS) {
597 read_segment_available_ -= *read;
598 position_ += *read;
599 }
600 return result;
601 }
602
603 StreamResult CircularFileStream::Write(const void* data,
604 size_t data_len,
605 size_t* written,
606 int* error) {
607 if (position_ >= max_write_size_) {
608 ASSERT(position_ == max_write_size_);
609 position_ = marked_position_;
610 SetPosition(position_);
611 }
612
613 size_t local_written;
614 if (!written)
615 written = &local_written;
616
617 size_t to_eof = max_write_size_ - position_;
618 size_t to_write = std::min(data_len, to_eof);
619 rtc::StreamResult result =
620 rtc::FileStream::Write(data, to_write, written, error);
621 if (result == rtc::SR_SUCCESS) {
622 position_ += *written;
623 }
624 return result;
625 }
626
627 /////////////////////////////////////////////////////////////////////////////// 520 ///////////////////////////////////////////////////////////////////////////////
628 // MemoryStream 521 // MemoryStream
629 /////////////////////////////////////////////////////////////////////////////// 522 ///////////////////////////////////////////////////////////////////////////////
630 523
631 MemoryStreamBase::MemoryStreamBase() 524 MemoryStreamBase::MemoryStreamBase()
632 : buffer_(NULL), buffer_length_(0), data_length_(0), 525 : buffer_(NULL), buffer_length_(0), data_length_(0),
633 seek_position_(0) { 526 seek_position_(0) {
634 } 527 }
635 528
636 StreamState MemoryStreamBase::GetState() const { 529 StreamState MemoryStreamBase::GetState() const {
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 1117
1225 if (data_len) { 1118 if (data_len) {
1226 *data_len = 0; 1119 *data_len = 0;
1227 } 1120 }
1228 return SR_SUCCESS; 1121 return SR_SUCCESS;
1229 } 1122 }
1230 1123
1231 /////////////////////////////////////////////////////////////////////////////// 1124 ///////////////////////////////////////////////////////////////////////////////
1232 1125
1233 } // namespace rtc 1126 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/base/stream.h ('k') | webrtc/base/stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698