OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |