00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef INCLUDED_GR_BUFFER_H
00024 #define INCLUDED_GR_BUFFER_H
00025
00026 #include <gr_runtime_types.h>
00027 #include <boost/weak_ptr.hpp>
00028 #include <gruel/thread.h>
00029
00030 class gr_vmcircbuf;
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 gr_buffer_sptr gr_make_buffer (int nitems, size_t sizeof_item, gr_block_sptr link=gr_block_sptr());
00044
00045
00046
00047
00048
00049
00050 class gr_buffer {
00051 public:
00052
00053 virtual ~gr_buffer ();
00054
00055
00056
00057
00058 int space_available ();
00059
00060
00061
00062
00063 int bufsize() const { return d_bufsize; }
00064
00065
00066
00067
00068
00069
00070
00071 void *write_pointer ();
00072
00073
00074
00075
00076 void update_write_pointer (int nitems);
00077
00078 void set_done (bool done);
00079 bool done () const { return d_done; }
00080
00081
00082
00083
00084 gr_block_sptr link() { return gr_block_sptr(d_link); }
00085
00086 size_t nreaders() const { return d_readers.size(); }
00087 gr_buffer_reader* reader(size_t index) { return d_readers[index]; }
00088
00089 gruel::mutex *mutex() { return &d_mutex; }
00090
00091
00092
00093 private:
00094
00095 friend class gr_buffer_reader;
00096 friend gr_buffer_sptr gr_make_buffer (int nitems, size_t sizeof_item, gr_block_sptr link);
00097 friend gr_buffer_reader_sptr gr_buffer_add_reader (gr_buffer_sptr buf, int nzero_preload, gr_block_sptr link);
00098
00099 protected:
00100 char *d_base;
00101 unsigned int d_bufsize;
00102 private:
00103 gr_vmcircbuf *d_vmcircbuf;
00104 size_t d_sizeof_item;
00105 std::vector<gr_buffer_reader *> d_readers;
00106 boost::weak_ptr<gr_block> d_link;
00107
00108
00109
00110
00111 gruel::mutex d_mutex;
00112 unsigned int d_write_index;
00113 bool d_done;
00114
00115 unsigned
00116 index_add (unsigned a, unsigned b)
00117 {
00118 unsigned s = a + b;
00119
00120 if (s >= d_bufsize)
00121 s -= d_bufsize;
00122
00123 assert (s < d_bufsize);
00124 return s;
00125 }
00126
00127 unsigned
00128 index_sub (unsigned a, unsigned b)
00129 {
00130 int s = a - b;
00131
00132 if (s < 0)
00133 s += d_bufsize;
00134
00135 assert ((unsigned) s < d_bufsize);
00136 return s;
00137 }
00138
00139 virtual bool allocate_buffer (int nitems, size_t sizeof_item);
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 gr_buffer (int nitems, size_t sizeof_item, gr_block_sptr link);
00155
00156
00157
00158
00159 void drop_reader (gr_buffer_reader *reader);
00160
00161 };
00162
00163
00164
00165
00166
00167
00168
00169 gr_buffer_reader_sptr
00170 gr_buffer_add_reader (gr_buffer_sptr buf, int nzero_preload, gr_block_sptr link=gr_block_sptr());
00171
00172
00173 long gr_buffer_ncurrently_allocated ();
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 class gr_buffer_reader {
00184 public:
00185
00186 ~gr_buffer_reader ();
00187
00188
00189
00190
00191 int items_available () const;
00192
00193
00194
00195
00196 gr_buffer_sptr buffer () const { return d_buffer; }
00197
00198
00199
00200
00201
00202
00203 int max_possible_items_available () const { return d_buffer->d_bufsize - 1; }
00204
00205
00206
00207
00208
00209
00210 const void *read_pointer ();
00211
00212
00213
00214
00215 void update_read_pointer (int nitems);
00216
00217 void set_done (bool done) { d_buffer->set_done (done); }
00218 bool done () const { return d_buffer->done (); }
00219
00220 gruel::mutex *mutex() { return d_buffer->mutex(); }
00221
00222
00223
00224
00225
00226 gr_block_sptr link() { return gr_block_sptr(d_link); }
00227
00228
00229
00230 private:
00231
00232 friend class gr_buffer;
00233 friend gr_buffer_reader_sptr
00234 gr_buffer_add_reader (gr_buffer_sptr buf, int nzero_preload, gr_block_sptr link);
00235
00236
00237 gr_buffer_sptr d_buffer;
00238 unsigned int d_read_index;
00239 boost::weak_ptr<gr_block> d_link;
00240
00241
00242 gr_buffer_reader (gr_buffer_sptr buffer, unsigned int read_index, gr_block_sptr link);
00243 };
00244
00245
00246 long gr_buffer_reader_ncurrently_allocated ();
00247
00248
00249 #endif