leonid@252: // thread safe que leonid@252: // Tochinski Leonid, Chatten Associayes, Inc. leonid@252: #pragma once leonid@252: #include leonid@252: #include "AutoReleaseCS.h" leonid@252: leonid@252: template leonid@252: class async_access_que leonid@252: { leonid@252: public: leonid@252: async_access_que() leonid@252: { leonid@252: ::InitializeCriticalSection(&m_cs); leonid@252: } leonid@252: ~async_access_que() leonid@252: { leonid@252: ::DeleteCriticalSection(&m_cs); leonid@252: } leonid@252: leonid@252: void append(const type& data) leonid@252: { leonid@252: AutoReleaseCS acs(m_cs); leonid@252: m_data.push_back(data); leonid@252: } leonid@252: leonid@252: bool extract_top(type& data) leonid@252: { leonid@252: AutoReleaseCS acs(m_cs); leonid@252: if (m_data.empty()) leonid@252: return false; leonid@252: data = m_data.front(); leonid@252: m_data.pop_front(); leonid@252: return true; leonid@252: } leonid@252: leonid@252: void clear() leonid@252: { leonid@252: AutoReleaseCS acs(m_cs); leonid@252: m_data.clear(); leonid@252: } leonid@252: leonid@252: protected: leonid@252: std::deque m_data; leonid@252: CRITICAL_SECTION m_cs; leonid@252: };