]> git.gag.com Git - debian/gnuradio/commitdiff
Fixes ticket:386
authorjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Fri, 17 Apr 2009 18:45:58 +0000 (18:45 +0000)
committerjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Fri, 17 Apr 2009 18:45:58 +0000 (18:45 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10869 221aa14e-8319-0410-a670-987f0aec2ac5

gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py

index c6cbd5b31d83a28ecf1ccf0653f8dc0504ee69e3..1c437d3c84b021aec3fbc06a8a187f107fef7140 100644 (file)
@@ -146,16 +146,44 @@ gr_hier_block2_detail::connect(gr_basic_block_sptr src, int src_port,
 void
 gr_hier_block2_detail::disconnect(gr_basic_block_sptr block)
 {
+  // Check on singleton list
   for (gr_basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) {
     if (*p == block) {
       d_blocks.erase(p);
+      
+      gr_hier_block2_sptr hblock(cast_to_hier_block2_sptr(block));
+      if (block && block.get() != d_owner) {
+       if (GR_HIER_BLOCK2_DETAIL_DEBUG)
+         std::cout << "disconnect: block is hierarchical, clearing parent" << std::endl;
+       hblock->d_detail->d_parent_detail = 0;
+      }
+    
       return;
     }
   }
 
-  std::stringstream msg;
-  msg << "cannot disconnect block " << block << ", not found";
-  throw std::invalid_argument(msg.str());
+  // Otherwise find all edges containing block
+  gr_edge_vector_t edges, tmp = d_fg->edges();
+  gr_edge_vector_t::iterator p;
+  for (p = tmp.begin(); p != tmp.end(); p++) {
+    if ((*p).src().block() == block || (*p).dst().block() == block) {
+      edges.push_back(*p);
+
+      if (GR_HIER_BLOCK2_DETAIL_DEBUG)
+       std::cout << "disconnect: block found in edge " << (*p) << std::endl;  
+    }
+  }
+
+  if (edges.size() == 0) {
+    std::stringstream msg;
+    msg << "cannot disconnect block " << block << ", not found";
+    throw std::invalid_argument(msg.str());
+  }
+
+  for (p = edges.begin(); p != edges.end(); p++) {
+    disconnect((*p).src().block(), (*p).src().port(),
+              (*p).dst().block(), (*p).dst().port());
+  }
 }
 
 void 
@@ -174,13 +202,13 @@ gr_hier_block2_detail::disconnect(gr_basic_block_sptr src, int src_port,
 
   if (src_block && src.get() != d_owner) {
     if (GR_HIER_BLOCK2_DETAIL_DEBUG)
-      std::cout << "connect: src is hierarchical, clearing parent" << std::endl;
+      std::cout << "disconnect: src is hierarchical, clearing parent" << std::endl;
     src_block->d_detail->d_parent_detail = 0;
   }
                
   if (dst_block && dst.get() != d_owner) {
     if (GR_HIER_BLOCK2_DETAIL_DEBUG)
-      std::cout << "connect: dst is hierarchical, clearing parent" << std::endl;
+      std::cout << "disconnect: dst is hierarchical, clearing parent" << std::endl;
     dst_block->d_detail->d_parent_detail = 0;
   }
 
index a0b3810a661de289b383e1e4ea57e1dc32083fe0..d4074f033d176324bd08b05f3cac4dc66d93051f 100755 (executable)
@@ -263,6 +263,16 @@ class test_hier_block2(gr_unittest.TestCase):
         tb.disconnect_all()
         tb.connect(src, dst)
         tb.unlock()
+
+    def test_029_singleton_disconnect(self):
+        tb = gr.top_block()
+        src = gr.vector_source_b([1, ])
+        dst = gr.vector_sink_b()
+        tb.connect(src, dst)
+        tb.disconnect(src)   # Singleton disconnect
+        tb.connect(src, dst)
+        tb.run()
+        self.assertEquals(dst.data(), (1,))
     
 if __name__ == "__main__":
     gr_unittest.main()