Remove core-comm dependency through CounterManager/timex in core/oam subsystem. Basic...
[anna.git] / source / core / oam / Module.cpp
index 341ed8c..99b47c9 100644 (file)
 #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 <cstdarg>
 //----------------------------------------------------------------------- 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 +261,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);
   }
@@ -275,7 +285,7 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s
   }
   );
   const char * c_description = (missingScopeDescription ? getClassName() : description.c_str());
-  a_active_counter_scope = &(anna::oam::CounterManager::instantiate().create(scopeId, c_description, true /* reuses */));
+  a_active_counter_scope = new CounterScope(scopeId, c_description);
   a_scopes[scopeId] = a_active_counter_scope;
 }
 
@@ -493,6 +503,73 @@ 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::CounterManager 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;
+
+      //CounterScope& counterScope(*scope);
+      //Guard csGuard(counterScope, "oam::CounterScope from oam::CounterManager::record");
+      Guard csGuard(cscope, "oam::CounterScope from oam::CounterManager::record");
+
+      for(register 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()
 //------------------------------------------------------------------------------