| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | |
| 3 * | |
| 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 | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 // This file contains the helper classes for the DataLog APIs. See data_log.h | |
| 12 // for the APIs. | |
| 13 // | |
| 14 // These classes are helper classes used for logging data for offline | |
| 15 // processing. Data logged with these classes can conveniently be parsed and | |
| 16 // processed with e.g. Matlab. | |
| 17 #ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_DATA_LOG_IMPL_H_ | |
| 18 #define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_DATA_LOG_IMPL_H_ | |
| 19 | |
| 20 #include <map> | |
| 21 #include <memory> | |
| 22 #include <sstream> | |
| 23 #include <string> | |
| 24 #include <vector> | |
| 25 | |
| 26 #include "webrtc/base/platform_thread.h" | |
| 27 #include "webrtc/typedefs.h" | |
| 28 | |
| 29 namespace webrtc { | |
| 30 | |
| 31 class CriticalSectionWrapper; | |
| 32 class EventWrapper; | |
| 33 class LogTable; | |
| 34 class RWLockWrapper; | |
| 35 | |
| 36 // All container classes need to implement a ToString-function to be | |
| 37 // writable to file. Enforce this via the Container interface. | |
| 38 class Container { | |
| 39 public: | |
| 40 virtual ~Container() {} | |
| 41 | |
| 42 virtual void ToString(std::string* container_string) const = 0; | |
| 43 }; | |
| 44 | |
| 45 template<class T> | |
| 46 class ValueContainer : public Container { | |
| 47 public: | |
| 48 explicit ValueContainer(T data) : data_(data) {} | |
| 49 | |
| 50 virtual void ToString(std::string* container_string) const { | |
| 51 *container_string = ""; | |
| 52 std::stringstream ss; | |
| 53 ss << data_ << ","; | |
| 54 ss >> *container_string; | |
| 55 } | |
| 56 | |
| 57 private: | |
| 58 T data_; | |
| 59 }; | |
| 60 | |
| 61 template<class T> | |
| 62 class MultiValueContainer : public Container { | |
| 63 public: | |
| 64 MultiValueContainer(const T* data, int length) | |
| 65 : data_(data, data + length) { | |
| 66 } | |
| 67 | |
| 68 virtual void ToString(std::string* container_string) const { | |
| 69 *container_string = ""; | |
| 70 std::stringstream ss; | |
| 71 for (size_t i = 0; i < data_.size(); ++i) | |
| 72 ss << data_[i] << ","; | |
| 73 *container_string += ss.str(); | |
| 74 } | |
| 75 | |
| 76 private: | |
| 77 std::vector<T> data_; | |
| 78 }; | |
| 79 | |
| 80 class DataLogImpl { | |
| 81 public: | |
| 82 ~DataLogImpl(); | |
| 83 | |
| 84 // The implementation of the CreateLog() method declared in data_log.h. | |
| 85 // See data_log.h for a description. | |
| 86 static int CreateLog(); | |
| 87 | |
| 88 // The implementation of the StaticInstance() method declared in data_log.h. | |
| 89 // See data_log.h for a description. | |
| 90 static DataLogImpl* StaticInstance(); | |
| 91 | |
| 92 // The implementation of the ReturnLog() method declared in data_log.h. See | |
| 93 // data_log.h for a description. | |
| 94 static void ReturnLog(); | |
| 95 | |
| 96 // The implementation of the AddTable() method declared in data_log.h. See | |
| 97 // data_log.h for a description. | |
| 98 int AddTable(const std::string& table_name); | |
| 99 | |
| 100 // The implementation of the AddColumn() method declared in data_log.h. See | |
| 101 // data_log.h for a description. | |
| 102 int AddColumn(const std::string& table_name, | |
| 103 const std::string& column_name, | |
| 104 int multi_value_length); | |
| 105 | |
| 106 // Inserts a Container into a table with name table_name at the column | |
| 107 // with name column_name. | |
| 108 // column_name is treated in a case sensitive way. | |
| 109 int InsertCell(const std::string& table_name, | |
| 110 const std::string& column_name, | |
| 111 const Container* value_container); | |
| 112 | |
| 113 // The implementation of the NextRow() method declared in data_log.h. See | |
| 114 // data_log.h for a description. | |
| 115 int NextRow(const std::string& table_name); | |
| 116 | |
| 117 private: | |
| 118 DataLogImpl(); | |
| 119 | |
| 120 // Initializes the DataLogImpl object, allocates and starts the | |
| 121 // thread file_writer_thread_. | |
| 122 int Init(); | |
| 123 | |
| 124 // Write all complete rows in every table to file. | |
| 125 // This function should only be called by the file_writer_thread_ if that | |
| 126 // thread is running to avoid race conditions. | |
| 127 void Flush(); | |
| 128 | |
| 129 // Run() is called by the thread file_writer_thread_. | |
| 130 static bool Run(void* obj); | |
| 131 | |
| 132 // This function writes data to file. Note, it blocks if there is no data | |
| 133 // that should be written to file availble. Flush is the non-blocking | |
| 134 // version of this function. | |
| 135 void Process(); | |
| 136 | |
| 137 // Stops the continuous calling of Process(). | |
| 138 void StopThread(); | |
| 139 | |
| 140 // Collection of tables indexed by the table name as std::string. | |
| 141 typedef std::map<std::string, LogTable*> TableMap; | |
| 142 typedef std::unique_ptr<CriticalSectionWrapper> CritSectScopedPtr; | |
| 143 | |
| 144 static CritSectScopedPtr crit_sect_; | |
| 145 static DataLogImpl* instance_; | |
| 146 int counter_; | |
| 147 TableMap tables_; | |
| 148 EventWrapper* flush_event_; | |
| 149 // This is a unique_ptr so that we don't have to create threads in the no-op | |
| 150 // impl. | |
| 151 std::unique_ptr<rtc::PlatformThread> file_writer_thread_; | |
| 152 RWLockWrapper* tables_lock_; | |
| 153 }; | |
| 154 | |
| 155 } // namespace webrtc | |
| 156 | |
| 157 #endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_DATA_LOG_IMPL_H_ | |
| OLD | NEW |