summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@kit.edu>2013-04-16 22:29:29 +0200
committerMartin Braun <martin.braun@kit.edu>2013-04-16 22:29:29 +0200
commit066f711a0361c665b06689e8a9e8964617ea533c (patch)
tree2564e33da928740a8bc394094480cc3a7ecef89a
parentc639fd89346a9485f7cda041f84d3e26a79548bf (diff)
runtime: changed remove_item_tag to only mark tags as deleted
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block.cc6
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block_detail.cc14
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block_detail.h14
-rw-r--r--gnuradio-core/src/lib/runtime/gr_block_executor.cc8
-rw-r--r--gnuradio-core/src/lib/runtime/gr_buffer.cc15
-rw-r--r--gnuradio-core/src/lib/runtime/gr_buffer.h9
-rw-r--r--gnuradio-core/src/lib/runtime/gr_tags.h3
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