mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 03:42:44 +00:00 
			
		
		
		
	 beda478821
			
		
	
	
		beda478821
		
	
	
	
	
		
			
			Dealing with the unsigned overflow propagation here just seems unreasonably error prone. Let's limit ourselves to 2GB buffer sizes instead.
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <Kernel/DoubleBuffer.h>
 | |
| 
 | |
| inline void DoubleBuffer::compute_emptiness()
 | |
| {
 | |
|     m_empty = m_read_buffer_index >= m_read_buffer->size() && m_write_buffer->is_empty();
 | |
| }
 | |
| 
 | |
| void DoubleBuffer::flip()
 | |
| {
 | |
|     ASSERT(m_read_buffer_index == m_read_buffer->size());
 | |
|     swap(m_read_buffer, m_write_buffer);
 | |
|     if (m_write_buffer->capacity() < 32)
 | |
|         m_write_buffer->clear_with_capacity();
 | |
|     else
 | |
|         m_write_buffer->clear();
 | |
|     m_read_buffer_index = 0;
 | |
|     compute_emptiness();
 | |
| }
 | |
| 
 | |
| ssize_t DoubleBuffer::write(const byte* data, ssize_t size)
 | |
| {
 | |
|     LOCKER(m_lock);
 | |
|     m_write_buffer->append(data, size);
 | |
|     compute_emptiness();
 | |
|     return size;
 | |
| }
 | |
| 
 | |
| ssize_t DoubleBuffer::read(byte* data, ssize_t size)
 | |
| {
 | |
|     LOCKER(m_lock);
 | |
|     if (m_read_buffer_index >= m_read_buffer->size() && !m_write_buffer->is_empty())
 | |
|         flip();
 | |
|     if (m_read_buffer_index >= m_read_buffer->size())
 | |
|         return 0;
 | |
|     ssize_t nread = min((ssize_t)m_read_buffer->size() - m_read_buffer_index, size);
 | |
|     memcpy(data, m_read_buffer->data() + m_read_buffer_index, nread);
 | |
|     m_read_buffer_index += nread;
 | |
|     compute_emptiness();
 | |
|     return nread;
 | |
| }
 |