ClearScript/ClearScriptV8/Mutex.cpp

139 строки
2.9 KiB
C++
Исходник Обычный вид История

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
2013-01-07 20:34:03 +04:00
#include "ClearScriptV8Native.h"
2013-01-07 20:34:03 +04:00
//-----------------------------------------------------------------------------
// SimpleMutex implementation
//-----------------------------------------------------------------------------
SimpleMutex::SimpleMutex():
m_pImpl(new Impl)
{
}
//-----------------------------------------------------------------------------
void SimpleMutex::Lock()
{
m_pImpl->lock();
}
2013-01-07 20:34:03 +04:00
//-----------------------------------------------------------------------------
bool SimpleMutex::TryLock()
{
return m_pImpl->try_lock();
}
//-----------------------------------------------------------------------------
void SimpleMutex::Unlock()
{
m_pImpl->unlock();
}
2013-01-07 20:34:03 +04:00
//-----------------------------------------------------------------------------
SimpleMutex::~SimpleMutex()
{
delete m_pImpl;
}
2013-01-07 20:34:03 +04:00
//-----------------------------------------------------------------------------
// RecursiveMutex implementation
//-----------------------------------------------------------------------------
RecursiveMutex::RecursiveMutex():
m_pImpl(new Impl)
{
}
//-----------------------------------------------------------------------------
void RecursiveMutex::Lock()
{
m_pImpl->lock();
}
2013-01-07 20:34:03 +04:00
//-----------------------------------------------------------------------------
bool RecursiveMutex::TryLock()
{
return m_pImpl->try_lock();
}
//-----------------------------------------------------------------------------
void RecursiveMutex::Unlock()
{
m_pImpl->unlock();
}
2013-01-07 20:34:03 +04:00
//-----------------------------------------------------------------------------
RecursiveMutex::~RecursiveMutex()
{
delete m_pImpl;
}
//-----------------------------------------------------------------------------
// OnceFlag::Impl
//-----------------------------------------------------------------------------
class OnceFlag::Impl final
{
PROHIBIT_COPY(Impl)
public:
Impl():
m_Called(false)
{
}
void CallOnce(const std::function<void()>& func)
{
if (!m_Called)
{
BEGIN_MUTEX_SCOPE(m_Mutex)
if (!m_Called)
{
func();
m_Called = true;
}
END_MUTEX_SCOPE
}
}
private:
std::atomic<bool> m_Called;
SimpleMutex m_Mutex;
};
//-----------------------------------------------------------------------------
// OnceFlag implementation
//-----------------------------------------------------------------------------
OnceFlag::OnceFlag():
m_pImpl(new Impl)
{
}
//-----------------------------------------------------------------------------
void OnceFlag::CallOnce(const std::function<void()>& func)
{
m_pImpl->CallOnce(func);
}
//-----------------------------------------------------------------------------
OnceFlag::~OnceFlag()
{
delete m_pImpl;
}