[Top][All Lists]
[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();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r3986 - gnuradio/branches/developers/eb/mb/mblock/src/lib,
eb <=