diff options
Diffstat (limited to 'gnuradio-runtime/lib/flat_flowgraph.cc')
-rw-r--r-- | gnuradio-runtime/lib/flat_flowgraph.cc | 642 |
1 files changed, 323 insertions, 319 deletions
diff --git a/gnuradio-runtime/lib/flat_flowgraph.cc b/gnuradio-runtime/lib/flat_flowgraph.cc index c83ab20769..b798e4812e 100644 --- a/gnuradio-runtime/lib/flat_flowgraph.cc +++ b/gnuradio-runtime/lib/flat_flowgraph.cc @@ -37,93 +37,93 @@ namespace gr { // 32Kbyte buffer size between blocks -#define GR_FIXED_BUFFER_SIZE (32*(1L<<10)) +#define GR_FIXED_BUFFER_SIZE (32 * (1L << 10)) - static const unsigned int s_fixed_buffer_size = GR_FIXED_BUFFER_SIZE; +static const unsigned int s_fixed_buffer_size = GR_FIXED_BUFFER_SIZE; - flat_flowgraph_sptr - make_flat_flowgraph() - { +flat_flowgraph_sptr make_flat_flowgraph() +{ return flat_flowgraph_sptr(new flat_flowgraph()); - } +} - flat_flowgraph::flat_flowgraph() - { +flat_flowgraph::flat_flowgraph() +{ configure_default_loggers(d_logger, d_debug_logger, "flat_flowgraph"); - } +} - flat_flowgraph::~flat_flowgraph() - { - } +flat_flowgraph::~flat_flowgraph() {} - void - flat_flowgraph::setup_connections() - { +void flat_flowgraph::setup_connections() +{ basic_block_vector_t blocks = calc_used_blocks(); // Assign block details to blocks - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) - cast_to_block_sptr(*p)->set_detail(allocate_block_detail(*p)); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) + cast_to_block_sptr(*p)->set_detail(allocate_block_detail(*p)); // Connect inputs to outputs for each block - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - connect_block_inputs(*p); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + connect_block_inputs(*p); - block_sptr block = cast_to_block_sptr(*p); - block->set_unaligned(0); - block->set_is_unaligned(false); + block_sptr block = cast_to_block_sptr(*p); + block->set_unaligned(0); + block->set_is_unaligned(false); } // Connect message ports connetions - for(msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { - GR_LOG_DEBUG(d_debug_logger, - boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % - i->src().block() % i->src().port() % - i->dst().block() % i->dst().port() - ); - i->src().block()->message_port_sub(i->src().port(), pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); + for (msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % + i->src().block() % i->src().port() % i->dst().block() % i->dst().port()); + i->src().block()->message_port_sub( + i->src().port(), pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); } - } +} - block_detail_sptr - flat_flowgraph::allocate_block_detail(basic_block_sptr block) - { +block_detail_sptr flat_flowgraph::allocate_block_detail(basic_block_sptr block) +{ int ninputs = calc_used_ports(block, true).size(); int noutputs = calc_used_ports(block, false).size(); block_detail_sptr detail = make_block_detail(ninputs, noutputs); block_sptr grblock = cast_to_block_sptr(block); - if(!grblock) - throw std::runtime_error( - (boost::format("allocate_block_detail found non-gr::block (%s)")% - block->alias()).str()); + if (!grblock) + throw std::runtime_error( + (boost::format("allocate_block_detail found non-gr::block (%s)") % + block->alias()) + .str()); GR_LOG_DEBUG(d_debug_logger, "Creating block detail for " + block->identifier()); - for(int i = 0; i < noutputs; i++) { - grblock->expand_minmax_buffer(i); - - buffer_sptr buffer = allocate_buffer(block, i); - GR_LOG_DEBUG(d_debug_logger, "Allocated buffer for output " + block->identifier() + " " + std::to_string(i)); - detail->set_output(i, buffer); + for (int i = 0; i < noutputs; i++) { + grblock->expand_minmax_buffer(i); - // Update the block's max_output_buffer based on what was actually allocated. - if((grblock->max_output_buffer(i) != buffer->bufsize()) && (grblock->max_output_buffer(i) != -1)) - GR_LOG_WARN(d_logger, boost::format("Block (%1%) max output buffer set to %2%" - " instead of requested %3%") \ - % grblock->alias() % buffer->bufsize() % grblock->max_output_buffer(i)); - grblock->set_max_output_buffer(i, buffer->bufsize()); + buffer_sptr buffer = allocate_buffer(block, i); + GR_LOG_DEBUG(d_debug_logger, + "Allocated buffer for output " + block->identifier() + " " + + std::to_string(i)); + detail->set_output(i, buffer); + + // Update the block's max_output_buffer based on what was actually allocated. + if ((grblock->max_output_buffer(i) != buffer->bufsize()) && + (grblock->max_output_buffer(i) != -1)) + GR_LOG_WARN(d_logger, + boost::format("Block (%1%) max output buffer set to %2%" + " instead of requested %3%") % + grblock->alias() % buffer->bufsize() % + grblock->max_output_buffer(i)); + grblock->set_max_output_buffer(i, buffer->bufsize()); } return detail; - } +} - buffer_sptr - flat_flowgraph::allocate_buffer(basic_block_sptr block, int port) - { +buffer_sptr flat_flowgraph::allocate_buffer(basic_block_sptr block, int port) +{ block_sptr grblock = cast_to_block_sptr(block); - if(!grblock) - throw std::runtime_error("allocate_buffer found non-gr::block"); + if (!grblock) + throw std::runtime_error("allocate_buffer found non-gr::block"); int item_size = block->output_signature()->sizeof_stream_item(port); // *2 because we're now only filling them 1/2 way in order to @@ -132,112 +132,120 @@ namespace gr { int nitems = s_fixed_buffer_size * 2 / item_size; // Make sure there are at least twice the output_multiple no. of items - if(nitems < 2*grblock->output_multiple()) // Note: this means output_multiple() - nitems = 2*grblock->output_multiple(); // can't be changed by block dynamically + if (nitems < 2 * grblock->output_multiple()) // Note: this means output_multiple() + nitems = 2 * grblock->output_multiple(); // can't be changed by block dynamically // If any downstream blocks are decimators and/or have a large output_multiple, // ensure we have a buffer at least twice their decimation factor*output_multiple basic_block_vector_t blocks = calc_downstream_blocks(block, port); // limit buffer size if indicated - if(grblock->max_output_buffer(port) > 0) { - //std::cout << "constraining output items to " << block->max_output_buffer(port) << "\n"; - nitems = std::min((long)nitems, (long)grblock->max_output_buffer(port)); - nitems -= nitems%grblock->output_multiple(); - if(nitems < 1) - throw std::runtime_error("problems allocating a buffer with the given max output buffer constraint!"); - } - else if(grblock->min_output_buffer(port) > 0) { - nitems = std::max((long)nitems, (long)grblock->min_output_buffer(port)); - nitems -= nitems%grblock->output_multiple(); - if(nitems < 1) - throw std::runtime_error("problems allocating a buffer with the given min output buffer constraint!"); + if (grblock->max_output_buffer(port) > 0) { + // std::cout << "constraining output items to " << block->max_output_buffer(port) + // << "\n"; + nitems = std::min((long)nitems, (long)grblock->max_output_buffer(port)); + nitems -= nitems % grblock->output_multiple(); + if (nitems < 1) + throw std::runtime_error("problems allocating a buffer with the given max " + "output buffer constraint!"); + } else if (grblock->min_output_buffer(port) > 0) { + nitems = std::max((long)nitems, (long)grblock->min_output_buffer(port)); + nitems -= nitems % grblock->output_multiple(); + if (nitems < 1) + throw std::runtime_error("problems allocating a buffer with the given min " + "output buffer constraint!"); } - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - block_sptr dgrblock = cast_to_block_sptr(*p); - if(!dgrblock) - throw std::runtime_error("allocate_buffer found non-gr::block"); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + block_sptr dgrblock = cast_to_block_sptr(*p); + if (!dgrblock) + throw std::runtime_error("allocate_buffer found non-gr::block"); - double decimation = (1.0/dgrblock->relative_rate()); - int multiple = dgrblock->output_multiple(); - int history = dgrblock->history(); - nitems = std::max(nitems, static_cast<int>(2*(decimation*multiple+history))); + double decimation = (1.0 / dgrblock->relative_rate()); + int multiple = dgrblock->output_multiple(); + int history = dgrblock->history(); + nitems = + std::max(nitems, static_cast<int>(2 * (decimation * multiple + history))); } - // std::cout << "make_buffer(" << nitems << ", " << item_size << ", " << grblock << "\n"; + // std::cout << "make_buffer(" << nitems << ", " << item_size << ", " << grblock << + // "\n"; // We're going to let this fail once and retry. If that fails, // throw and exit. buffer_sptr b; try { - b = make_buffer(nitems, item_size, grblock); - } - catch(std::bad_alloc&) { - b = make_buffer(nitems, item_size, grblock); + b = make_buffer(nitems, item_size, grblock); + } catch (std::bad_alloc&) { + b = make_buffer(nitems, item_size, grblock); } // Set the max noutput items size here to make sure it's always // set in the block and available in the start() method. // But don't overwrite if the user has set this externally. - if(!grblock->is_set_max_noutput_items()) - grblock->set_max_noutput_items(nitems); + if (!grblock->is_set_max_noutput_items()) + grblock->set_max_noutput_items(nitems); return b; - } +} - void - flat_flowgraph::connect_block_inputs(basic_block_sptr block) - { +void flat_flowgraph::connect_block_inputs(basic_block_sptr block) +{ block_sptr grblock = cast_to_block_sptr(block); if (!grblock) - throw std::runtime_error("connect_block_inputs found non-gr::block"); + throw std::runtime_error("connect_block_inputs found non-gr::block"); // Get its detail and edges that feed into it block_detail_sptr detail = grblock->detail(); edge_vector_t in_edges = calc_upstream_edges(block); // For each edge that feeds into it - for(edge_viter_t e = in_edges.begin(); e != in_edges.end(); e++) { - // Set the buffer reader on the destination port to the output - // buffer on the source port - int dst_port = e->dst().port(); - int src_port = e->src().port(); - basic_block_sptr src_block = e->src().block(); - block_sptr src_grblock = cast_to_block_sptr(src_block); - if(!src_grblock) - throw std::runtime_error("connect_block_inputs found non-gr::block"); - buffer_sptr src_buffer = src_grblock->detail()->output(src_port); - + for (edge_viter_t e = in_edges.begin(); e != in_edges.end(); e++) { + // Set the buffer reader on the destination port to the output + // buffer on the source port + int dst_port = e->dst().port(); + int src_port = e->src().port(); + basic_block_sptr src_block = e->src().block(); + block_sptr src_grblock = cast_to_block_sptr(src_block); + if (!src_grblock) + throw std::runtime_error("connect_block_inputs found non-gr::block"); + buffer_sptr src_buffer = src_grblock->detail()->output(src_port); - GR_LOG_DEBUG(d_debug_logger, "Setting input " + std::to_string(dst_port) + " from edge " + (*e).identifier()); - detail->set_input(dst_port, buffer_add_reader(src_buffer, grblock->history()-1, grblock, - grblock->sample_delay(src_port))); + GR_LOG_DEBUG(d_debug_logger, + "Setting input " + std::to_string(dst_port) + " from edge " + + (*e).identifier()); + + detail->set_input(dst_port, + buffer_add_reader(src_buffer, + grblock->history() - 1, + grblock, + grblock->sample_delay(src_port))); } - } +} - void - flat_flowgraph::merge_connections(flat_flowgraph_sptr old_ffg) - { +void flat_flowgraph::merge_connections(flat_flowgraph_sptr old_ffg) +{ // Allocate block details if needed. Only new blocks that aren't pruned out // by flattening will need one; existing blocks still in the new flowgraph will // already have one. - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - block_sptr block = cast_to_block_sptr(*p); - - if (!block->detail()) { - GR_LOG_DEBUG(d_debug_logger, - "merge: allocating new detail for block " + block->identifier()); - block->set_detail(allocate_block_detail(block)); - } else { - GR_LOG_DEBUG(d_debug_logger, - "merge: reusing original detail for block " + block->identifier()); - } + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + block_sptr block = cast_to_block_sptr(*p); + + if (!block->detail()) { + GR_LOG_DEBUG(d_debug_logger, + "merge: allocating new detail for block " + block->identifier()); + block->set_detail(allocate_block_detail(block)); + } else { + GR_LOG_DEBUG(d_debug_logger, + "merge: reusing original detail for block " + + block->identifier()); + } } // Calculate the old edges that will be going away, and clear the // buffer readers on the RHS. - for (edge_viter_t old_edge = old_ffg->d_edges.begin(); old_edge != old_ffg->d_edges.end(); + for (edge_viter_t old_edge = old_ffg->d_edges.begin(); + old_edge != old_ffg->d_edges.end(); old_edge++) { GR_LOG_DEBUG(d_debug_logger, "merge: testing old edge " + old_edge->identifier() + "..."); @@ -259,234 +267,230 @@ namespace gr { } // Now connect inputs to outputs, reusing old buffer readers if they exist - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - block_sptr block = cast_to_block_sptr(*p); - - GR_LOG_DEBUG(d_debug_logger, - "merge: merging " + block->identifier() + "..."); - - if (old_ffg->has_block_p(*p)) { - // Block exists in old flow graph - GR_LOG_DEBUG(d_debug_logger, "used in old flow graph") - block_detail_sptr detail = block->detail(); - - // Iterate through the inputs and see what needs to be done - int ninputs = calc_used_ports(block, true).size(); // Might be different now - for (int i = 0; i < ninputs; i++) { - GR_LOG_DEBUG(d_debug_logger, - "Checking input " + block->identifier() + ":" + std::to_string(i) + - "..."); - edge edge = calc_upstream_edge(*p, i); - - // Fish out old buffer reader and see if it matches correct buffer from edge list - block_sptr src_block = cast_to_block_sptr(edge.src().block()); - block_detail_sptr src_detail = src_block->detail(); - buffer_sptr src_buffer = src_detail->output(edge.src().port()); - buffer_reader_sptr old_reader; - if (i < detail->ninputs()) // Don't exceed what the original detail has - old_reader = detail->input(i); - - // If there's a match, use it - if (old_reader && (src_buffer == old_reader->buffer())) { - GR_LOG_DEBUG(d_debug_logger, "matched, reusing"); - } else { - GR_LOG_DEBUG(d_debug_logger, "needs a new reader"); - - // Create new buffer reader and assign - detail->set_input(i, buffer_add_reader(src_buffer, block->history() - 1, block)); - } - } - } - else { - // Block is new, it just needs buffer readers at this point - GR_LOG_DEBUG(d_debug_logger, "new block"); - connect_block_inputs(block); - - // Make sure all buffers are aligned - setup_buffer_alignment(block); - } - - // Connect message ports connetions - for (msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { - GR_LOG_DEBUG(d_debug_logger, - boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % - i->src().block() % i->src().port() % i->dst().block() % i->dst().port()); - i->src().block()->message_port_sub( - i->src().port(), pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); - } - - // Now deal with the fact that the block details might have - // changed numbers of inputs and outputs vs. in the old - // flowgraph. - - block->detail()->reset_nitem_counters(); - block->detail()->clear_tags(); + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + block_sptr block = cast_to_block_sptr(*p); + + GR_LOG_DEBUG(d_debug_logger, "merge: merging " + block->identifier() + "..."); + + if (old_ffg->has_block_p(*p)) { + // Block exists in old flow graph + GR_LOG_DEBUG(d_debug_logger, "used in old flow graph") + block_detail_sptr detail = block->detail(); + + // Iterate through the inputs and see what needs to be done + int ninputs = calc_used_ports(block, true).size(); // Might be different now + for (int i = 0; i < ninputs; i++) { + GR_LOG_DEBUG(d_debug_logger, + "Checking input " + block->identifier() + ":" + + std::to_string(i) + "..."); + edge edge = calc_upstream_edge(*p, i); + + // Fish out old buffer reader and see if it matches correct buffer from + // edge list + block_sptr src_block = cast_to_block_sptr(edge.src().block()); + block_detail_sptr src_detail = src_block->detail(); + buffer_sptr src_buffer = src_detail->output(edge.src().port()); + buffer_reader_sptr old_reader; + if (i < detail->ninputs()) // Don't exceed what the original detail has + old_reader = detail->input(i); + + // If there's a match, use it + if (old_reader && (src_buffer == old_reader->buffer())) { + GR_LOG_DEBUG(d_debug_logger, "matched, reusing"); + } else { + GR_LOG_DEBUG(d_debug_logger, "needs a new reader"); + + // Create new buffer reader and assign + detail->set_input( + i, buffer_add_reader(src_buffer, block->history() - 1, block)); + } + } + } else { + // Block is new, it just needs buffer readers at this point + GR_LOG_DEBUG(d_debug_logger, "new block"); + connect_block_inputs(block); + + // Make sure all buffers are aligned + setup_buffer_alignment(block); + } + + // Connect message ports connetions + for (msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % + i->src().block() % i->src().port() % i->dst().block() % + i->dst().port()); + i->src().block()->message_port_sub( + i->src().port(), + pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); + } + + // Now deal with the fact that the block details might have + // changed numbers of inputs and outputs vs. in the old + // flowgraph. + + block->detail()->reset_nitem_counters(); + block->detail()->clear_tags(); } - } +} - void - flat_flowgraph::setup_buffer_alignment(block_sptr block) - { +void flat_flowgraph::setup_buffer_alignment(block_sptr block) +{ const int alignment = volk_get_alignment(); - for(int i = 0; i < block->detail()->ninputs(); i++) { - void *r = (void*)block->detail()->input(i)->read_pointer(); - uintptr_t ri = (uintptr_t)r % alignment; - //std::cerr << "reader: " << r << " alignment: " << ri << std::endl; - if(ri != 0) { - size_t itemsize = block->detail()->input(i)->get_sizeof_item(); - block->detail()->input(i)->update_read_pointer((alignment-ri)/itemsize); - } - block->set_unaligned(0); - block->set_is_unaligned(false); + for (int i = 0; i < block->detail()->ninputs(); i++) { + void* r = (void*)block->detail()->input(i)->read_pointer(); + uintptr_t ri = (uintptr_t)r % alignment; + // std::cerr << "reader: " << r << " alignment: " << ri << std::endl; + if (ri != 0) { + size_t itemsize = block->detail()->input(i)->get_sizeof_item(); + block->detail()->input(i)->update_read_pointer((alignment - ri) / itemsize); + } + block->set_unaligned(0); + block->set_is_unaligned(false); } - for(int i = 0; i < block->detail()->noutputs(); i++) { - void *w = (void*)block->detail()->output(i)->write_pointer(); - uintptr_t wi = (uintptr_t)w % alignment; - //std::cerr << "writer: " << w << " alignment: " << wi << std::endl; - if(wi != 0) { - size_t itemsize = block->detail()->output(i)->get_sizeof_item(); - block->detail()->output(i)->update_write_pointer((alignment-wi)/itemsize); - } - block->set_unaligned(0); - block->set_is_unaligned(false); + for (int i = 0; i < block->detail()->noutputs(); i++) { + void* w = (void*)block->detail()->output(i)->write_pointer(); + uintptr_t wi = (uintptr_t)w % alignment; + // std::cerr << "writer: " << w << " alignment: " << wi << std::endl; + if (wi != 0) { + size_t itemsize = block->detail()->output(i)->get_sizeof_item(); + block->detail()->output(i)->update_write_pointer((alignment - wi) / itemsize); + } + block->set_unaligned(0); + block->set_is_unaligned(false); } - } +} - std::string - flat_flowgraph::edge_list() - { +std::string flat_flowgraph::edge_list() +{ std::stringstream s; - for(edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) - s << (*e) << std::endl; + for (edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) + s << (*e) << std::endl; return s.str(); - } +} - std::string - flat_flowgraph::msg_edge_list() - { +std::string flat_flowgraph::msg_edge_list() +{ std::stringstream s; - for(msg_edge_viter_t e = d_msg_edges.begin(); e != d_msg_edges.end(); e++) - s << (*e) << std::endl; + for (msg_edge_viter_t e = d_msg_edges.begin(); e != d_msg_edges.end(); e++) + s << (*e) << std::endl; return s.str(); - } - - void flat_flowgraph::dump() - { - for(edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) - std::cout << " edge: " << (*e) << std::endl; - - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - std::cout << " block: " << (*p) << std::endl; - block_detail_sptr detail = cast_to_block_sptr(*p)->detail(); - std::cout << " detail @" << detail << ":" << std::endl; - - int ni = detail->ninputs(); - int no = detail->noutputs(); - for(int i = 0; i < no; i++) { - buffer_sptr buffer = detail->output(i); - std::cout << " output " << i << ": " << buffer << std::endl; - } - - for(int i = 0; i < ni; i++) { - buffer_reader_sptr reader = detail->input(i); - std::cout << " reader " << i << ": " << reader - << " reading from buffer=" << reader->buffer() << std::endl; - } +} + +void flat_flowgraph::dump() +{ + for (edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) + std::cout << " edge: " << (*e) << std::endl; + + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + std::cout << " block: " << (*p) << std::endl; + block_detail_sptr detail = cast_to_block_sptr(*p)->detail(); + std::cout << " detail @" << detail << ":" << std::endl; + + int ni = detail->ninputs(); + int no = detail->noutputs(); + for (int i = 0; i < no; i++) { + buffer_sptr buffer = detail->output(i); + std::cout << " output " << i << ": " << buffer << std::endl; + } + + for (int i = 0; i < ni; i++) { + buffer_reader_sptr reader = detail->input(i); + std::cout << " reader " << i << ": " << reader + << " reading from buffer=" << reader->buffer() << std::endl; + } } - } +} - block_vector_t - flat_flowgraph::make_block_vector(basic_block_vector_t &blocks) - { +block_vector_t flat_flowgraph::make_block_vector(basic_block_vector_t& blocks) +{ block_vector_t result; - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - result.push_back(cast_to_block_sptr(*p)); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + result.push_back(cast_to_block_sptr(*p)); } return result; - } - - void - flat_flowgraph::clear_endpoint(const msg_endpoint &e, bool is_src) - { - for(size_t i=0; i<d_msg_edges.size(); i++) { - if(is_src) { - if(d_msg_edges[i].src() == e) { - d_msg_edges.erase(d_msg_edges.begin() + i); - i--; - } - } - else { - if(d_msg_edges[i].dst() == e) { - d_msg_edges.erase(d_msg_edges.begin() + i); - i--; +} + +void flat_flowgraph::clear_endpoint(const msg_endpoint& e, bool is_src) +{ + for (size_t i = 0; i < d_msg_edges.size(); i++) { + if (is_src) { + if (d_msg_edges[i].src() == e) { + d_msg_edges.erase(d_msg_edges.begin() + i); + i--; + } + } else { + if (d_msg_edges[i].dst() == e) { + d_msg_edges.erase(d_msg_edges.begin() + i); + i--; + } } - } } - } - - void - flat_flowgraph::clear_hier() - { - GR_LOG_DEBUG(d_debug_logger, "Clear_hier()"); - for (size_t i = 0; i < d_msg_edges.size(); i++) { - GR_LOG_DEBUG(d_debug_logger, - "edge: " + d_msg_edges[i].src().identifier() + "-->" + - d_msg_edges[i].dst().identifier()); - if (d_msg_edges[i].src().is_hier() || d_msg_edges[i].dst().is_hier()) { +} + +void flat_flowgraph::clear_hier() +{ + GR_LOG_DEBUG(d_debug_logger, "Clear_hier()"); + for (size_t i = 0; i < d_msg_edges.size(); i++) { + GR_LOG_DEBUG(d_debug_logger, + "edge: " + d_msg_edges[i].src().identifier() + "-->" + + d_msg_edges[i].dst().identifier()); + if (d_msg_edges[i].src().is_hier() || d_msg_edges[i].dst().is_hier()) { GR_LOG_DEBUG(d_debug_logger, "is hier"); d_msg_edges.erase(d_msg_edges.begin() + i); i--; - } + } } - } - - void - flat_flowgraph::replace_endpoint(const msg_endpoint &e, const msg_endpoint &r, bool is_src) - { - size_t n_replr(0); - GR_LOG_DEBUG(d_debug_logger, - boost::format("flat_flowgraph::replace_endpoint( %s, %s, %d )\n") % e.block() % - r.block() % is_src); - for (size_t i = 0; i < d_msg_edges.size(); i++) { - if (is_src) { - if (d_msg_edges[i].src() == e) { - GR_LOG_DEBUG( - d_debug_logger, - boost::format( - "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % - r % d_msg_edges[i].dst()) - d_msg_edges.push_back(msg_edge(r, d_msg_edges[i].dst())); - n_replr++; - } - } else { - if (d_msg_edges[i].dst() == e) { - GR_LOG_DEBUG( - d_debug_logger, - boost::format( - "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % - r % d_msg_edges[i].src()); - d_msg_edges.push_back(msg_edge(d_msg_edges[i].src(), r)); - n_replr++; - } - } +} + +void flat_flowgraph::replace_endpoint(const msg_endpoint& e, + const msg_endpoint& r, + bool is_src) +{ + size_t n_replr(0); + GR_LOG_DEBUG(d_debug_logger, + boost::format("flat_flowgraph::replace_endpoint( %s, %s, %d )\n") % + e.block() % r.block() % is_src); + for (size_t i = 0; i < d_msg_edges.size(); i++) { + if (is_src) { + if (d_msg_edges[i].src() == e) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format( + "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % + r % d_msg_edges[i].dst()) + d_msg_edges.push_back(msg_edge(r, d_msg_edges[i].dst())); + n_replr++; + } + } else { + if (d_msg_edges[i].dst() == e) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format( + "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % + r % d_msg_edges[i].src()); + d_msg_edges.push_back(msg_edge(d_msg_edges[i].src(), r)); + n_replr++; + } + } } - } +} - void - flat_flowgraph::enable_pc_rpc() - { +void flat_flowgraph::enable_pc_rpc() +{ #ifdef GR_PERFORMANCE_COUNTERS - if(prefs::singleton()->get_bool("PerfCounters", "on", false)) { - basic_block_viter_t p; - for(p = d_blocks.begin(); p != d_blocks.end(); p++) { - block_sptr block = cast_to_block_sptr(*p); - if(!block->is_pc_rpc_set()) - block->setup_pc_rpc(); - } + if (prefs::singleton()->get_bool("PerfCounters", "on", false)) { + basic_block_viter_t p; + for (p = d_blocks.begin(); p != d_blocks.end(); p++) { + block_sptr block = cast_to_block_sptr(*p); + if (!block->is_pc_rpc_set()) + block->setup_pc_rpc(); + } } #endif /* GR_PERFORMANCE_COUNTERS */ - } +} } /* namespace gr */ |