Allow separate stacks registration through services operation
[anna.git] / source / core / oam / Module.cpp
index b7baf28..2fa403e 100644 (file)
@@ -229,8 +229,9 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s
   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 >= MaxScope) {
@@ -479,17 +480,17 @@ 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;                                               
-}                                                                                   
-                                                                                    
+  a_module(module) {
+  module->a_counterRecording = true;
+}
+
 
 //------------------------------------------------------------------------------
 //------------------------------------ Module::RecordingGuard::~RecordingGuard()
 //------------------------------------------------------------------------------
-anna::oam::Module::RecordingGuard::~RecordingGuard() {                            
-  a_module->a_counterRecording = false;                                            
-}                                                                                   
+anna::oam::Module::RecordingGuard::~RecordingGuard() {
+  a_module->a_counterRecording = false;
+}
 
 
 //------------------------------------------------------------------------------
@@ -561,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: ";
@@ -622,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));