/ src / include / piomatter / buffer_manager.h
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