buffer_manager.h
1 #pragma once 2 #include "thread_queue.h" 3 4 namespace piomatter { 5 6 struct buffer_manager { 7 enum { no_buffer = -1, exit_request = -2 }; 8 9 buffer_manager() { 10 free_buffers.push(0); 11 free_buffers.push(1); 12 free_buffers.push(2); 13 } 14 15 int get_free_buffer() { return free_buffers.pop_blocking(); } 16 void put_free_buffer(int i) { free_buffers.push(i); } 17 18 int get_filled_buffer() { 19 auto r = filled_buffers.pop_nonblocking(); 20 return r ? r.value() : no_buffer; 21 } 22 23 void put_filled_buffer(int i) { filled_buffers.push(i); } 24 25 void request_exit() { filled_buffers.push(exit_request); } 26 27 private: 28 thread_queue<int> free_buffers, filled_buffers; 29 }; 30 31 } // namespace piomatter