otsdaq-mu2e-stm  5.02.01
queue.hh
1 #ifndef queue_h_
2 #define queue_h_
3 
4 #include <iostream>
5 #include <cstring>
6 #include <thread>
7 #include <atomic>
8 #include <cinttypes>
9 
10 // Ring buffer size
11 static const int CHNUM = 2;
12 static const int packet_size = 8198;
13 static const int packet_len = packet_size/2;
14 
15 class queue_buffer{
16 
17 public :
18 
19  // Constructor
20  queue_buffer();
21 
22  // The header for each packet in the buffer
23  struct packet_header{
24  int16_t header[packet_len] = {};
25  };
26 
27  // Try to push data to queue
28  int try_push(int chan, uint64_t** sizes, int16_t *data, int n, int index);
29 
30  // Push data to queue
31  void push(int chan, uint64_t** sizes, int16_t *data, int n);
32 
33  // Try to pull data from queue
34  int try_pull(int chan, uint64_t*& sizes, int16_t *&data);
35 
36  // Pull data from queue
37  int pull(bool *timeout, int chan, uint64_t*& sizes, int16_t *&data);
38 
39  // Make int32_t from two int16_ts
40  int32_t make_int32_t(int16_t p0, int16_t p1){
41  return (p1 & 0xFFFF) << 16 | p0 & 0xFFFF;
42 
43  }
44 
45  // Atomic occupancy counters
46  std::atomic<uint32_t> occupancy_size[CHNUM];
47  std::atomic<uint32_t> occupancy_data[CHNUM];
48 
49  // Push tail pointers
50  struct tail {
51  // Size buffer pointer (int32_t)
52  int16_t size_0; // Lower 16 bits
53  int16_t size_1; // Upper 16 bits
54  // Data buffer pointer (int32_t)
55  int16_t data_0; // Lower 16 bits
56  int16_t data_1; // Upper 16 bits
57  };
58 
59  // Pull head pointers
60  struct head {
61  // Size buffer pointer (int32_t)
62  int16_t size_0; // Lower 16 bits
63  int16_t size_1; // Upper 16 bits
64  // Data buffer pointer (int32_t)
65  int16_t data_0; // Lower 16 bits
66  int16_t data_1; // Upper 16 bits
67  };
68 
69  // Atomic push tail pointer
70  std::atomic<tail> tail_[CHNUM];
71  // Atomic pull head pointer
72  std::atomic<head> head_[CHNUM];
73 
74  // Current tail pointers
75  tail current_tail[CHNUM];
76  int32_t current_tail_size[CHNUM];
77  int32_t current_tail_data[CHNUM];
78  // Current head pointers
79  head current_head[CHNUM];
80  int32_t current_head_size[CHNUM];
81  int32_t current_head_data[CHNUM];
82 
83  // Number written to the buffer
84  int32_t write_num_size[CHNUM]; // in push
85  int32_t write_num_data[CHNUM]; // in push
86  int32_t read_num_size[CHNUM]; // in push
87  int32_t read_num_data[CHNUM]; // in push
88 
89  // Size buffer indeces
90  static const uint SIZE_INDEX = 0; // Individual datagram size
91  static const uint ACC_SIZE_INDEX = 1; // Accumulated datagram size
92 
93  // Maximum size of an int32_t
94  static const int32_t INT32_T_MAX = 2147483647;
95 
96  // The max number of datagrams in a buffer
97  static const uint64_t RING_BUFFER_NUM = 65536;
98 
99  // The buffer length
100  static const uint32_t RING_BUFFER_LEN = RING_BUFFER_NUM*packet_len;
101 
102  // The buffer
103  // data_pointer* pointer_buffer[CHNUM];
104  uint64_t* size_buffer[CHNUM];
105  packet_header* header_buffer[CHNUM];
106  int16_t* data_buffer[CHNUM];
107 
108  // Increment function
109  int64_t increment(int n, int x, uint32_t buffer_size){
110  return (n + x) % buffer_size;
111  }
112 
113 private :
114 
115 
116 };
117 
118 #endif
119 
Definition: data.hh:4