From 3f79450b19a2ae9ae07e4e02743cb16dde2751fc Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Mon, 11 May 2020 12:00:30 +0200 Subject: [PATCH 01/12] removed config include, new retvals, nullptr check --- objectmanager/ObjectManagerIF.h | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/objectmanager/ObjectManagerIF.h b/objectmanager/ObjectManagerIF.h index aca24a24..3575fc16 100644 --- a/objectmanager/ObjectManagerIF.h +++ b/objectmanager/ObjectManagerIF.h @@ -9,9 +9,9 @@ #define OBJECTMANAGERIF_H_ #include -#include #include #include +#include /** * @brief This class provides an interface to the global object manager. @@ -24,9 +24,12 @@ */ class ObjectManagerIF : public HasReturnvaluesIF { public: - static const uint8_t INTERFACE_ID = CLASS_ID::OBJECT_MANAGER_IF; - static const ReturnValue_t INSERTION_FAILED = MAKE_RETURN_CODE( 1 ); - static const ReturnValue_t NOT_FOUND = MAKE_RETURN_CODE( 2 ); + static constexpr uint8_t INTERFACE_ID = CLASS_ID::OBJECT_MANAGER_IF; + static constexpr ReturnValue_t INSERTION_FAILED = MAKE_RETURN_CODE( 1 ); + static constexpr ReturnValue_t NOT_FOUND = MAKE_RETURN_CODE( 2 ); + static constexpr ReturnValue_t CHILD_INIT_FAILED = MAKE_RETURN_CODE( 3 ); + static constexpr ReturnValue_t INTERNAL_ERR_REPORTER_UNINIT = MAKE_RETURN_CODE( 4 ); + protected: /** * @brief This method is used to hide the template-based get call from @@ -78,15 +81,22 @@ public: virtual void printList() = 0; }; -template -T* ObjectManagerIF::get( object_id_t id ) { - SystemObjectIF* temp = this->getSystemObject(id); - return dynamic_cast(temp); -} /** * @brief This is the forward declaration of the global objectManager instance. */ extern ObjectManagerIF *objectManager; +/*Documentation can be found in the class method declaration above.*/ +template +T* ObjectManagerIF::get( object_id_t id ) { + if(objectManager == nullptr) { + sif::error << "ObjectManagerIF: Global object manager has not " + "been initialized yet!" << std::endl; + std::exit(0); + } + SystemObjectIF* temp = this->getSystemObject(id); + return dynamic_cast(temp); +} + #endif /* OBJECTMANAGERIF_H_ */ From 2030415adbb8b18cda2337beaa5686e6219b8be5 Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Fri, 29 May 2020 17:17:46 +0200 Subject: [PATCH 02/12] added back include, but header needs to be included from build system now, which allows multiple config folders --- objectmanager/ObjectManagerIF.h | 1 + 1 file changed, 1 insertion(+) diff --git a/objectmanager/ObjectManagerIF.h b/objectmanager/ObjectManagerIF.h index 3575fc16..b5cab408 100644 --- a/objectmanager/ObjectManagerIF.h +++ b/objectmanager/ObjectManagerIF.h @@ -8,6 +8,7 @@ #ifndef OBJECTMANAGERIF_H_ #define OBJECTMANAGERIF_H_ +#include "systemObjectList.h" #include #include #include From 05435a3ea3d4775b856debfbaa9f8ae487bc3f20 Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 14:11:08 +0200 Subject: [PATCH 03/12] includde removed --- objectmanager/ObjectManagerIF.h | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/objectmanager/ObjectManagerIF.h b/objectmanager/ObjectManagerIF.h index b5cab408..57b2faa7 100644 --- a/objectmanager/ObjectManagerIF.h +++ b/objectmanager/ObjectManagerIF.h @@ -1,14 +1,6 @@ -/** - * @file ObjectManagerIF.h - * @brief This file contains the implementation of the ObjectManagerIF interface - * @date 19.09.2012 - * @author Bastian Baetz - */ +#ifndef FRAMEWORK_OBJECTMANAGER_OBJECTMANAGERIF_H_ +#define FRAMEWORK_OBJECTMANAGER_OBJECTMANAGERIF_H_ -#ifndef OBJECTMANAGERIF_H_ -#define OBJECTMANAGERIF_H_ - -#include "systemObjectList.h" #include #include #include @@ -21,7 +13,8 @@ * inserted, removed and retrieved from the list. On getting the * object, the call checks if the object implements the requested * interface. - * \ingroup system_objects + * @author Bastian Baetz + * @ingroup system_objects */ class ObjectManagerIF : public HasReturnvaluesIF { public: From 93ef4eb56b8fbd172bfba25ebe0b3616c2d99f9d Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 14:13:24 +0200 Subject: [PATCH 04/12] exti code is one --- objectmanager/ObjectManagerIF.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objectmanager/ObjectManagerIF.h b/objectmanager/ObjectManagerIF.h index 57b2faa7..0dfb7f30 100644 --- a/objectmanager/ObjectManagerIF.h +++ b/objectmanager/ObjectManagerIF.h @@ -87,7 +87,7 @@ T* ObjectManagerIF::get( object_id_t id ) { if(objectManager == nullptr) { sif::error << "ObjectManagerIF: Global object manager has not " "been initialized yet!" << std::endl; - std::exit(0); + std::exit(1); } SystemObjectIF* temp = this->getSystemObject(id); return dynamic_cast(temp); From 365f9f8434f4811b2681612793e222b430a21c8a Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 21:05:08 +0200 Subject: [PATCH 05/12] small improvements for object manager.cpp exit removed for get function --- objectmanager/ObjectManager.cpp | 10 +++++----- objectmanager/ObjectManagerIF.h | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index 2f99e1a5..67cf5c1c 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -23,8 +23,8 @@ ReturnValue_t ObjectManager::insert( object_id_t id, SystemObjectIF* object) { } else { sif::error << "ObjectManager::insert: Object id " << std::hex << (int)id << std::dec << " is already in use!" << std::endl; - exit(0); //This is very severe and difficult to handle in other places. - return this->INSERTION_FAILED; + //This is very severe and difficult to handle in other places. + std::exit(INSERTION_FAILED); } } @@ -67,9 +67,9 @@ void ObjectManager::initialize() { return_value = it->second->initialize(); if ( return_value != RETURN_OK ) { object_id_t var = it->first; - sif::error << "Object " << std::hex << (int) var - << " failed to initialize with code 0x" << return_value - << std::dec << std::endl; + sif::error << "Object 0x" << std::hex << std::setw(8) << + std::setfill('0')<< var << " failed to initialize " << + "with code 0x" << return_value << std::dec << std::endl; error_count++; } } diff --git a/objectmanager/ObjectManagerIF.h b/objectmanager/ObjectManagerIF.h index 0dfb7f30..90a1ce3b 100644 --- a/objectmanager/ObjectManagerIF.h +++ b/objectmanager/ObjectManagerIF.h @@ -87,7 +87,6 @@ T* ObjectManagerIF::get( object_id_t id ) { if(objectManager == nullptr) { sif::error << "ObjectManagerIF: Global object manager has not " "been initialized yet!" << std::endl; - std::exit(1); } SystemObjectIF* temp = this->getSystemObject(id); return dynamic_cast(temp); From a37a2197d1622cc99b3bb2841b17f033e4e77138 Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 21:10:56 +0200 Subject: [PATCH 06/12] some form improvements for object manager .cpp --- objectmanager/ObjectManager.cpp | 34 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index 67cf5c1c..3e0bfed6 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -2,21 +2,19 @@ #include #include -ObjectManager::ObjectManager( void (*setProducer)() ) : produceObjects(setProducer) { +ObjectManager::ObjectManager( void (*setProducer)() ): + produceObjects(setProducer) { //There's nothing special to do in the constructor. } ObjectManager::~ObjectManager() { - std::map::iterator it; - for (it = this->objectList.begin(); it != this->objectList.end(); it++) { - delete it->second; - } + // Map is STL object and deletes its own pointers. } ReturnValue_t ObjectManager::insert( object_id_t id, SystemObjectIF* object) { - bool insert_return = this->objectList.insert( std::pair< object_id_t, SystemObjectIF* >( id, object ) ).second; - if (insert_return == true) { + auto returnPair = objectList.emplace(id, object); + if (returnPair.second) { // sif::debug << "ObjectManager::insert: Object " << std::hex // << (int)id << std::dec << " inserted." << std::endl; return this->RETURN_OK; @@ -44,18 +42,15 @@ ReturnValue_t ObjectManager::remove( object_id_t id ) { SystemObjectIF* ObjectManager::getSystemObject( object_id_t id ) { - std::map::iterator it = this->objectList.find( id ); - if (it == this->objectList.end() ) { - //Changed for testing different method. -// SystemObjectIF* object = this->produceObjects( id ); -// return object; - return NULL; + auto listIter = this->objectList.find( id ); + if (listIter == this->objectList.end() ) { + return nullptr; } else { - return it->second; + return listIter->second; } } -ObjectManager::ObjectManager( ) : produceObjects(NULL) { +ObjectManager::ObjectManager() : produceObjects(nullptr) { } @@ -63,7 +58,7 @@ void ObjectManager::initialize() { this->produceObjects(); ReturnValue_t return_value = RETURN_FAILED; uint32_t error_count = 0; - for (std::map::iterator it = this->objectList.begin(); it != objectList.end(); it++ ) { + for (auto it = this->objectList.begin(); it != objectList.end(); it++ ) { return_value = it->second->initialize(); if ( return_value != RETURN_OK ) { object_id_t var = it->first; @@ -79,10 +74,11 @@ void ObjectManager::initialize() { } //Init was successful. Now check successful interconnections. error_count = 0; - for (std::map::iterator it = this->objectList.begin(); it != objectList.end(); it++ ) { - return_value = it->second->checkObjectConnections(); + for (auto listIter = this->objectList.begin(); + listIter != objectList.end(); listIter++ ) { + return_value = listIter->second->checkObjectConnections(); if ( return_value != RETURN_OK ) { - sif::error << "Object " << std::hex << (int) it->first + sif::error << "Object " << std::hex << (int) listIter->first << " connection check failed with code 0x" << return_value << std::dec << std::endl; error_count++; From 5d3b3bae168667f86b53c034ed0d9b8f2bf3bc1a Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 21:14:53 +0200 Subject: [PATCH 07/12] addtiional nullptr check --- objectmanager/ObjectManager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index 3e0bfed6..a5895098 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -55,6 +55,11 @@ ObjectManager::ObjectManager() : produceObjects(nullptr) { } void ObjectManager::initialize() { + if(produceObjects == nullptr) { + sif::error << "ObjectManager: Passed produceObjects functions is" + "nullptr!" << std::endl; + return; + } this->produceObjects(); ReturnValue_t return_value = RETURN_FAILED; uint32_t error_count = 0; From 0ac3cf8fadd15d155ecc3df9ca2ba0344bbd3859 Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 21:25:14 +0200 Subject: [PATCH 08/12] reverted wrong change --- objectmanager/ObjectManager.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index a5895098..b12c66d9 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -9,7 +9,9 @@ ObjectManager::ObjectManager( void (*setProducer)() ): ObjectManager::~ObjectManager() { - // Map is STL object and deletes its own pointers. + for (auto const& iter : objectList) { + delete iter.second; + } } ReturnValue_t ObjectManager::insert( object_id_t id, SystemObjectIF* object) { @@ -99,7 +101,7 @@ void ObjectManager::initialize() { void ObjectManager::printList() { std::map::iterator it; sif::debug << "ObjectManager: Object List contains:" << std::endl; - for (it = this->objectList.begin(); it != this->objectList.end(); it++) { - sif::debug << std::hex << it->first << " | " << it->second << std::endl; + for (auto const& it : objectList) { + sif::debug << std::hex << it.first << " | " << it.second << std::endl; } } From fd0cc2a8ca84c2eba0aac60cf62e7d9747f94427 Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Thu, 4 Jun 2020 21:26:56 +0200 Subject: [PATCH 09/12] simplified all iterations through obj list --- objectmanager/ObjectManager.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index b12c66d9..2f47950f 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -65,10 +65,10 @@ void ObjectManager::initialize() { this->produceObjects(); ReturnValue_t return_value = RETURN_FAILED; uint32_t error_count = 0; - for (auto it = this->objectList.begin(); it != objectList.end(); it++ ) { - return_value = it->second->initialize(); + for (auto const& it : objectList) { + return_value = it.second->initialize(); if ( return_value != RETURN_OK ) { - object_id_t var = it->first; + object_id_t var = it.first; sif::error << "Object 0x" << std::hex << std::setw(8) << std::setfill('0')<< var << " failed to initialize " << "with code 0x" << return_value << std::dec << std::endl; @@ -81,11 +81,10 @@ void ObjectManager::initialize() { } //Init was successful. Now check successful interconnections. error_count = 0; - for (auto listIter = this->objectList.begin(); - listIter != objectList.end(); listIter++ ) { - return_value = listIter->second->checkObjectConnections(); + for (auto const& it : objectList) { + return_value = it.second->checkObjectConnections(); if ( return_value != RETURN_OK ) { - sif::error << "Object " << std::hex << (int) listIter->first + sif::error << "Object " << std::hex << (int) it.first << " connection check failed with code 0x" << return_value << std::dec << std::endl; error_count++; From 4b5bb0b3be6e6c14c647800d7ab928a468de02aa Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Fri, 5 Jun 2020 20:59:07 +0200 Subject: [PATCH 10/12] reset setfill --- objectmanager/ObjectManager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index 2f47950f..55f7d964 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -70,8 +70,9 @@ void ObjectManager::initialize() { if ( return_value != RETURN_OK ) { object_id_t var = it.first; sif::error << "Object 0x" << std::hex << std::setw(8) << - std::setfill('0')<< var << " failed to initialize " << - "with code 0x" << return_value << std::dec << std::endl; + std::setfill('0') << var << " failed to initialize " << + "with code 0x" << return_value << std::dec << + std::setfill('') << std::endl; error_count++; } } From d387daa9d669a4a17f02b6e203241070c827c00b Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Sat, 6 Jun 2020 13:04:29 +0200 Subject: [PATCH 11/12] slight improvements for diagnositc output --- objectmanager/ObjectManager.cpp | 45 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index 55f7d964..606cd369 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -58,44 +58,43 @@ ObjectManager::ObjectManager() : produceObjects(nullptr) { void ObjectManager::initialize() { if(produceObjects == nullptr) { - sif::error << "ObjectManager: Passed produceObjects functions is" - "nullptr!" << std::endl; + sif::error << "ObjectManager::initialize: Passed produceObjects " + "functions is nullptr!" << std::endl; return; } this->produceObjects(); - ReturnValue_t return_value = RETURN_FAILED; - uint32_t error_count = 0; + ReturnValue_t result = RETURN_FAILED; + uint32_t errorCount = 0; for (auto const& it : objectList) { - return_value = it.second->initialize(); - if ( return_value != RETURN_OK ) { + result = it.second->initialize(); + if ( result != RETURN_OK ) { object_id_t var = it.first; - sif::error << "Object 0x" << std::hex << std::setw(8) << - std::setfill('0') << var << " failed to initialize " << - "with code 0x" << return_value << std::dec << - std::setfill('') << std::endl; - error_count++; + sif::error << "ObjectManager::initialize: Object 0x" << std::hex << + std::setw(8) << std::setfill('0')<< var << " failed to " + "initialize with code 0x" << result << std::dec << + std::setfill(' ') << std::endl; + errorCount++; } } - if (error_count > 0) { - sif::error << "ObjectManager::ObjectManager: Counted " << error_count + if (errorCount > 0) { + sif::error << "ObjectManager::ObjectManager: Counted " << errorCount << " failed initializations." << std::endl; } //Init was successful. Now check successful interconnections. - error_count = 0; + errorCount = 0; for (auto const& it : objectList) { - return_value = it.second->checkObjectConnections(); - if ( return_value != RETURN_OK ) { - sif::error << "Object " << std::hex << (int) it.first - << " connection check failed with code 0x" << return_value - << std::dec << std::endl; - error_count++; + result = it.second->checkObjectConnections(); + if ( result != RETURN_OK ) { + sif::error << "ObjectManager::ObjectManager: Object " << std::hex << + (int) it.first << " connection check failed with code 0x" + << result << std::dec << std::endl; + errorCount++; } } - if (error_count > 0) { - sif::error << "ObjectManager::ObjectManager: Counted " << error_count + if (errorCount > 0) { + sif::error << "ObjectManager::ObjectManager: Counted " << errorCount << " failed connection checks." << std::endl; } - } void ObjectManager::printList() { From 1748941f3b6b38015590b9437d5b84bae79b2978 Mon Sep 17 00:00:00 2001 From: "Robin.Mueller" Date: Sun, 7 Jun 2020 13:59:22 +0200 Subject: [PATCH 12/12] commented out debug output and additional diagnostic output toi make it clear the program was terminated --- objectmanager/ObjectManager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objectmanager/ObjectManager.cpp b/objectmanager/ObjectManager.cpp index 606cd369..cfdf6562 100644 --- a/objectmanager/ObjectManager.cpp +++ b/objectmanager/ObjectManager.cpp @@ -23,6 +23,7 @@ ReturnValue_t ObjectManager::insert( object_id_t id, SystemObjectIF* object) { } else { sif::error << "ObjectManager::insert: Object id " << std::hex << (int)id << std::dec << " is already in use!" << std::endl; + sif::error << "Terminating program." << std::endl; //This is very severe and difficult to handle in other places. std::exit(INSERTION_FAILED); } @@ -31,8 +32,8 @@ ReturnValue_t ObjectManager::insert( object_id_t id, SystemObjectIF* object) { ReturnValue_t ObjectManager::remove( object_id_t id ) { if ( this->getSystemObject(id) != NULL ) { this->objectList.erase( id ); - sif::debug << "ObjectManager::removeObject: Object " << std::hex - << (int)id << std::dec << " removed." << std::endl; + //sif::debug << "ObjectManager::removeObject: Object " << std::hex + // << (int)id << std::dec << " removed." << std::endl; return RETURN_OK; } else { sif::error << "ObjectManager::removeObject: Requested object "