/* (C) 2003 XDA Developers itsme@xs4all.nl * * $Header$ */ #include #include "CircularBuffer.h" CircularBuffer::CircularBuffer(int max) { InitializeCriticalSection(&m_lock); m_hEvent= CreateEvent(NULL, false, false, NULL); m_buf.resize(max); m_head= m_buf.begin(); m_tail= m_buf.begin(); m_size= 0; m_overflows= 0; } CircularBuffer::~CircularBuffer() { DeleteCriticalSection(&m_lock); CloseHandle(m_hEvent); } int CircularBuffer::Get(ByteVector& buf, int timeout) { if (m_size || WaitForSingleObject(m_hEvent, timeout)==WAIT_OBJECT_0) { EnterCriticalSection(&m_lock); DWORD size= m_size; if (m_headm_buf.size()) { m_overflows++; LeaveCriticalSection(&m_lock); return false; } if (m_head==m_buf.end()) m_head= m_buf.begin(); if (m_buf.end()-m_head < buf.size()) { copy(buf.begin(), buf.begin() + (m_buf.end()-m_head), m_head); m_head= copy(buf.begin() + (m_buf.end()-m_head), buf.end(), m_buf.begin()); } else { m_head= copy(buf.begin(), buf.end(), m_head); } m_size += buf.size(); LeaveCriticalSection(&m_lock); SetEvent(m_hEvent); return true; }