-// 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 <anna/core/oam/Module.hpp>
#include <anna/core/functions.hpp>
#include <anna/core/oam/Configuration.hpp>
+#include <anna/core/oam/CounterScope.hpp>
+#include <anna/core/oam/CounterRecorder.hpp>
#include <anna/core/tracing/Logger.hpp>
#include <anna/core/tracing/TraceWriter.hpp>
#include <anna/core/tracing/TraceMethod.hpp>
#include <anna/core/functions.hpp>
#include <anna/xml/xml.hpp>
-#include <anna/core/oam/CounterManager.hpp>
// Standard
-#include <stdarg.h>
+#include <cstdarg>
#define UNDEFINED_EVENT_DESCRIPTION "<undefined>"
//----------------------------------------------------------------------- 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()
//------------------------------------------------------------------------------
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);
}
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;
}
//------------------------------------------------------------------------------
//------------------------------------------------------ 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
LOGDEBUG
(
std::string msg = "Alarm activation ignored over module '";
- msg += getClassName();
+ msg += getName();
msg += "': alarms are disabled";
anna::Logger::debug(msg, ANNA_FILE_LOCATION);
);
//------------------------------------------------------------------------------
//-------------------------------------------------------- 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
LOGDEBUG
(
std::string msg = "Alarm cancellation ignored over module '";
- msg += getClassName();
+ msg += getName();
msg += "': alarms are disabled";
anna::Logger::debug(msg, ANNA_FILE_LOCATION);
);
LOGDEBUG
(
std::string msg = "Count operation ignored over module '";
- msg += getClassName();
+ msg += getName();
msg += "': counters are disabled";
anna::Logger::debug(msg, ANNA_FILE_LOCATION);
);
}
+//------------------------------------------------------------------------------
+//------------------------------------- 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();
+ 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";
//------------------------------------------------------------------------------
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");