X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fcore%2Foam%2FModule.cpp;h=8f8af4774c29cb854a40d57171f5bb3cab7b2755;hb=5a6cba5fde2b2f538a7515f8293cc0a8d9589dfa;hp=84991e59b3a8ca2c859e7e2e5c0abfc1d075b2b7;hpb=4e12ac57e93c052f716a6305ad8fc099c45899d1;p=anna.git diff --git a/source/core/oam/Module.cpp b/source/core/oam/Module.cpp index 84991e5..8f8af47 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,10 +30,19 @@ //----------------------------------------------------------------------- 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() //------------------------------------------------------------------------------ -anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() { +anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) { scope_iterator it = scope_find(id); return ((it != scope_end()) ? scope(it) : NULL); } @@ -68,7 +50,7 @@ anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() { ////------------------------------------------------------------------------------ ////------------------------------------------------------- Module::alarm_remove() ////------------------------------------------------------------------------------ -//bool anna::oam::Module::alarm_remove(const int &key) throw() { +//bool anna::oam::Module::alarm_remove(const int &key) { // alarm_iterator it = alarm_find(key); // if (it != alarm_end()) { // a_alarms.erase(key); @@ -81,7 +63,7 @@ anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() { ////------------------------------------------------------------------------------ ////----------------------------------------------------- Module::counter_remove() ////------------------------------------------------------------------------------ -//bool anna::oam::Module::counter_remove(const int &key) throw() { +//bool anna::oam::Module::counter_remove(const int &key) { // counter_iterator it = counter_find(key); // if (it != counter_end()) { // a_counters.erase(key); @@ -98,7 +80,7 @@ anna::oam::CounterScope *anna::oam::Module::getScope(const int &id) throw() { //------------------------------------------------------------------------------ //----------------------------------------------------- Module::enableCounters() //------------------------------------------------------------------------------ -void anna::oam::Module::enableCounters(void) throw() { +void anna::oam::Module::enableCounters(void) { a_counters_enabled = true; LOGDEBUG(anna::Logger::debug("Scoped counters ENABLED", ANNA_FILE_LOCATION)); } @@ -107,7 +89,7 @@ void anna::oam::Module::enableCounters(void) throw() { //------------------------------------------------------------------------------ //---------------------------------------------------- Module::disableCounters() //------------------------------------------------------------------------------ -void anna::oam::Module::disableCounters(void) throw() { +void anna::oam::Module::disableCounters(void) { a_counters_enabled = false; LOGDEBUG(anna::Logger::debug("Scoped counters DISABLED", ANNA_FILE_LOCATION)); } @@ -116,7 +98,7 @@ void anna::oam::Module::disableCounters(void) throw() { //------------------------------------------------------------------------------ //------------------------------------------------------- Module::enableAlarms() //------------------------------------------------------------------------------ -void anna::oam::Module::enableAlarms(void) throw() { +void anna::oam::Module::enableAlarms(void) { a_alarms_enabled = true; LOGDEBUG(anna::Logger::debug("Scoped alarms ENABLED", ANNA_FILE_LOCATION)); } @@ -125,7 +107,7 @@ void anna::oam::Module::enableAlarms(void) throw() { //------------------------------------------------------------------------------ //------------------------------------------------------ Module::disableAlarms() //------------------------------------------------------------------------------ -void anna::oam::Module::disableAlarms(void) throw() { +void anna::oam::Module::disableAlarms(void) { a_alarms_enabled = false; LOGDEBUG(anna::Logger::debug("Scoped alarms DISABLED", ANNA_FILE_LOCATION)); } @@ -134,7 +116,7 @@ void anna::oam::Module::disableAlarms(void) throw() { //------------------------------------------------------------------------------ //------------------------------------------------ Module::enableAlarmsPreffix() //------------------------------------------------------------------------------ -void anna::oam::Module::enableAlarmsPreffix(void) throw() { +void anna::oam::Module::enableAlarmsPreffix(void) { a_alarms_preffix_enabled = true; LOGDEBUG(anna::Logger::debug("Alarm preffix module components SHOWN", ANNA_FILE_LOCATION)); } @@ -143,7 +125,7 @@ void anna::oam::Module::enableAlarmsPreffix(void) throw() { //------------------------------------------------------------------------------ //------------------------------------------------- Module::enableAlarmsSuffix() //------------------------------------------------------------------------------ -void anna::oam::Module::enableAlarmsSuffix(void) throw() { +void anna::oam::Module::enableAlarmsSuffix(void) { a_alarms_suffix_enabled = true; LOGDEBUG(anna::Logger::debug("Alarm suffix module components SHOWN", ANNA_FILE_LOCATION)); } @@ -152,7 +134,7 @@ void anna::oam::Module::enableAlarmsSuffix(void) throw() { //------------------------------------------------------------------------------ //----------------------------------------------- Module::disableAlarmsPreffix() //------------------------------------------------------------------------------ -void anna::oam::Module::disableAlarmsPreffix(void) throw() { +void anna::oam::Module::disableAlarmsPreffix(void) { a_alarms_preffix_enabled = false; LOGDEBUG(anna::Logger::debug("Alarm preffix module components HIDDEN", ANNA_FILE_LOCATION)); } @@ -161,7 +143,7 @@ void anna::oam::Module::disableAlarmsPreffix(void) throw() { //------------------------------------------------------------------------------ //------------------------------------------------ Module::disableAlarmsSuffix() //------------------------------------------------------------------------------ -void anna::oam::Module::disableAlarmsSuffix(void) throw() { +void anna::oam::Module::disableAlarmsSuffix(void) { a_alarms_suffix_enabled = false; LOGDEBUG(anna::Logger::debug("Alarm suffix module components HIDDEN", ANNA_FILE_LOCATION)); } @@ -170,7 +152,7 @@ void anna::oam::Module::disableAlarmsSuffix(void) throw() { //------------------------------------------------------------------------------ //--------------------------------- Module::getDefaultInternalAlarmDescription() //------------------------------------------------------------------------------ -std::string anna::oam::Module::getDefaultInternalAlarmDescription(const int & type) const throw() { +std::string anna::oam::Module::getDefaultInternalAlarmDescription(const int & type) const { return UNDEFINED_EVENT_DESCRIPTION; } @@ -178,7 +160,7 @@ std::string anna::oam::Module::getDefaultInternalAlarmDescription(const int & ty //------------------------------------------------------------------------------ //------------------------------- Module::getDefaultInternalCounterDescription() //------------------------------------------------------------------------------ -std::string anna::oam::Module::getDefaultInternalCounterDescription(const int & type) const throw() { +std::string anna::oam::Module::getDefaultInternalCounterDescription(const int & type) const { return UNDEFINED_EVENT_DESCRIPTION; } @@ -186,7 +168,7 @@ std::string anna::oam::Module::getDefaultInternalCounterDescription(const int & //------------------------------------------------------------------------------ //---------------------------------------------- Module::alarmComponentsToText() //------------------------------------------------------------------------------ -std::string anna::oam::Module::alarmComponentsToText(const std::vector & components, const std::string & psL, const std::string & psS, const std::string & psR) const throw() { +std::string anna::oam::Module::alarmComponentsToText(const std::vector & components, const std::string & psL, const std::string & psS, const std::string & psR) const { if(components.size() == 0) return (""); std::vector::const_iterator it_min(components.begin()); @@ -205,7 +187,7 @@ std::string anna::oam::Module::alarmComponentsToText(const std::vector * globalPreffixComponents = conf.getAlarmPreffixComponents(); const std::vector * globalSuffixComponents = conf.getAlarmSuffixComponents(); @@ -243,17 +225,18 @@ void anna::oam::Module::getAlarmPreffixSuffixAndZoneSeparator(std::string & pref //------------------------------------------------------------------------------ //--------------------------------------------- Module::initializeCounterScope() //------------------------------------------------------------------------------ -void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::string & description) throw(anna::RuntimeException) { +void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::string & description) noexcept(false) { LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "initializeCounterScope", ANNA_FILE_LOCATION)); // Order of use: - if(a_counters.size() != 0) // any counter have been registered - throw anna::RuntimeException("After use of counter registration can't initialize more scope ids!. Do initializations firstly", ANNA_FILE_LOCATION); + // https://redmine.teslayout.com/issues/48 + //if(a_counters.size() != 0) // any counter have been registered + // 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 +257,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; } @@ -283,7 +266,7 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s //------------------------------------------------------------------------------ //---------------------------------------------- Module::setActiveCounterScope() //------------------------------------------------------------------------------ -void anna::oam::Module::setActiveCounterScope(const int & scopeId) throw() { +void anna::oam::Module::setActiveCounterScope(const int & scopeId) { anna::oam::CounterScope *scope = getScope(scopeId); if(!scope) { @@ -298,7 +281,7 @@ void anna::oam::Module::setActiveCounterScope(const int & scopeId) throw() { //------------------------------------------------------------------------------ //---------------------------------------------------- Module::registerCounter() //------------------------------------------------------------------------------ -void anna::oam::Module::registerCounter(const int & type, const std::string & description, const int & offset) throw(anna::RuntimeException) { +void anna::oam::Module::registerCounter(const int & type, const std::string & description, const int & offset) noexcept(false) { // Handler-specific a_handler->registerCounter(this, type, description, offset); @@ -348,7 +331,7 @@ void anna::oam::Module::registerCounter(const int & type, const std::string & de //------------------------------------------------------------------------------ //------------------------------------------------------ Module::registerAlarm() //------------------------------------------------------------------------------ -void anna::oam::Module::registerAlarm(const int & type, const std::string &description, const int & externalId, const std::string & dynamicVariablesCSL, const int & activationId, const int & cancellationId) throw(anna::RuntimeException) { +void anna::oam::Module::registerAlarm(const int & type, const std::string &description, const int & externalId, const std::string & dynamicVariablesCSL, const int & activationId, const int & cancellationId) noexcept(false) { // Handler-specific a_handler->registerAlarm(this, type, description, externalId, dynamicVariablesCSL, activationId, cancellationId); // Check type existence: @@ -392,7 +375,7 @@ void anna::oam::Module::registerAlarm(const int & type, const std::string &descr //------------------------------------------------------------------------------ //------------------------------------------------------ Module::activateAlarm() //------------------------------------------------------------------------------ -void anna::oam::Module::alarmEvent(bool activation, const int & type, va_list argList) const throw() { +void anna::oam::Module::alarmEvent(bool activation, const int & type, va_list argList) const { // Preffix/Suffix and separator: std::string userPreffix, userSuffix; char separator; getAlarmPreffixSuffixAndZoneSeparator(userPreffix, userSuffix, separator); @@ -408,7 +391,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 noexcept(false) { // LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "activateAlarm", ANNA_FILE_LOCATION)); // Checkings @@ -416,7 +399,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 +417,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 noexcept(false) { // LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "cancelAlarm", ANNA_FILE_LOCATION)); // Checkings @@ -442,7 +425,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); ); @@ -460,7 +443,7 @@ void anna::oam::Module::cancelAlarm(const int & type, ...) const throw(anna::Run //------------------------------------------------------------------------------ //-------------------------------------------------------------- Module::count() //------------------------------------------------------------------------------ -void anna::oam::Module::count(const int & type, const int & amount) throw(anna::RuntimeException) { +void anna::oam::Module::count(const int & type, const int & amount) noexcept(false) { // LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "count", ANNA_FILE_LOCATION)); // Checkings @@ -468,7 +451,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); ); @@ -482,7 +465,7 @@ void anna::oam::Module::count(const int & type, const int & amount) throw(anna:: //------------------------------------------------------------------------------ //------------------------------------------------------ Module::resetCounters() //------------------------------------------------------------------------------ -int anna::oam::Module::resetCounters(const int & scopeId) throw() { +int anna::oam::Module::resetCounters(const int & scopeId) { LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "resetCounters", ANNA_FILE_LOCATION)); int result = 0; // affected number @@ -493,13 +476,77 @@ 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() noexcept(false) { + 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(); + 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 anna::oam::Module::asString(void) const { 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"; @@ -515,14 +562,25 @@ std::string anna::oam::Module::asString(void) const throw() { for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) { ptrCounterData = (counter_data_t *) & ((*cnt_it).second); + + // Counter registered ? + int offset = ptrCounterData->Offset; + unsigned long long int accValue = 0ULL; + try { + const anna::oam::CounterScope *csAux = scope(scope_it); + accValue = csAux->getAccValue(offset); + } catch(anna::RuntimeException &ex) { + ex.trace(); + continue; + } + // Counter: trace += "\n\tType: "; trace += anna::functions::asString((*cnt_it).first); trace += " | Description: '"; trace += ptrCounterData->Description; trace += "'"; - int offset = ptrCounterData->Offset; int realId = (1000 * scopeId) + offset; trace += " | ScopeId/Offset: "; trace += anna::functions::asString(scopeId); trace += "/"; trace += anna::functions::asString(offset); trace += " | RealId: "; trace += anna::functions::asString(realId); - unsigned long long int accValue = scope(scope_it)->getAccValue(offset); + accValue = scope(scope_it)->getAccValue(offset); if(accValue != 0ULL) { trace += " | AccumulatedAmount: "; @@ -558,9 +616,9 @@ std::string anna::oam::Module::asString(void) const throw() { //------------------------------------------------------------------------------ //-------------------------------------------------------------- Module::asXML() //------------------------------------------------------------------------------ -anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const throw() { +anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const { 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"); @@ -576,16 +634,26 @@ anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const throw() for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) { ptrCounterData = (counter_data_t *) & ((*cnt_it).second); + + // Counter registered ? + int offset = ptrCounterData->Offset; + unsigned long long int accValue = 0ULL; + try { + const anna::oam::CounterScope *csAux = scope(scope_it); + accValue = csAux->getAccValue(offset); + } catch(anna::RuntimeException &ex) { + ex.trace(); + continue; + } + // Counter: anna::xml::Node* counter = registeredCounters->createChild("Counter"); counter->createAttribute("Type", anna::functions::asString((*cnt_it).first)); counter->createAttribute("Description", ptrCounterData->Description); - int offset = ptrCounterData->Offset; int realId = (1000 * scopeId) + offset; counter->createAttribute("ScopeId", anna::functions::asString(scopeId)); counter->createAttribute("Offset", anna::functions::asString(offset)); counter->createAttribute("RealId", anna::functions::asString(realId)); - unsigned long long int accValue = scope(scope_it)->getAccValue(offset); if(accValue != 0ULL) counter->createAttribute("AccumulatedAmount", anna::functions::asString("%llu", accValue));