| // Copyright 2017 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_BROWSER_MEMORY_TRACKER_TOOL_BUFFERED_FILE_WRITER_H_ |
| #define COBALT_BROWSER_MEMORY_TRACKER_TOOL_BUFFERED_FILE_WRITER_H_ |
| |
| #include <string> |
| |
| #include "starboard/condition_variable.h" |
| #include "starboard/file.h" |
| #include "starboard/log.h" |
| #include "starboard/memory.h" |
| #include "starboard/mutex.h" |
| #include "starboard/thread.h" |
| #include "starboard/types.h" |
| |
| namespace cobalt { |
| namespace browser { |
| namespace memory_tracker { |
| |
| // This is a heavy weight file writing class. It's "heavy weight" because |
| // 1) It uses its own thread. |
| // 2) It uses a 4mb inlined buffer for file writes. This class guarantees |
| // that it will never allocate memory and therefore can be used in high |
| // performance, low-level data writes. |
| class BufferedFileWriter { |
| public: |
| // Constructs the BufferedFileWriter with the path to write to. A thread is |
| // started which will begin writing to the file object. |
| explicit BufferedFileWriter(const std::string& file_path); |
| |
| // Implicitly calls JoinThread(). This is safe if JoinThread() has already |
| // been called. |
| ~BufferedFileWriter(); |
| |
| // Can be called by any thread. Pushes data to the buffer to be written out |
| // by the disk writing thread as is. |
| // Note that this append is raw and will NOT add any new line or other |
| // formatting characters. |
| void Append(const char* data, size_t num_bytes); |
| |
| private: |
| static void* ThreadEntryFunc(void* context); // Delegates to Run(). |
| void Run(); |
| bool SwapBuffers(); |
| void StartThread(); |
| void QuitThread(); |
| |
| static const int kBufferSize = 1 << 20; |
| static const int kNumBuffers = 2; |
| struct LogBuffer { |
| char buffer[kBufferSize]; |
| size_t num_bytes; |
| }; |
| LogBuffer log_buffers_[kNumBuffers]; |
| int current_log_buffer_; |
| LogBuffer* log_buffer_to_flush_; |
| SbFile log_file_; |
| |
| starboard::Mutex diskwrite_mutex_; |
| starboard::Mutex buffer_write_mutex_; |
| starboard::ConditionVariable diskwrite_cond_; |
| SbThread flush_thread_; |
| bool quit_thread_; |
| std::string file_path_; |
| }; |
| |
| } // namespace memory_tracker |
| } // namespace browser |
| } // namespace cobalt |
| |
| #endif // COBALT_BROWSER_MEMORY_TRACKER_TOOL_BUFFERED_FILE_WRITER_H_ |