orb: add a separate uORB::Manager::initialize() method

This fixes a race condition: uORB::Manager::get_instance() is used in a
multi-thread context, but the singleton initialization was not thread-safe.
Further, this avoids having to check for nullptr every time the singleton
is accessed.

uORB::Manager::initialize() is called when uorb is started. No one else
accesses the singleton before that point, because it is only used in the
orb_* methods, and in muorb. Both require uorb to be started already when
they are used.
This commit is contained in:
Beat Küng
2016-04-22 16:28:23 +02:00
committed by Lorenz Meier
parent 1b133931a6
commit 1a57488ac6
3 changed files with 19 additions and 3 deletions

View File

@@ -49,13 +49,13 @@ uORB::Manager *uORB::Manager::_Instance = nullptr;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
uORB::Manager *uORB::Manager::get_instance()
bool uORB::Manager::initialize()
{
if (_Instance == nullptr) {
_Instance = new uORB::Manager();
}
return _Instance;
return _Instance != nullptr;
}
//-----------------------------------------------------------------------------