diff options
author | Martin Braun <martin.braun@kit.edu> | 2013-04-16 22:29:29 +0200 |
---|---|---|
committer | Martin Braun <martin.braun@kit.edu> | 2013-04-16 22:29:29 +0200 |
commit | 066f711a0361c665b06689e8a9e8964617ea533c (patch) | |
tree | 2564e33da928740a8bc394094480cc3a7ecef89a | |
parent | c639fd89346a9485f7cda041f84d3e26a79548bf (diff) |
runtime: changed remove_item_tag to only mark tags as deleted
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block.cc | 6 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block_detail.cc | 14 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block_detail.h | 14 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_block_executor.cc | 8 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_buffer.cc | 15 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_buffer.h | 9 | ||||
-rw-r--r-- | gnuradio-core/src/lib/runtime/gr_tags.h | 3 |
7 files changed, 45 insertions, 24 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_block.cc b/gnuradio-core/src/lib/runtime/gr_block.cc index 674e52084a..bfb23e9c4b 100644 --- a/gnuradio-core/src/lib/runtime/gr_block.cc +++ b/gnuradio-core/src/lib/runtime/gr_block.cc @@ -238,7 +238,7 @@ void gr_block::remove_item_tag(unsigned int which_input, const gr_tag_t &tag) { - d_detail->remove_item_tag(which_input, tag); + d_detail->remove_item_tag(which_input, tag, unique_id()); } void @@ -246,7 +246,7 @@ gr_block::get_tags_in_range(std::vector<gr_tag_t> &v, unsigned int which_output, uint64_t start, uint64_t end) { - d_detail->get_tags_in_range(v, which_output, start, end); + d_detail->get_tags_in_range(v, which_output, start, end, unique_id()); } void @@ -255,7 +255,7 @@ gr_block::get_tags_in_range(std::vector<gr_tag_t> &v, uint64_t start, uint64_t end, const pmt::pmt_t &key) { - d_detail->get_tags_in_range(v, which_output, start, end, key); + d_detail->get_tags_in_range(v, which_output, start, end, key, unique_id()); } gr_block::tag_propagation_policy_t diff --git a/gnuradio-core/src/lib/runtime/gr_block_detail.cc b/gnuradio-core/src/lib/runtime/gr_block_detail.cc index af80e61cff..2277c9e447 100644 --- a/gnuradio-core/src/lib/runtime/gr_block_detail.cc +++ b/gnuradio-core/src/lib/runtime/gr_block_detail.cc @@ -168,14 +168,14 @@ gr_block_detail::add_item_tag(unsigned int which_output, const gr_tag_t &tag) } void -gr_block_detail::remove_item_tag(unsigned int which_input, const gr_tag_t &tag) +gr_block_detail::remove_item_tag(unsigned int which_input, const gr_tag_t &tag, long id) { if(!pmt_is_symbol(tag.key)) { throw pmt_wrong_type("gr_block_detail::add_item_tag key", tag.key); } else { // Add tag to gr_buffer's deque tags - d_input[which_input]->buffer()->remove_item_tag(tag); + d_input[which_input]->buffer()->remove_item_tag(tag, id); } } @@ -183,10 +183,11 @@ void gr_block_detail::get_tags_in_range(std::vector<gr_tag_t> &v, unsigned int which_input, uint64_t abs_start, - uint64_t abs_end) + uint64_t abs_end, + long id) { // get from gr_buffer_reader's deque of tags - d_input[which_input]->get_tags_in_range(v, abs_start, abs_end); + d_input[which_input]->get_tags_in_range(v, abs_start, abs_end, id); } void @@ -194,14 +195,15 @@ gr_block_detail::get_tags_in_range(std::vector<gr_tag_t> &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, - const pmt_t &key) + const pmt_t &key, + long id) { std::vector<gr_tag_t> found_items; v.resize(0); // get from gr_buffer_reader's deque of tags - d_input[which_input]->get_tags_in_range(found_items, abs_start, abs_end); + d_input[which_input]->get_tags_in_range(found_items, abs_start, abs_end, id); // Filter further by key name pmt_t itemkey; diff --git a/gnuradio-core/src/lib/runtime/gr_block_detail.h b/gnuradio-core/src/lib/runtime/gr_block_detail.h index 15d85135ae..cff5ad6729 100644 --- a/gnuradio-core/src/lib/runtime/gr_block_detail.h +++ b/gnuradio-core/src/lib/runtime/gr_block_detail.h @@ -107,12 +107,14 @@ class GR_CORE_API gr_block_detail { /*! * \brief Removes a tag from the given input stream. * - * Calls gr_buffer::remove_item_tag(), which removes the tag from its deque. + * Calls gr_buffer::remove_item_tag(). + * The tag in question will then no longer appear on subsequent calls of get_tags_in_range(). * * \param which_input an integer of which input stream to remove the tag from * \param tag the tag object to add + * \param id The unique block ID (use gr_block::unique_id()) */ - void remove_item_tag(unsigned int which_input, const gr_tag_t &tag); + void remove_item_tag(unsigned int which_input, const gr_tag_t &tag, long id); /*! * \brief Given a [start,end), returns a vector of all tags in the range. @@ -127,11 +129,13 @@ class GR_CORE_API gr_block_detail { * \param which_input an integer of which input stream to pull from * \param abs_start a uint64 count of the start of the range of interest * \param abs_end a uint64 count of the end of the range of interest + * \param id Block ID */ void get_tags_in_range(std::vector<gr_tag_t> &v, unsigned int which_input, uint64_t abs_start, - uint64_t abs_end); + uint64_t abs_end, + long id); /*! * \brief Given a [start,end), returns a vector of all tags in the range @@ -149,12 +153,14 @@ class GR_CORE_API gr_block_detail { * \param abs_start a uint64 count of the start of the range of interest * \param abs_end a uint64 count of the end of the range of interest * \param key a PMT symbol to select only tags of this key + * \param id Block ID */ void get_tags_in_range(std::vector<gr_tag_t> &v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, - const pmt::pmt_t &key); + const pmt::pmt_t &key, + long id); /*! * \brief Set core affinity of block to the cores in the vector mask. diff --git a/gnuradio-core/src/lib/runtime/gr_block_executor.cc b/gnuradio-core/src/lib/runtime/gr_block_executor.cc index e070f3c508..b426b4f8c3 100644 --- a/gnuradio-core/src/lib/runtime/gr_block_executor.cc +++ b/gnuradio-core/src/lib/runtime/gr_block_executor.cc @@ -91,7 +91,7 @@ min_available_space (gr_block_detail *d, int output_multiple, int min_noutput_it static bool propagate_tags(gr_block::tag_propagation_policy_t policy, gr_block_detail *d, const std::vector<uint64_t> &start_nitems_read, double rrate, - std::vector<gr_tag_t> &rtags) + std::vector<gr_tag_t> &rtags, long block_id) { // Move tags downstream // if a sink, we don't need to move downstream @@ -107,7 +107,7 @@ propagate_tags(gr_block::tag_propagation_policy_t policy, gr_block_detail *d, // every tag on every input propogates to everyone downstream for(int i = 0; i < d->ninputs(); i++) { d->get_tags_in_range(rtags, i, start_nitems_read[i], - d->nitems_read(i)); + d->nitems_read(i), block_id); std::vector<gr_tag_t>::iterator t; if(rrate == 1.0) { @@ -133,7 +133,7 @@ propagate_tags(gr_block::tag_propagation_policy_t policy, gr_block_detail *d, if(d->ninputs() == d->noutputs()) { for(int i = 0; i < d->ninputs(); i++) { d->get_tags_in_range(rtags, i, start_nitems_read[i], - d->nitems_read(i)); + d->nitems_read(i), block_id); std::vector<gr_tag_t>::iterator t; for(t = rtags.begin(); t != rtags.end(); t++) { @@ -450,7 +450,7 @@ gr_block_executor::run_one_iteration() if(!propagate_tags(m->tag_propagation_policy(), d, d_start_nitems_read, m->relative_rate(), - d_returned_tags)) + d_returned_tags, m->unique_id())) goto were_done; if (n == gr_block::WORK_DONE) diff --git a/gnuradio-core/src/lib/runtime/gr_buffer.cc b/gnuradio-core/src/lib/runtime/gr_buffer.cc index 369959d65f..1764b0a8e9 100644 --- a/gnuradio-core/src/lib/runtime/gr_buffer.cc +++ b/gnuradio-core/src/lib/runtime/gr_buffer.cc @@ -234,13 +234,12 @@ gr_buffer::add_item_tag(const gr_tag_t &tag) } void -gr_buffer::remove_item_tag(const gr_tag_t &tag) +gr_buffer::remove_item_tag(const gr_tag_t &tag, long id) { gruel::scoped_lock guard(*mutex()); for (std::deque<gr_tag_t>::iterator it = d_item_tags.begin(); it != d_item_tags.end(); ++it) { if (*it == tag) { - d_item_tags.erase(it); - break; + (*it).marked_deleted.push_back(id); } } } @@ -321,7 +320,8 @@ gr_buffer_reader::update_read_pointer (int nitems) void gr_buffer_reader::get_tags_in_range(std::vector<gr_tag_t> &v, uint64_t abs_start, - uint64_t abs_end) + uint64_t abs_end, + long id) { gruel::scoped_lock guard(*mutex()); @@ -333,7 +333,12 @@ gr_buffer_reader::get_tags_in_range(std::vector<gr_tag_t> &v, item_time = (*itr).offset; if((item_time >= abs_start) && (item_time < abs_end)) { - v.push_back(*itr); + std::vector<long>::iterator id_itr; + id_itr = std::find(itr->marked_deleted.begin(), itr->marked_deleted.end(), id); + if (id_itr == itr->marked_deleted.end()) { // If id is not in the vector of marked blocks + v.push_back(*itr); + v.back().marked_deleted.clear(); + } } itr++; diff --git a/gnuradio-core/src/lib/runtime/gr_buffer.h b/gnuradio-core/src/lib/runtime/gr_buffer.h index 28ea977269..443ffb3906 100644 --- a/gnuradio-core/src/lib/runtime/gr_buffer.h +++ b/gnuradio-core/src/lib/runtime/gr_buffer.h @@ -106,10 +106,14 @@ class GR_CORE_API gr_buffer { * \brief Removes an existing tag from the buffer. * * If no such tag is found, does nothing. + * Note: Doesn't actually physically delete the tag, but + * marks it as deleted. For the user, this has the same effect: + * Any subsequent calls to get_tags_in_range() will not return + * the tag. * * \param tag the tag that needs to be removed */ - void remove_item_tag(const gr_tag_t &tag); + void remove_item_tag(const gr_tag_t &tag, long id); /*! * \brief Removes all tags before \p max_time from buffer @@ -282,7 +286,8 @@ class GR_CORE_API gr_buffer_reader { */ void get_tags_in_range(std::vector<gr_tag_t> &v, uint64_t abs_start, - uint64_t abs_end); + uint64_t abs_end, + long id); // ------------------------------------------------------------------------- diff --git a/gnuradio-core/src/lib/runtime/gr_tags.h b/gnuradio-core/src/lib/runtime/gr_tags.h index a9ca902352..ea60f89928 100644 --- a/gnuradio-core/src/lib/runtime/gr_tags.h +++ b/gnuradio-core/src/lib/runtime/gr_tags.h @@ -39,6 +39,9 @@ struct GR_CORE_API gr_tag_t{ //! the source ID of \p tag (as a PMT) pmt::pmt_t srcid; + //! Used by gr_buffer to mark a tagged as deleted by a specific block. You can usually ignore this. + std::vector<long> marked_deleted; + //! Comparison function to test which tag, \p x or \p y, came first in time static inline bool offset_compare( const gr_tag_t &x, const gr_tag_t &y |