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