Improve singleton implementation

Still not thread-safe, but a bit better now. Should be made thread-safe
and maybe get converted to a template, if possible.
This commit is contained in:
Bim Overbohm 2013-05-27 12:38:39 +02:00
parent e51dd35166
commit 6d499d4e3a
2 changed files with 24 additions and 6 deletions

View file

@ -12,7 +12,7 @@
const char * VolumeControl::mixerCard = "default";
#endif
std::shared_ptr<VolumeControl> VolumeControl::sInstance;
std::weak_ptr<VolumeControl> VolumeControl::sInstance;
VolumeControl::VolumeControl()
@ -31,6 +31,20 @@ VolumeControl::VolumeControl()
originalVolume = getVolume();
}
VolumeControl::VolumeControl(const VolumeControl & right)
{
sInstance = right.sInstance;
}
VolumeControl & VolumeControl::operator=(const VolumeControl & right)
{
if (this != &right) {
sInstance = right.sInstance;
}
return *this;
}
VolumeControl::~VolumeControl()
{
//set original volume levels for system
@ -42,10 +56,12 @@ VolumeControl::~VolumeControl()
std::shared_ptr<VolumeControl> & VolumeControl::getInstance()
{
//check if an VolumeControl instance is already created, if not create one
if (sInstance == nullptr) {
sInstance = std::shared_ptr<VolumeControl>(new VolumeControl);
static std::shared_ptr<VolumeControl> sharedInstance = sInstance.lock();
if (sharedInstance == nullptr) {
sharedInstance.reset(new VolumeControl);
sInstance = sharedInstance;
}
return sInstance;
return sharedInstance;
}
void VolumeControl::init()

View file

@ -39,9 +39,11 @@ class VolumeControl
int originalVolume;
int internalVolume;
static std::shared_ptr<VolumeControl> sInstance;
static std::weak_ptr<VolumeControl> sInstance;
VolumeControl();
VolumeControl(const VolumeControl & right);
VolumeControl & operator=(const VolumeControl & right);
public:
static std::shared_ptr<VolumeControl> & getInstance();
@ -52,5 +54,5 @@ public:
int getVolume() const;
void setVolume(int volume);
virtual ~VolumeControl();
~VolumeControl();
};