|
From: <ric...@us...> - 2009-02-02 07:45:56
|
Revision: 985
http://loki-lib.svn.sourceforge.net/loki-lib/?rev=985&view=rev
Author: rich_sposato
Date: 2009-02-02 07:45:50 +0000 (Mon, 02 Feb 2009)
Log Message:
-----------
Fixed bug 1776032 by changing class to singleton.
Modified Paths:
--------------
trunk/include/loki/Threads.h
Modified: trunk/include/loki/Threads.h
===================================================================
--- trunk/include/loki/Threads.h 2009-02-02 06:23:28 UTC (rev 984)
+++ trunk/include/loki/Threads.h 2009-02-02 07:45:50 UTC (rev 985)
@@ -523,6 +523,19 @@
{
struct Initializer
{
+
+ /// This function provides a Scott-Meyers type of Singleton as the initializer
+ /// for the shared mutex.
+ static Initializer & GetIt( void )
+ {
+ static Initializer initializer_;
+ return initializer_;
+ }
+
+ inline bool IsInit( void ) { return init_; }
+ inline MutexPolicy & GetMutex( void ) { return mtx_; }
+
+ private:
bool init_;
MutexPolicy mtx_;
@@ -535,10 +548,11 @@
{
assert(init_);
}
+
+ Initializer( const Initializer & );
+ Initializer & operator = ( const Initializer & );
};
- static Initializer initializer_;
-
public:
class Lock;
@@ -553,29 +567,33 @@
/// Lock class
Lock()
{
- assert(initializer_.init_);
- initializer_.mtx_.Lock();
+ Initializer & initializer = Initializer::GetIt();
+ assert( initializer.IsInit() );
+ initializer.GetMutex().Lock();
}
/// Lock class
explicit Lock(const ClassLevelLockable&)
{
- assert(initializer_.init_);
- initializer_.mtx_.Lock();
+ Initializer & initializer = Initializer::GetIt();
+ assert( initializer.IsInit() );
+ initializer.GetMutex().Lock();
}
/// Lock class
explicit Lock(const ClassLevelLockable*)
{
- assert(initializer_.init_);
- initializer_.mtx_.Lock();
+ Initializer & initializer = Initializer::GetIt();
+ assert( initializer.IsInit() );
+ initializer.GetMutex().Lock();
}
/// Unlock class
~Lock()
{
- assert(initializer_.init_);
- initializer_.mtx_.Unlock();
+ Initializer & initializer = Initializer::GetIt();
+ assert( initializer.IsInit() );
+ initializer.GetMutex().Unlock();
}
private:
@@ -596,10 +614,6 @@
pthread_mutex_t ClassLevelLockable<Host, MutexPolicy>::atomic_mutex_ = PTHREAD_MUTEX_INITIALIZER;
#endif
- template < class Host, class MutexPolicy >
- typename ClassLevelLockable< Host, MutexPolicy >::Initializer
- ClassLevelLockable< Host, MutexPolicy >::initializer_;
-
#endif // #if defined(LOKI_WINDOWS_H) || defined(LOKI_PTHREAD_H)
} // namespace Loki
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|