Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef INCLUDED_RING_H
00022 #define INCLUDED_RING_H
00023
00024 #include <gnuradio/omnithread.h>
00025 #include <stddef.h>
00026 #include <vector>
00027 #include <boost/shared_ptr.hpp>
00028
00029 namespace usrp2 {
00030
00031 class ring;
00032 typedef boost::shared_ptr<ring> ring_sptr;
00033
00034 class ring
00035 {
00036 private:
00037
00038 size_t d_max;
00039 size_t d_read_ind;
00040 size_t d_write_ind;
00041
00042 struct ring_desc
00043 {
00044 void *d_base;
00045 size_t d_len;
00046 };
00047 std::vector<ring_desc> d_ring;
00048
00049 omni_mutex d_mutex;
00050 omni_condition d_not_empty;
00051
00052 void inc_read_ind()
00053 {
00054 if (d_read_ind + 1 >= d_max)
00055 d_read_ind = 0;
00056 else
00057 d_read_ind = d_read_ind + 1;
00058 }
00059
00060 void inc_write_ind()
00061 {
00062 if (d_write_ind + 1 >= d_max)
00063 d_write_ind = 0;
00064 else
00065 d_write_ind = d_write_ind + 1;
00066 }
00067
00068 bool empty() const { return d_read_ind == d_write_ind; }
00069 bool full() const { return (d_write_ind+1)%d_max == d_read_ind; }
00070
00071 public:
00072
00073 ring(unsigned int entries);
00074
00075 void wait_for_not_empty();
00076
00077 bool enqueue(void *p, size_t len);
00078 bool dequeue(void **p, size_t *len);
00079 };
00080
00081 }
00082
00083 #endif