123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- /*************************************************************************
- * Copyright (C) [2020-2021] by Cambricon, 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
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *************************************************************************/
- #ifndef CNSTREAM_FRAMEWORK_CORE_INCLUDE_PROFILER_TRACE_HPP_
- #define CNSTREAM_FRAMEWORK_CORE_INCLUDE_PROFILER_TRACE_HPP_
- #include <chrono>
- #include <string>
- #include <unordered_map>
- #include <utility>
- #include <vector>
- /*!
- * @file trace.hpp
- *
- * This file contains declarations of the TraceEvent class, the TraceElem struct and the TraceElem struct.
- */
- namespace cnstream {
- /*!
- * Defines an alias for the std::chrono::steady_clock.
- */
- using Clock = std::chrono::steady_clock;
- /*!
- * Defines an alias for the std::chrono::duration<double, std::milli>.
- */
- using Duration = std::chrono::duration<double, std::milli>;
- /*!
- * Defines an alias for the std::chrono::steady_clock::timepoint.
- */
- using Time = Clock::time_point;
- /*!
- * Defines an alias for the std::pair<std::string, int64_t>. RecordKey now denotes a pair of the stream name
- * ``CNFrameInfo::stream_id`` and pts ``CNFrameInfo::timestamp``.
- */
- using RecordKey = std::pair<std::string, int64_t>;
- /*!
- * @class TraceEvent
- *
- * @brief TraceEvent is a class representing a trace event used by Profile.
- */
- class TraceEvent {
- public:
- RecordKey key; /*!< The unique identification of a frame. */
- std::string module_name; /*!< The name of a module. */
- std::string process_name; /*!< The name of a process. A process can be a function call or a piece of code. */
- Time time; /*!< The timestamp of an event. */
- /*!
- * @enum Level
- *
- * @brief Enumeration variables describing the level of an event. The default level is 0 (pipeline's event).
- */
- enum class Level {
- PIPELINE = 0, /*!< A event of a pipeline. */
- MODULE /*!< An event of a module. */
- } level = Level::PIPELINE;
- /*!
- * @enum Type
- *
- * @brief Enumeration variables describing the type of an event. The default type is 1 (START).
- */
- enum class Type {
- START = 1 << 0, /*!< A process-start event. */
- END = 1 << 1 /*!< A process-end event. */
- } type = Type::START;
- /*!
- * @brief Constructs a TraceEvent object by using default constructor.
- *
- * @return No return value.
- */
- TraceEvent() = default;
- /*!
- * @brief Constructs a TraceEvent object with a RecordKey instance.
- *
- * @param[in] key The unique identification of a frame.
- *
- * @return No return value.
- */
- explicit TraceEvent(const RecordKey& key);
- /*!
- * @brief Constructs a TraceEvent object with a RecordKey using move semantics.
- *
- * @param[in] key The unique identification of a frame.
- *
- * @return No return value.
- */
- explicit TraceEvent(RecordKey&& key);
- /*!
- * @brief Constructs a TraceEvent object with the copy of the contents of another object.
- *
- * @param[in] other Another object used to initialize an object.
- *
- * @return No return value.
- */
- TraceEvent(const TraceEvent& other) = default;
- /*!
- * @brief Replaces the contents with a copy of the contents of another TraceEvent object.
- *
- * @param[in] other Another object used to initialize the current object.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& operator=(const TraceEvent& other) = default;
- /*!
- * @brief Constructs a TraceEvent object with the contents of another object using move semantics.
- *
- * @param[in] other Another object used to initialize an object.
- *
- * @return No return value.
- */
- TraceEvent(TraceEvent&& other);
- /*!
- * @brief Replaces the contents with those of another TraceEvent object using move semantics.
- *
- * @param[in] other Another object used to initialize the current object.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& operator=(TraceEvent&& other);
- /*!
- * @brief Sets a unique identification for a frame.
- *
- * @param[in] key The unique identification of a frame.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetKey(const RecordKey& key);
- /*!
- * @brief Sets a unique identification for a frame using move semantics.
- *
- * @param[in] key The unique identification of a frame.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetKey(RecordKey&& key);
- /*!
- * @brief Sets the name of a module.
- *
- * @param[in] module_name The name of a module.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetModuleName(const std::string& module_name);
- /*!
- * @brief Sets the name of a module using move semantics.
- *
- * @param[in] module_name The name of a module.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetModuleName(std::string&& module_name);
- /*!
- * @brief Sets the name of a process.
- *
- * @param[in] process_name The name of a process.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetProcessName(const std::string& process_name);
- /*!
- * @brief Sets the name of a process using move semantics.
- *
- * @param[in] process_name The name of a process.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetProcessName(std::string&& process_name);
- /*!
- * @brief Sets the timestamp of this event.
- *
- * @param[in] time The timestamp of the event.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetTime(const Time& time);
- /*!
- * @brief Sets the timestamp of this event using move semantics.
- *
- * @param[in] time The timestamp of the event.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetTime(Time&& time);
- /*!
- * @brief Sets the level of this event.
- *
- * @param[in] level the level of the event.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetLevel(const Level& level);
- /*!
- * @brief Sets the type of this event.
- *
- * @param[in] type The type of th event.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceEvent& SetType(const Type& type);
- }; // class TraceEvent
- /*!
- * @struct TraceElem
- *
- * @brief The TraceElem is a structure describing a trace element used by profilers.
- */
- struct TraceElem {
- RecordKey key; /*!< The unique identification of a frame. */
- Time time; /*!< The timestamp of an event. */
- TraceEvent::Type type; /*!< The type of an event. It could be START or END. */
- /*!
- * @brief Constructs a TraceElem object by using default constructor.
- *
- * @return No return value.
- */
- TraceElem() = default;
- /*!
- * @brief Constructs a TraceElem object with the copy of the contents of another object.
- *
- * @param[in] other Another object used to initialize an object.
- *
- * @return No return value.
- */
- TraceElem(const TraceElem& other) = default;
- /*!
- * @brief Replaces the contents with a copy of the contents of another TraceElem object.
- *
- * @param[in] other Another object used to initialize the current object.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceElem& operator=(const TraceElem& other) = default;
- /*!
- * @brief Constructs a TraceElem object with the contents of another object using move semantics.
- *
- * @param[in] other Another object used to initialize an object.
- *
- * @return No return value.
- */
- TraceElem(TraceElem&& other);
- /*!
- * @brief Replaces the contents with those of another TraceElem object using move semantics.
- *
- * @param[in] other Another object used to initialize the current object.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- TraceElem& operator=(TraceElem&& other);
- /*!
- * @brief Constructs a TraceElem object with a trace event.
- *
- * @param[in] event A specific trace event instance.
- *
- * @return No return value.
- */
- explicit TraceElem(const TraceEvent& event);
- /*!
- * @brief Constructs a TraceElem object with a trace event using move semantics.
- *
- * @param[in] event A specific trace event instance.
- *
- * @return No return value.
- */
- explicit TraceElem(TraceEvent&& event);
- }; // struct TraceElem
- /*!
- * Defines an alias for the std::vector<TraceElem>. ProcessTrace now denotes a vector which contains trace elements for
- * a process.
- */
- using ProcessTrace = std::vector<TraceElem>;
- /*!
- * Defines an alias for the std::unordered_map<std::string, ProcessTrace>. ModuleTrace now denotes an unordered map
- * which contains the pairs of the process name and the ProcessTrace object for a module.
- */
- using ModuleTrace = std::unordered_map<std::string, ProcessTrace>;
- /*!
- * @struct PipelineTrace
- *
- * @brief The PipelineTrace is a structure describing the trace data of a pipeline.
- */
- struct PipelineTrace {
- std::unordered_map<std::string, ProcessTrace> process_traces; /*!< The trace data of processes. */
- std::unordered_map<std::string, ModuleTrace> module_traces; /*!< The trace data of modules. */
- /*!
- * @brief Constructs a PipelineTrace object by using default constructor.
- *
- * @return No return value.
- */
- PipelineTrace() = default;
- /*!
- * @brief Constructs a PipelineTrace object with the copy of the contents of another object.
- *
- * @param[in] other Another object used to initialize an object.
- *
- * @return No return value.
- */
- PipelineTrace(const PipelineTrace& other) = default;
- /*!
- * @brief Replaces the contents with a copy of the contents of another PipelineTrace object.
- *
- * @param[in] other Another object used to initialize the current object.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- PipelineTrace& operator=(const PipelineTrace& other) = default;
- /*!
- * @brief Constructs a PipelineTrace object with the contents of another object using move semantics.
- *
- * @param[in] other Another object used to initialize an object.
- *
- * @return No return value.
- */
- PipelineTrace(PipelineTrace&& other);
- /*!
- * @brief Replaces the contents with those of another PipelineTrace object using move semantics.
- *
- * @param[in] other Another object used to initialize the current object.
- *
- * @return Returns a lvalue reference to the current instance.
- */
- PipelineTrace& operator=(PipelineTrace&& other);
- }; // struct PipelineTrace
- inline TraceEvent::TraceEvent(const RecordKey& key) : key(key) {}
- inline TraceEvent::TraceEvent(RecordKey&& key) : key(std::forward<RecordKey>(key)) {}
- inline TraceEvent::TraceEvent(TraceEvent&& other) { *this = std::forward<TraceEvent>(other); }
- inline TraceEvent& TraceEvent::operator=(TraceEvent&& other) {
- key = std::move(other.key);
- module_name = std::move(other.module_name);
- process_name = std::move(other.process_name);
- time = std::move(other.time);
- level = other.level;
- type = other.type;
- return *this;
- }
- inline TraceEvent& TraceEvent::SetKey(const RecordKey& key) {
- this->key = key;
- return *this;
- }
- inline TraceEvent& TraceEvent::SetKey(RecordKey&& key) {
- this->key = std::forward<RecordKey>(key);
- return *this;
- }
- inline TraceEvent& TraceEvent::SetModuleName(const std::string& module_name) {
- this->module_name = module_name;
- return *this;
- }
- inline TraceEvent& TraceEvent::SetModuleName(std::string&& module_name) {
- this->module_name = std::forward<std::string>(module_name);
- return *this;
- }
- inline TraceEvent& TraceEvent::SetProcessName(const std::string& process_name) {
- this->process_name = process_name;
- return *this;
- }
- inline TraceEvent& TraceEvent::SetProcessName(std::string&& process_name) {
- this->process_name = std::forward<std::string>(process_name);
- return *this;
- }
- inline TraceEvent& TraceEvent::SetTime(const Time& time) {
- this->time = time;
- return *this;
- }
- inline TraceEvent& TraceEvent::SetTime(Time&& time) {
- this->time = std::forward<Time>(time);
- return *this;
- }
- inline TraceEvent& TraceEvent::SetLevel(const Level& level) {
- this->level = level;
- return *this;
- }
- inline TraceEvent& TraceEvent::SetType(const Type& type) {
- this->type = type;
- return *this;
- }
- inline TraceElem::TraceElem(TraceElem&& other) { *this = std::forward<TraceElem>(other); }
- inline TraceElem& TraceElem::operator=(TraceElem&& other) {
- key = std::move(other.key);
- time = std::move(other.time);
- type = other.type;
- return *this;
- }
- inline TraceElem::TraceElem(const TraceEvent& event) {
- key = event.key;
- time = event.time;
- type = event.type;
- }
- inline TraceElem::TraceElem(TraceEvent&& event) {
- key = std::move(event.key);
- time = std::move(event.time);
- type = event.type;
- }
- inline PipelineTrace::PipelineTrace(PipelineTrace&& other) { *this = std::forward<PipelineTrace>(other); }
- inline PipelineTrace& PipelineTrace::operator=(PipelineTrace&& other) {
- process_traces = std::move(other.process_traces);
- module_traces = std::move(other.module_traces);
- return *this;
- }
- } // namespace cnstream
- #endif // CNSTREAM_FRAMEWORK_CORE_INCLUDE_PROFILER_TRACE_HPP_
|