made use of boost::shared_mutex dependent from WITH_THREADS

This commit is contained in:
Nicola Bertoldi 2015-05-04 09:24:36 +02:00
parent 3400b622c0
commit 85a4e48df4

View File

@ -26,7 +26,9 @@ namespace Moses
typedef scratchpad_t::value_type entry_t;
typedef scratchpad_t::const_iterator const_iter_t;
scratchpad_t m_scratchpad;
#ifdef WITH_THREADS
mutable boost::shared_mutex m_lock;
#endif
public:
// class write_access
// {
@ -52,7 +54,9 @@ namespace Moses
boost::shared_ptr<void> const&
set(void const* const key, boost::shared_ptr<T> const& val)
{
#ifdef WITH_THREADS
boost::unique_lock<boost::shared_mutex> lock(m_lock);
#endif
return (m_scratchpad[key] = val);
}
@ -60,24 +64,30 @@ namespace Moses
boost::shared_ptr<T> const
get(void const* key, bool CreateNewIfNecessary=false)
{
#ifdef WITH_THREADS
using boost::shared_mutex;
using boost::upgrade_lock;
// T const* key = reinterpret_cast<T const*>(xkey);
upgrade_lock<shared_mutex> lock(m_lock);
#endif
iter_t m = m_scratchpad.find(key);
boost::shared_ptr< T > ret;
if (m != m_scratchpad.end())
{
if (m->second == NULL && CreateNewIfNecessary)
{
#ifdef WITH_THREADS
boost::upgrade_to_unique_lock<shared_mutex> xlock(lock);
#endif
m->second.reset(new T);
}
ret = boost::static_pointer_cast< T >(m->second);
return ret;
}
if (!CreateNewIfNecessary) return ret;
#ifdef WITH_THREADS
boost::upgrade_to_unique_lock<shared_mutex> xlock(lock);
#endif
ret.reset(new T);
m_scratchpad[key] = ret;
return ret;
@ -87,8 +97,10 @@ namespace Moses
ContextScope(ContextScope const& other)
{
#ifdef WITH_THREADS
boost::unique_lock<boost::shared_mutex> lock1(this->m_lock);
boost::unique_lock<boost::shared_mutex> lock2(other.m_lock);
#endif
m_scratchpad = other.m_scratchpad;
}