/** * Read up to n bytes into the memory location data and shrink the IOQueue by * the amount read. */ unsigned int IOQueue::Read(uint8_t *data, unsigned int n) { unsigned int bytes_read = 0; BlockVector::iterator iter = m_blocks.begin(); while (iter != m_blocks.end() && bytes_read != n) { MemoryBlock *block = *iter; unsigned int bytes_copied = block->Copy(data + bytes_read, n - bytes_read); block->PopFront(bytes_copied); bytes_read += bytes_copied; if (block->Empty()) { m_pool->Release(block); iter = m_blocks.erase(iter); } else { iter++; } } return bytes_read; }