Skip to content

Commit

Permalink
bughunt: Some tags go missing
Browse files Browse the repository at this point in the history
  • Loading branch information
jdemel committed Jul 7, 2020
1 parent d4d0784 commit 53aedab
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 18 deletions.
10 changes: 7 additions & 3 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
{
"terminal.integrated.env.linux": {
"PYBOMBS_PREFIX": "${env:HOME}/prefix/pybind",
"PATH": "${env:PYBOMBS_PREFIX}/bin:${env:PATH}",
"PYBOMBS_PREFIX": "${env:HOME}/prefix/gnuradio",
"PATH": "${env:HOME}/prefix/gnuradio/bin:${env:PATH}",
"PYTHONPATH": "${env:HOME}/prefix/gnuradio/lib/python3.8/site-packages:${env:HOME}/prefix/gnuradio/lib/python3/dist-packages:${env:PYTHONPATH}",
"LD_LIBRARY_PATH": "${env:HOME}/prefix/gnuradio/lib:${env:LD_LIBRARY_PATH}",
"LIBRARY_PATH": "${env:HOME}/prefix/gnuradio/lib:${env:LIBRARY_PATH}",
"PKG_CONFIG_PATH": "${env:HOME}/prefix/gnuradio/lib/pkgconfig:${env:PKG_CONFIG_PATH}",
},
"telemetry.enableTelemetry": false,
"terminal.integrated.shell.linux": "zsh",
// "terminal.integrated.fontFamily": "Meslo LG M DZ for Powerline",

"cmake.installPrefix": "${userHome}/prefix/gnuradio",
"cmake.environment": {
Expand Down Expand Up @@ -85,7 +86,10 @@
"cfenv": "cpp",
"cinttypes": "cpp",
"typeindex": "cpp",
"variant": "cpp"
"variant": "cpp",
"forward_list": "cpp",
"unordered_set": "cpp",
"valarray": "cpp"
},
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
"python.formatting.provider": "black"
Expand Down
78 changes: 63 additions & 15 deletions lib/sync_tag_align_cc_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ sync_tag_align_cc_impl::sync_tag_align_cc_impl(const unsigned num_inputs,
gr::io_signature::make(num_inputs, num_inputs, sizeof(gr_complex))),
d_num_ports(num_inputs),
d_tag_key(tag_key),
d_key(pmt::mp(tag_key))
d_key(pmt::mp(tag_key)),
d_port_tag_counters(num_inputs, 0),
d_inport_tag_counters(num_inputs, 0),
d_added_port_tag_counters(num_inputs, 0)
{
set_tag_propagation_policy(TPP_ONE_TO_ONE);
}
Expand All @@ -48,40 +51,67 @@ int sync_tag_align_cc_impl::work(int noutput_items,
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items)
{
// GR_LOG_DEBUG(this->d_logger, "ENTER " + std::to_string(noutput_items));
// GR_LOG_DEBUG(this->d_logger, "\n\nENTER " + std::to_string(nitems_read(0)));
for (unsigned i = 0; i < d_num_ports; ++i) {
const gr_complex* in = (const gr_complex*)input_items[i];
gr_complex* out = (gr_complex*)output_items[i];
std::memcpy(out, in, sizeof(gr_complex) * noutput_items);
}

std::vector<std::vector<gr::tag_t>> stream_input_tags;
std::vector<std::vector<gr::tag_t>> stream_input_tags(d_num_ports);
bool done = true;
bool found_tags = false;
size_t num_tags = 0;
for (unsigned i = 0; i < d_num_ports; ++i) {
std::vector<gr::tag_t> tags;
get_tags_in_range(tags, i, nitems_read(i), nitems_read(i) + noutput_items, d_key);
if (tags.size() > 0) {
// GR_LOG_DEBUG(d_logger,
// "Found tags: @" + std::to_string(nitems_read(i)) +
// " in stream: " + std::to_string(i));
get_tags_in_range(stream_input_tags[i],
i,
nitems_read(i),
nitems_read(i) + noutput_items,
d_key);
if (stream_input_tags[i].size() > 0) {
GR_LOG_DEBUG(d_logger,
"Found " + std::to_string(stream_input_tags[i].size()) +
" tags: @" + std::to_string(nitems_read(i)) +
" in stream: " + std::to_string(i));
done = false;
std::sort(tags.begin(), tags.begin(), tag_t::offset_compare);
found_tags = true;
std::sort(stream_input_tags[i].begin(),
stream_input_tags[i].begin(),
tag_t::offset_compare);
d_inport_tag_counters[i] += stream_input_tags[i].size();
num_tags = stream_input_tags[i].size();
}
// stream_input_tags.push_back(tags);
}

for (unsigned i = 0; i < d_num_ports; ++i) {
if (stream_input_tags[i].size() != num_tags) {
GR_LOG_DEBUG(d_logger, "\n\nCareful! There's a tag mismatch!\n\n");
}
stream_input_tags.push_back(tags);
}

std::vector<unsigned> positions(d_num_ports, 0);

while (!done) {
uint64_t offset = std::numeric_limits<uint64_t>::max();
gr::tag_t share_tag;
// gr::tag_t share_tag;
unsigned share_tag_stream = 0;
unsigned share_tag_pos = 0;

for (unsigned i = 0; i < d_num_ports; ++i) {
const uint64_t t_offset = stream_input_tags[i].size() > positions[i]
? stream_input_tags[i][positions[i]].offset
: std::numeric_limits<uint64_t>::max();
GR_LOG_DEBUG(d_logger,
"Search stream=" + std::to_string(i) +
"\t#tags=" + std::to_string(stream_input_tags[i].size()) +
"\twith offset=" + std::to_string(t_offset) +
"\tMINoffset=" + std::to_string(offset));
if (offset > t_offset) {
share_tag = stream_input_tags[i][positions[i]];
share_tag_stream = i;
share_tag_pos = positions[i];
// share_tag = stream_input_tags[i][positions[i]];
offset = t_offset;
}
}
Expand All @@ -93,25 +123,43 @@ int sync_tag_align_cc_impl::work(int noutput_items,
const uint64_t t_offset = stream_input_tags[i].size() > positions[i]
? stream_input_tags[i][positions[i]].offset
: std::numeric_limits<uint64_t>::max();
if (t_offset > offset + 1000) {
if (t_offset > offset + d_max_tag_offset_difference) {
auto& share_tag = stream_input_tags[share_tag_stream][share_tag_pos];
GR_LOG_DEBUG(d_logger,
"Add tag with offset=" + std::to_string(share_tag.offset) +
" co=" + std::to_string(offset) +
" co=" + std::to_string(t_offset) +
" in stream: " + std::to_string(i));
add_item_tag(i, share_tag);
d_added_port_tag_counters[i] += 1;
} else {
positions.at(i) += 1;
GR_LOG_DEBUG(d_logger,
"Haz tag with offset=" + std::to_string(offset) +
" co=" + std::to_string(t_offset) +
" in stream: " + std::to_string(i));
}
}

done = true;
for (unsigned i = 0; i < d_num_ports; ++i) {
if (positions.at(i) < stream_input_tags.at(i).size()) {
if (positions[i] < stream_input_tags[i].size()) {
done = false;
}
}
}

// if (found_tags) {
// for (size_t i = 0; i < d_num_ports; ++i) {
// GR_LOG_DEBUG(d_logger,
// std::to_string(i) + "\tintags: " +
// std::to_string(d_inport_tag_counters[i]) + "\taddtags: " +
// std::to_string(d_added_port_tag_counters[i]) + "\ttags:" +
// std::to_string(d_inport_tag_counters[i] +
// d_added_port_tag_counters[i]));
// }
// }

// GR_LOG_DEBUG(this->d_logger, "EXIT " + std::to_string(nitems_read(0)) + "\n\n");
// Tell runtime system how many output items we produced.
return noutput_items;
}
Expand Down
5 changes: 5 additions & 0 deletions lib/sync_tag_align_cc_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ class sync_tag_align_cc_impl : public sync_tag_align_cc
const unsigned d_num_ports;
const std::string d_tag_key;
const pmt::pmt_t d_key;
const uint64_t d_max_tag_offset_difference = 3;

std::vector<uint64_t> d_port_tag_counters;
std::vector<uint64_t> d_inport_tag_counters;
std::vector<uint64_t> d_added_port_tag_counters;

public:
sync_tag_align_cc_impl(const unsigned num_inputs, const std::string& tag_key);
Expand Down

0 comments on commit 53aedab

Please sign in to comment.