// This file is part of Glest // // Copyright (C) 2018 The Glest team // // Glest is a fork of MegaGlest // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see #ifndef _SHARED_UTIL_PROFILER_H_ #define _SHARED_UTIL_PROFILER_H_ //#define SL_PROFILE //SL_PROFILE controls if profile is enabled or not #include "platform_util.h" #include "platform_common.h" #include #include #include "leak_dumper.h" using std::list; using std::string; using Shared::PlatformCommon::Chrono; namespace Shared { namespace Util { #ifdef SL_PROFILE // ===================================================== // class Section // ===================================================== class Section { public: typedef list SectionContainer; private: string name; Chrono chrono; int64 milisElapsed; Section *parent; SectionContainer children; public: Section(const string &name); Section *getParent() { return parent; } const string &getName() const { return name; } void setParent(Section *parent) { this->parent = parent; } void start() { chrono.start(); } void stop() { milisElapsed += chrono.getMillis(); } void addChild(Section *child) { children.push_back(child); } Section *getChild(const string &name); void print(FILE *outSream, int tabLevel = 0); }; // ===================================================== // class Profiler // ===================================================== class Profiler { private: Section * rootSection; Section *currSection; private: Profiler(); public: ~Profiler(); static Profiler &getInstance(); void sectionBegin(const string &name); void sectionEnd(const string &name); }; #endif //SL_PROFILE // ===================================================== // class funtions // ===================================================== inline void profileBegin(const string §ionName) { #ifdef SL_PROFILE Profiler::getInstance().sectionBegin(sectionName); #endif } inline void profileEnd(const string §ionName) { #ifdef SL_PROFILE Profiler::getInstance().sectionEnd(sectionName); #endif } } } //end namespace #endif