commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r3986 - gnuradio/branches/developers/eb/mb/mblock/src/


From: eb
Subject: [Commit-gnuradio] r3986 - gnuradio/branches/developers/eb/mb/mblock/src/lib
Date: Tue, 14 Nov 2006 21:11:50 -0700 (MST)

Author: eb
Date: 2006-11-14 21:11:50 -0700 (Tue, 14 Nov 2006)
New Revision: 3986

Modified:
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
   gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc
Log:
disconnect variants are working

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc  
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc  
2006-11-15 04:11:50 UTC (rev 3986)
@@ -26,32 +26,24 @@
 #include <mb_connection.h>
 
 bool
-mb_conn_table::lookup_conn0_by_name(const std::string &component_name,
-                                   const std::string &port_name,
-                                   mb_conn_iter *itp)
+mb_conn_table::lookup_conn_by_name(const std::string &component_name,
+                                  const std::string &port_name,
+                                  mb_conn_iter *itp, int *which_ep)
 {
   mb_conn_iter end = d_connections.end();
   for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
+
     if (it->d_ep[0].component_name() == component_name
        && it->d_ep[0].port_name() == port_name){
       *itp = it;
+      *which_ep = 0;
       return true;
     }
-  }
 
-  return false;
-}
-
-bool
-mb_conn_table::lookup_conn1_by_name(const std::string &component_name,
-                                   const std::string &port_name,
-                                   mb_conn_iter *itp)
-{
-  mb_conn_iter end = d_connections.end();
-  for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
     if (it->d_ep[1].component_name() == component_name
        && it->d_ep[1].port_name() == port_name){
       *itp = it;
+      *which_ep = 1;
       return true;
     }
   }
@@ -60,22 +52,17 @@
 }
 
 bool
-mb_conn_table::lookup_conn_by_name(const std::string &component_name,
-                                  const std::string &port_name,
+mb_conn_table::lookup_conn_by_port(mb_port_sptr port,
                                   mb_conn_iter *itp, int *which_ep)
 {
   mb_conn_iter end = d_connections.end();
   for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
-
-    if (it->d_ep[0].component_name() == component_name
-       && it->d_ep[0].port_name() == port_name){
+    if (it->d_ep[0].port() == port){
       *itp = it;
       *which_ep = 0;
       return true;
     }
-
-    if (it->d_ep[1].component_name() == component_name
-       && it->d_ep[1].port_name() == port_name){
+    if (it->d_ep[1].port() == port){
       *itp = it;
       *which_ep = 1;
       return true;
@@ -85,60 +72,55 @@
   return false;
 }
 
-bool
-mb_conn_table::lookup_conn0_by_port(mb_port_sptr port,
-                                   mb_conn_iter *itp)
+void
+mb_conn_table::create_conn(const mb_endpoint &ep0, const mb_endpoint &ep1)
 {
-  mb_conn_iter end = d_connections.end();
-  for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
-    if (it->d_ep[0].port() == port){
-      *itp = it;
-      return true;
-    }
-  }
-
-  return false;
+  d_connections.push_back(mb_connection(ep0, ep1));
 }
 
-
-bool
-mb_conn_table::lookup_conn1_by_port(mb_port_sptr port,
-                                   mb_conn_iter *itp)
+void
+mb_conn_table::disconnect(const std::string &comp_name1, const std::string 
&port_name1,
+                         const std::string &comp_name2, const std::string 
&port_name2)
 {
-  mb_conn_iter end = d_connections.end();
-  for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
-    if (it->d_ep[1].port() == port){
-      *itp = it;
-      return true;
-    }
-  }
+  mb_conn_iter it;
+  int         which_ep;
 
-  return false;
+  // look for comp_name1/port_name1
+  bool found = lookup_conn_by_name(comp_name1, port_name1, &it, &which_ep);
+
+  if (!found)  // no error if not found
+    return;
+
+  // FIXME if/when we do replicated ports, we may have one-to-many,
+  // or many-to-many bindings.  For now, be paranoid
+  assert(it->d_ep[which_ep^1].component_name() == comp_name2);
+  assert(it->d_ep[which_ep^1].port_name() == port_name2);
+
+  d_connections.erase(it);             // Poof!
 }
 
-bool
-mb_conn_table::lookup_conn_by_port(mb_port_sptr port,
-                                  mb_conn_iter *itp, int *which_ep)
+void
+mb_conn_table::disconnect_component(const std::string component_name)
 {
+  mb_conn_iter next;
   mb_conn_iter end = d_connections.end();
-  for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
-    if (it->d_ep[0].port() == port){
-      *itp = it;
-      *which_ep = 0;
-      return true;
-    }
-    if (it->d_ep[1].port() == port){
-      *itp = it;
-      *which_ep = 1;
-      return true;
-    }
+  for (mb_conn_iter it = d_connections.begin(); it != end; it = next){
+    if (it->d_ep[0].component_name() == component_name
+       || it->d_ep[1].component_name() == component_name)
+      next = d_connections.erase(it);  // Poof!
+    else
+      next = ++it;
   }
-
-  return false;
 }
 
 void
-mb_conn_table::create_conn(const mb_endpoint &ep0, const mb_endpoint &ep1)
+mb_conn_table::disconnect_all()
 {
-  d_connections.push_back(mb_connection(ep0, ep1));
+  d_connections.clear();               // All gone!
 }
+
+int
+mb_conn_table::nconnections() const
+{
+  return d_connections.size();
+}

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h   
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h   
2006-11-15 04:11:50 UTC (rev 3986)
@@ -48,32 +48,31 @@
 
 public:
   bool
-  lookup_conn0_by_name(const std::string &component_name,
-                      const std::string &port_name,
-                      mb_conn_iter *it);
-  bool
-  lookup_conn1_by_name(const std::string &component_name,
-                      const std::string &port_name,
-                      mb_conn_iter *it);
-  bool
   lookup_conn_by_name(const std::string &component_name,
                      const std::string &port_name,
                      mb_conn_iter *it, int *which_ep);
 
   bool
-  lookup_conn0_by_port(mb_port_sptr port,
-                      mb_conn_iter *it);
-
-  bool
-  lookup_conn1_by_port(mb_port_sptr port,
-                      mb_conn_iter *it);
-
-  bool
   lookup_conn_by_port(mb_port_sptr port,
                       mb_conn_iter *it, int *which_ep);
 
   void
   create_conn(const mb_endpoint &ep0, const mb_endpoint &ep1);
+
+
+  void
+  disconnect(const std::string &comp_name1, const std::string &port_name1,
+            const std::string &comp_name2, const std::string &port_name2);
+
+  void
+  disconnect_component(const std::string component_name);
+
+  void
+  disconnect_all();
+
+  int
+  nconnections() const;
+
 };
 
 #endif /* INCLUDED_MB_CONNECTION_H */

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc   
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc   
2006-11-15 04:11:50 UTC (rev 3986)
@@ -73,3 +73,10 @@
             + mb_util::join_names(comp2_name, port2_name))
 {
 }
