From faedfa6ed4f08a1643913518ff0f1f9c1719228f Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Wed, 24 Jun 2015 04:25:10 -0700 Subject: [PATCH] artf4107: GetInstance() calls are now atomic C++11 guarantees construction of static variables to be atomic, so this patch takes advantage of that. Change-Id: I4a3db0f19c5fa5461fef3b6b63d7b8fec596c962 --- wpilibc/wpilibC++/include/Commands/Scheduler.h | 1 - wpilibc/wpilibC++/src/Commands/Scheduler.cpp | 6 ++---- wpilibc/wpilibC++/src/LiveWindow/LiveWindow.cpp | 5 ++--- wpilibc/wpilibC++Devices/include/CameraServer.h | 2 -- wpilibc/wpilibC++Devices/include/Preferences.h | 2 -- wpilibc/wpilibC++Devices/src/CameraServer.cpp | 7 ++----- wpilibc/wpilibC++Devices/src/DriverStation.cpp | 8 ++------ wpilibc/wpilibC++Devices/src/Preferences.cpp | 6 ++---- wpilibc/wpilibC++Sim/include/simulation/MainNode.h | 8 ++------ wpilibc/wpilibC++Sim/src/DriverStation.cpp | 9 ++------- wpilibc/wpilibC++Sim/src/simulation/MainNode.cpp | 3 --- 11 files changed, 14 insertions(+), 43 deletions(-) delete mode 100644 wpilibc/wpilibC++Sim/src/simulation/MainNode.cpp diff --git a/wpilibc/wpilibC++/include/Commands/Scheduler.h b/wpilibc/wpilibC++/include/Commands/Scheduler.h index 985fce9475..c794f4871b 100644 --- a/wpilibc/wpilibC++/include/Commands/Scheduler.h +++ b/wpilibc/wpilibC++/include/Commands/Scheduler.h @@ -50,7 +50,6 @@ class Scheduler : public ErrorBase, public NamedSendable { void ProcessCommandAddition(Command *command); - static Scheduler *_instance; Command::SubsystemSet m_subsystems; MUTEX_ID m_buttonsLock = nullptr; typedef std::vector ButtonVector; diff --git a/wpilibc/wpilibC++/src/Commands/Scheduler.cpp b/wpilibc/wpilibC++/src/Commands/Scheduler.cpp index 7208629cae..c23785d2b6 100644 --- a/wpilibc/wpilibC++/src/Commands/Scheduler.cpp +++ b/wpilibc/wpilibC++/src/Commands/Scheduler.cpp @@ -16,8 +16,6 @@ #include #include -Scheduler *Scheduler::_instance = nullptr; - Scheduler::Scheduler() { m_buttonsLock = initializeMutexNormal(); m_additionsLock = initializeMutexNormal(); @@ -38,8 +36,8 @@ Scheduler::~Scheduler() { * @return the {@link Scheduler} */ Scheduler *Scheduler::GetInstance() { - if (_instance == nullptr) _instance = new Scheduler(); - return _instance; + static Scheduler instance; + return &instance; } void Scheduler::SetEnabled(bool enabled) { m_enabled = enabled; } diff --git a/wpilibc/wpilibC++/src/LiveWindow/LiveWindow.cpp b/wpilibc/wpilibC++/src/LiveWindow/LiveWindow.cpp index b315fb5d32..a211115ea6 100644 --- a/wpilibc/wpilibC++/src/LiveWindow/LiveWindow.cpp +++ b/wpilibc/wpilibC++/src/LiveWindow/LiveWindow.cpp @@ -10,9 +10,8 @@ * how many times GetInstance is called. */ LiveWindow *LiveWindow::GetInstance() { - static LiveWindow *instance = new LiveWindow(); - - return instance; + static LiveWindow instance; + return &instance; } /** diff --git a/wpilibc/wpilibC++Devices/include/CameraServer.h b/wpilibc/wpilibC++Devices/include/CameraServer.h index 046224a7db..3466ab4663 100644 --- a/wpilibc/wpilibC++Devices/include/CameraServer.h +++ b/wpilibc/wpilibC++Devices/include/CameraServer.h @@ -55,8 +55,6 @@ class CameraServer : public ErrorBase { uint32_t size; }; - static CameraServer* s_instance; - public: static CameraServer* GetInstance(); void SetImage(Image const* image); diff --git a/wpilibc/wpilibC++Devices/include/Preferences.h b/wpilibc/wpilibC++Devices/include/Preferences.h index dceb6f1bee..9464b2b389 100644 --- a/wpilibc/wpilibC++Devices/include/Preferences.h +++ b/wpilibc/wpilibC++Devices/include/Preferences.h @@ -82,8 +82,6 @@ class Preferences : public ErrorBase, public ITableListener { return 0; } - static Preferences *_instance; - /** The semaphore for accessing the file */ MUTEX_ID m_fileLock = nullptr; /** The semaphore for beginning reads and writes to the file */ diff --git a/wpilibc/wpilibC++Devices/src/CameraServer.cpp b/wpilibc/wpilibC++Devices/src/CameraServer.cpp index 8a541a08ba..847fd2bab2 100644 --- a/wpilibc/wpilibC++Devices/src/CameraServer.cpp +++ b/wpilibc/wpilibC++Devices/src/CameraServer.cpp @@ -10,13 +10,10 @@ #include constexpr uint8_t CameraServer::kMagicNumber[]; -CameraServer* CameraServer::s_instance = nullptr; CameraServer* CameraServer::GetInstance() { - if (s_instance == nullptr) { - s_instance = new CameraServer; - } - return s_instance; + static CameraServer instance; + return &instance; } CameraServer::CameraServer() diff --git a/wpilibc/wpilibC++Devices/src/DriverStation.cpp b/wpilibc/wpilibC++Devices/src/DriverStation.cpp index 96a78222a2..e072758c4f 100644 --- a/wpilibc/wpilibC++Devices/src/DriverStation.cpp +++ b/wpilibc/wpilibC++Devices/src/DriverStation.cpp @@ -28,7 +28,6 @@ const double JOYSTICK_UNPLUGGED_MESSAGE_INTERVAL = 1.0; Log().Get(level) const uint32_t DriverStation::kJoystickPorts; -DriverStation* DriverStation::m_instance = nullptr; /** * DriverStation constructor. @@ -73,7 +72,6 @@ DriverStation::DriverStation() { DriverStation::~DriverStation() { m_task.Stop(); - m_instance = nullptr; deleteMultiWait(m_waitForDataSem); // Unregister our semaphore. HALSetNewDataSem(nullptr); @@ -111,10 +109,8 @@ void DriverStation::Run() { * @return Pointer to the DS instance */ DriverStation* DriverStation::GetInstance() { - if (m_instance == nullptr) { - m_instance = new DriverStation(); - } - return m_instance; + static DriverStation instance; + return &instance; } /** diff --git a/wpilibc/wpilibC++Devices/src/Preferences.cpp b/wpilibc/wpilibC++Devices/src/Preferences.cpp index 45ef755c07..e7d395820e 100644 --- a/wpilibc/wpilibC++Devices/src/Preferences.cpp +++ b/wpilibc/wpilibC++Devices/src/Preferences.cpp @@ -24,8 +24,6 @@ static const char *kFileName = "/home/lvuser/wpilib-preferences.ini"; static const char *kValuePrefix = "=\""; /** The characters to put after the value */ static const char *kValueSuffix = "\"\n"; -/** The singleton instance */ -Preferences *Preferences::_instance = nullptr; Preferences::Preferences() : m_readTask("PreferencesReadTask", (FUNCPTR)Preferences::InitReadTask), @@ -54,8 +52,8 @@ Preferences::~Preferences() { * @return pointer to the {@link Preferences} */ Preferences *Preferences::GetInstance() { - if (_instance == nullptr) _instance = new Preferences; - return _instance; + static Preferences instance; + return &instance; } /** diff --git a/wpilibc/wpilibC++Sim/include/simulation/MainNode.h b/wpilibc/wpilibC++Sim/include/simulation/MainNode.h index 82db41d485..87a68d3d82 100644 --- a/wpilibc/wpilibC++Sim/include/simulation/MainNode.h +++ b/wpilibc/wpilibC++Sim/include/simulation/MainNode.h @@ -10,10 +10,8 @@ using namespace gazebo; class MainNode { public: static MainNode* GetInstance() { - if (instance == nullptr) { - instance = new MainNode(); - } - return instance; + static MainNode instance; + return &instance; } template @@ -39,8 +37,6 @@ public: transport::NodePtr main; private: - static MainNode* instance; - MainNode() { gazebo::transport::init(); main = transport::NodePtr(new transport::Node()); diff --git a/wpilibc/wpilibC++Sim/src/DriverStation.cpp b/wpilibc/wpilibC++Sim/src/DriverStation.cpp index f21af70202..cf3d4203d3 100644 --- a/wpilibc/wpilibC++Sim/src/DriverStation.cpp +++ b/wpilibc/wpilibC++Sim/src/DriverStation.cpp @@ -26,7 +26,6 @@ const uint32_t DriverStation::kBatteryChannel; const uint32_t DriverStation::kJoystickPorts; const uint32_t DriverStation::kJoystickAxes; constexpr float DriverStation::kUpdatePeriod; -DriverStation* DriverStation::m_instance = nullptr; uint8_t DriverStation::m_updateNumber = 0; /** @@ -70,7 +69,6 @@ DriverStation::DriverStation() DriverStation::~DriverStation() { - m_instance = nullptr; deleteMultiWait(m_waitForDataSem); deleteMutex(m_waitForDataMutex); // TODO: Release m_stateSemaphore and m_joystickSemaphore? @@ -81,11 +79,8 @@ DriverStation::~DriverStation() */ DriverStation* DriverStation::GetInstance() { - if (m_instance == nullptr) - { - m_instance = new DriverStation(); - } - return m_instance; + static DriverStation instance; + return &instance; } /** diff --git a/wpilibc/wpilibC++Sim/src/simulation/MainNode.cpp b/wpilibc/wpilibC++Sim/src/simulation/MainNode.cpp deleted file mode 100644 index ef00026d6d..0000000000 --- a/wpilibc/wpilibC++Sim/src/simulation/MainNode.cpp +++ /dev/null @@ -1,3 +0,0 @@ - -#include "simulation/MainNode.h" -MainNode* MainNode::instance = nullptr;