X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fcore%2Foam%2FModule.cpp;h=4466ca5234bcd781a8f2a887f219a8f71ce33057;hb=b105cc8fc16f1d9bf26969a209e3bf1d506a2ef3;hp=84991e59b3a8ca2c859e7e2e5c0abfc1d075b2b7;hpb=4e12ac57e93c052f716a6305ad8fc099c45899d1;p=anna.git diff --git a/source/core/oam/Module.cpp b/source/core/oam/Module.cpp index 84991e5..4466ca5 100644 --- a/source/core/oam/Module.cpp +++ b/source/core/oam/Module.cpp @@ -1,53 +1,26 @@ -// ANNA - Anna is Not 'N' Anymore -// -// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo -// -// https://bitbucket.org/testillano/anna -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Authors: eduardo.ramos.testillano@gmail.com -// cisco.tierra@gmail.com +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // // Local #include #include #include +#include +#include #include #include #include #include #include -#include // Standard -#include +#include #define UNDEFINED_EVENT_DESCRIPTION "" @@ -57,6 +30,15 @@ //----------------------------------------------------------------------- Module //****************************************************************************** +//------------------------------------------------------------------------------ +//-------------------------------------------------------------- Module::~Module +//------------------------------------------------------------------------------ +anna::oam::Module::~Module() { + for(scope_iterator scope_it = scope_begin(); scope_it != scope_end(); scope_it++) + delete (scope(scope_it)); +} + + //------------------------------------------------------------------------------ //----------------------------------------------------------- Module::getScope() //------------------------------------------------------------------------------ @@ -251,9 +233,9 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s throw anna::RuntimeException("After use of counter registration can't initialize more scope ids!. Do initializations firstly", ANNA_FILE_LOCATION); // Scope range: 0 - 99 - if(scopeId < 0 || scopeId >= anna::oam::CounterManager::MaxScope) { + if(scopeId < 0 || scopeId >= MaxScope) { std::string msg = "Scope Id must be in range [0 - "; - msg += anna::functions::asString(anna::oam::CounterManager::MaxScope - 1); // 99 + msg += anna::functions::asString(MaxScope - 1); // 99 msg += "]"; throw anna::RuntimeException(msg, ANNA_FILE_LOCATION); } @@ -274,8 +256,8 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s anna::Logger::warning("This is not the first initialized scope. Perhaps you should provide specific description better than general module name ...", ANNA_FILE_LOCATION); } ); - const char * c_description = (missingScopeDescription ? getClassName() : description.c_str()); - a_active_counter_scope = &(anna::oam::CounterManager::instantiate().create(scopeId, c_description, true /* reuses */)); + const char * c_description = (missingScopeDescription ? getName() : description.c_str()); + a_active_counter_scope = new CounterScope(scopeId, c_description); a_scopes[scopeId] = a_active_counter_scope; } @@ -408,7 +390,7 @@ void anna::oam::Module::alarmEvent(bool activation, const int & type, va_list ar //------------------------------------------------------------------------------ //------------------------------------------------------ Module::activateAlarm() //------------------------------------------------------------------------------ -void anna::oam::Module::activateAlarm(const int & type, ...) const throw(anna::RuntimeException) { +void anna::oam::Module::activateAlarm(int type, ...) const throw(anna::RuntimeException) { // LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "activateAlarm", ANNA_FILE_LOCATION)); // Checkings @@ -416,7 +398,7 @@ void anna::oam::Module::activateAlarm(const int & type, ...) const throw(anna::R LOGDEBUG ( std::string msg = "Alarm activation ignored over module '"; - msg += getClassName(); + msg += getName(); msg += "': alarms are disabled"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -434,7 +416,7 @@ void anna::oam::Module::activateAlarm(const int & type, ...) const throw(anna::R //------------------------------------------------------------------------------ //-------------------------------------------------------- Module::cancelAlarm() //------------------------------------------------------------------------------ -void anna::oam::Module::cancelAlarm(const int & type, ...) const throw(anna::RuntimeException) { +void anna::oam::Module::cancelAlarm(int type, ...) const throw(anna::RuntimeException) { // LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "cancelAlarm", ANNA_FILE_LOCATION)); // Checkings @@ -442,7 +424,7 @@ void anna::oam::Module::cancelAlarm(const int & type, ...) const throw(anna::Run LOGDEBUG ( std::string msg = "Alarm cancellation ignored over module '"; - msg += getClassName(); + msg += getName(); msg += "': alarms are disabled"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -468,7 +450,7 @@ void anna::oam::Module::count(const int & type, const int & amount) throw(anna:: LOGDEBUG ( std::string msg = "Count operation ignored over module '"; - msg += getClassName(); + msg += getName(); msg += "': counters are disabled"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -493,13 +475,78 @@ int anna::oam::Module::resetCounters(const int & scopeId) throw() { } +//------------------------------------------------------------------------------ +//------------------------------------- Module::RecordingGuard::RecordingGuard() +//------------------------------------------------------------------------------ +anna::oam::Module::RecordingGuard::RecordingGuard(anna::oam::Module* module) : + a_module(module) { + module->a_counterRecording = true; +} + + +//------------------------------------------------------------------------------ +//------------------------------------ Module::RecordingGuard::~RecordingGuard() +//------------------------------------------------------------------------------ +anna::oam::Module::RecordingGuard::~RecordingGuard() { + a_module->a_counterRecording = false; +} + + +//------------------------------------------------------------------------------ +//----------------------------------------------------- Module::recordCounters() +//------------------------------------------------------------------------------ +void anna::oam::Module::recordCounters() throw(anna::RuntimeException) { + LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "recordCounters", ANNA_FILE_LOCATION)); + + if(a_counterRecorder == NULL) + throw RuntimeException("anna::oam::Module has no counter recorder associated", ANNA_FILE_LOCATION); + + LOGDEBUG( + std::string msg("Recording counters | "); + msg += a_counterRecorder->asString(); + anna::Logger::write(Logger::Debug, msg, ANNA_FILE_LOCATION) + ); + RecordingGuard guard(this); + + a_counterRecorder->open(); + Counter* counter = NULL; + CounterScope* cscope = NULL; + + try { + for(scope_iterator scope_it = scope_begin(); scope_it != scope_end(); scope_it++) { + cscope = scope(scope_it); + if(cscope == NULL) continue; + + Guard csGuard(cscope, "oam::CounterScope from oam::Module::record"); + + for(int icounter = 0; icounter < CounterScope::MaxCounter; icounter ++) { + Counter* counter = cscope->a_counters [icounter]; + + if(counter == NULL) + continue; + + if(counter->getValue() == 0) + continue; + + a_counterRecorder->apply(*counter); + counter->reset(); + } + } + + a_counterRecorder->close(); + } catch(anna::RuntimeException&) { + a_counterRecorder->close(); + throw; + } +} + //------------------------------------------------------------------------------ //----------------------------------------------------------- Module::asString() //------------------------------------------------------------------------------ std::string anna::oam::Module::asString(void) const throw() { std::string trace; trace = "Module name: '"; - trace += getClassName(); + trace += getName(); trace += "'"; trace += "\n\nCOUNTERS"; trace += "\n--------"; trace += "\nScoped counters "; trace += a_counters_enabled ? "Enabled" : "Disabled"; @@ -560,7 +607,7 @@ std::string anna::oam::Module::asString(void) const throw() { //------------------------------------------------------------------------------ anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const throw() { anna::xml::Node* result = parent->createChild("oam.Module"); - result->createAttribute("Name", getClassName()); + result->createAttribute("Name", getName()); result->createAttribute("Counters", a_counters_enabled ? "Enabled" : "Disabled"); anna::xml::Node* registeredCounterScopes = result->createChild("RegisteredCounterScopes");