diff options
Diffstat (limited to 'cppe/src/IceE/StaticMutex.cpp')
-rw-r--r-- | cppe/src/IceE/StaticMutex.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/cppe/src/IceE/StaticMutex.cpp b/cppe/src/IceE/StaticMutex.cpp new file mode 100644 index 00000000000..1158237d7f4 --- /dev/null +++ b/cppe/src/IceE/StaticMutex.cpp @@ -0,0 +1,42 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2005 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICEE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <IceE/StaticMutex.h> + +#ifdef _WIN32 +void IceE::StaticMutex::initialize() const +{ + // + // First we create the new critical section + // + CRITICAL_SECTION* newCriticalSection = new CRITICAL_SECTION; + InitializeCriticalSection(newCriticalSection); + + // + // Then assign it to _mutex + // Note that Windows performs a full memory barrier before the assignment; + // this ensures we write the initialized critical section before we write _mutex. + // + if(InterlockedCompareExchangePointer(reinterpret_cast<void**>(&_mutex), newCriticalSection, 0) != 0) + { + // + // Another thread was doing the same thing + // + DeleteCriticalSection(newCriticalSection); + delete newCriticalSection; + } + + // + // This implementation does not attempt to clean up the initialized and assigned critical sections: + // they leak + // +} +#endif + +IceE::StaticMutex IceE::globalMutex = ICEE_STATIC_MUTEX_INITIALIZER; |