+
+mbe_invalid_port_type::mbe_invalid_port_type(mb_mblock *mb,
+                                            const std::string &comp_name,
+                                            const std::string &port_name)
+  : mbe_base(mb, "Invalid port type for connection: " + 
mb_util::join_names(comp_name, port_name))
+{
+}

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h    
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h    
2006-11-15 04:11:50 UTC (rev 3986)
@@ -75,6 +75,13 @@
                         const std::string &port2_name);
 };
 
+class mbe_invalid_port_type : public mbe_base
+{
+public:
+  mbe_invalid_port_type(mb_mblock *, const std::string &comp_name,
+                       const std::string &port_name);
+};
 
 
+
 #endif /* INCLUDED_MB_EXCEPTION_H */

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.cc      
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.cc      
2006-11-15 04:11:50 UTC (rev 3986)
@@ -154,6 +154,12 @@
   d_impl->disconnect_all();
 }
 
+int
+mb_mblock::nconnections() const
+{
+  return d_impl->nconnections();
+}
+
 void
 mb_mblock::send(pmt_t port_name, pmt_t signal,
                pmt_t data, pmt_t metadata, mb_pri_t priority)

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h       
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h       
2006-11-15 04:11:50 UTC (rev 3986)
@@ -160,6 +160,12 @@
   disconnect_all();
 
   /*!
+   * \brief Return number of connections (QA mostly)
+   */
+  int
+  nconnections() const;
+
+  /*!
    * \brief send a message
    *
    * \param port_name  name of the port via which we send the message

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc 
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc 
2006-11-15 04:11:50 UTC (rev 3986)
@@ -106,21 +106,27 @@
 mb_mblock_impl::disconnect(const std::string &comp_name1, const std::string 
&port_name1,
                           const std::string &comp_name2, const std::string 
&port_name2)
 {
-  // FIXME
+  d_conn_table.disconnect(comp_name1, port_name1, comp_name2, port_name2);
 }
 
 void
 mb_mblock_impl::disconnect_component(const std::string component_name)
 {
-  // FIXME
+  d_conn_table.disconnect_component(component_name);
 }
 
 void
 mb_mblock_impl::disconnect_all()
 {
-  // FIXME
+  d_conn_table.disconnect_all();
 }
 
+int
+mb_mblock_impl::nconnections() const
+{
+  return d_conn_table.nconnections();
+}
+
 void
 mb_mblock_impl::send(pmt_t port_name, pmt_t signal,
                     pmt_t data, pmt_t metadata, mb_pri_t priority)
@@ -138,7 +144,14 @@
   int          which_ep;
   mb_port_sptr port = resolve_port(comp_name, port_name);
 
-  // Is this endpoint already bound?
+  // Confirm that we're not trying to connect to the inside of one of
+  // our EXTERNAL ports.  Connections that include "self" as the
+  // component name must be either INTERNAL or RELAY.
+
+  if (comp_name == "self" && port->port_type() == mb_port_class::EXTERNAL)
+    throw mbe_invalid_port_type(d_mb, comp_name, port_name);
+
+  // Is this endpoint already connected?
   if (d_conn_table.lookup_conn_by_name(comp_name, port_name, &it, &which_ep))
     throw mbe_already_connected(d_mb, comp_name, port_name);
 

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h  
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h  
2006-11-15 04:11:50 UTC (rev 3986)
@@ -127,6 +127,12 @@
   disconnect_all();
 
   /*!
+   * \brief Return number of connections (QA mostly)
+   */
+  int
+  nconnections() const;
+
+  /*!
    * \brief send a message
    *
    * \param port_name  name of the port via which we send the message

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc        
2006-11-14 22:03:12 UTC (rev 3985)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc        
2006-11-15 04:11:50 UTC (rev 3986)
@@ -198,7 +198,7 @@
   tc_norm(){
     define_port("data", "i/o", false, mb_port_class::EXTERNAL);
     define_port("norm", "i/o", false, mb_port_class::EXTERNAL);
-    define_port("conj", "i/o", true, mb_port_class::EXTERNAL);
+    define_port("conj", "i/o", true,  mb_port_class::EXTERNAL);
     define_port("int",  "i/o", false, mb_port_class::INTERNAL);
   }
 
@@ -214,12 +214,15 @@
 public:
   tc_0(){
     define_port("norm", "i/o", false, mb_port_class::EXTERNAL);
+    define_port("conj", "i/o", true,  mb_port_class::EXTERNAL);
     define_port("int",  "i/o", false, mb_port_class::INTERNAL);
 
     define_component("c0", mb_mblock_sptr(new tc_norm()));
     define_component("c1", mb_mblock_sptr(new tc_norm()));
     define_component("c2", mb_mblock_sptr(new tc_norm()));
     define_component("c3", mb_mblock_sptr(new tc_norm()));
+    define_component("c4", mb_mblock_sptr(new tc_norm()));
+    define_component("c5", mb_mblock_sptr(new tc_norm()));
 
     // OK
     connect("c0", "norm", "c1", "conj");
@@ -248,11 +251,42 @@
     // No: can't connect to child's internal port
     CPPUNIT_ASSERT_THROW(connect("c0", "conj", "c2", "int"), mbe_no_such_port);
 
-    // OK
-    connect("self", "norm", "c0", "conj");
+    // No: can't connect to our own external port
+    CPPUNIT_ASSERT_THROW(connect("self", "norm", "c0", "conj"), 
mbe_invalid_port_type);
 
     // OK:  connecting to one of our internal ports
     connect("self", "int", "c3", "conj");
+
+    // =====  Now test disconnecting some stuff =====
+
+    // Confirm we're already connected
+    CPPUNIT_ASSERT_THROW(connect("self", "int", "c3", "conj"), 
mbe_already_connected);
+
+    int nc = nconnections();
+    disconnect("self", "int", "c3", "conj");   // disconnect
+    CPPUNIT_ASSERT_EQUAL(nc-1, nconnections());
+    
+    connect("self", "int", "c3", "conj");      // reconnect
+    CPPUNIT_ASSERT_EQUAL(nc, nconnections());
+
+    // confirm we're already connected
+    CPPUNIT_ASSERT_THROW(connect("self", "int", "c3", "conj"), 
mbe_already_connected);
+
+
+    connect("c0", "conj", "c5", "data");
+    connect("c4", "norm", "c5", "conj");
+    connect("c4", "conj", "c5", "norm");
+
+    nc = nconnections();
+    disconnect_component("c4");
+    CPPUNIT_ASSERT_EQUAL(nc-2, nconnections());
+
+    disconnect_component("c5");
+    CPPUNIT_ASSERT_EQUAL(nc-3, nconnections());
+
+    disconnect_all();
+    CPPUNIT_ASSERT_EQUAL(0, nconnections());
+
   }
 
   ~tc_0();





reply via email to

[Prev in Thread] Current Thread [Next in Thread]