39 #ifndef BLOCXX_GENERIC_RWLOCK_IMPL_HPP_INCLUDE_GUARD_
40 #define BLOCXX_GENERIC_RWLOCK_IMPL_HPP_INCLUDE_GUARD_
41 #include "blocxx/BLOCXX_config.h"
54 namespace BLOCXX_NAMESPACE
63 template <
typename IdT,
typename CompareT>
120 typedef std::map<IdT, LockerInfo, CompareT>
IdMap;
129 template <
typename IdT,
typename CompareT>
137 template <
typename IdT,
typename CompareT>
142 template <
typename IdT,
typename CompareT>
149 typename IdMap::iterator info = m_lockerInfo.find(
id);
151 if (info != m_lockerInfo.end())
161 while (!m_canRead || m_numWriters > 0)
173 m_lockerInfo.insert(
typename IdMap::value_type(
id, lockerInfo));
179 template <
typename IdT,
typename CompareT>
185 typename IdMap::iterator pInfo = m_lockerInfo.find(
id);
187 if (pInfo == m_lockerInfo.end() || !pInfo->second.isReader())
198 if (m_numReaders == 0)
202 m_waiting_writers.notifyAll();
204 m_lockerInfo.erase(pInfo);
209 template <
typename IdT,
typename CompareT>
233 typename IdMap::iterator pInfo = m_lockerInfo.find(
id);
234 if (pInfo != m_lockerInfo.end())
245 if (m_numWriters == 1)
257 while (m_numReaders != 0)
268 if (m_numWriters == 0)
270 m_waiting_readers.notifyAll();
283 while (m_numReaders != 0 || m_numWriters != 0)
291 if (m_numWriters == 0)
293 m_waiting_readers.notifyAll();
302 m_lockerInfo.insert(
typename IdMap::value_type(
id, ti));
310 template <
typename IdT,
typename CompareT>
316 typename IdMap::iterator pInfo = m_lockerInfo.find(
id);
318 if (pInfo == m_lockerInfo.end() || !pInfo->second.isWriter())
344 m_waiting_writers.notifyOne();
345 m_lockerInfo.erase(pInfo);
347 m_waiting_readers.notifyAll();