commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4966 - gnuradio/branches/features/inband-usb/mblock/s


From: eb
Subject: [Commit-gnuradio] r4966 - gnuradio/branches/features/inband-usb/mblock/src/lib
Date: Wed, 11 Apr 2007 23:27:10 -0600 (MDT)

Author: eb
Date: 2007-04-11 23:27:09 -0600 (Wed, 11 Apr 2007)
New Revision: 4966

Added:
   gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.cc
   gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.mbh
Modified:
   gnuradio/branches/features/inband-usb/mblock/src/lib/
   gnuradio/branches/features/inband-usb/mblock/src/lib/Makefile.am
   gnuradio/branches/features/inband-usb/mblock/src/lib/mb_mblock.cc
   gnuradio/branches/features/inband-usb/mblock/src/lib/mb_port_simple.cc
   gnuradio/branches/features/inband-usb/mblock/src/lib/mb_protocol_class.cc
   
gnuradio/branches/features/inband-usb/mblock/src/lib/mb_runtime_thread_per_block.cc
   gnuradio/branches/features/inband-usb/mblock/src/lib/mb_worker.cc
   gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.cc
   gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.h
Log:
Merged eb/ibu -r4929:4965 into features/inband-usb.  mblocks are now
passing fairly substantial multi-threaded QA tests.  Now need to spend
some time looking at performance.



Property changes on: gnuradio/branches/features/inband-usb/mblock/src/lib
___________________________________________________________________
Name: svn:ignore
   - Makefile
Makefile.in
.la
.lo
.deps
.libs
*.la
*.lo
test_mblock

   + Makefile
Makefile.in
.la
.lo
.deps
.libs
*.la
*.lo
test_mblock
qa_bitset_mbh.cc


Modified: gnuradio/branches/features/inband-usb/mblock/src/lib/Makefile.am
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/Makefile.am    
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/Makefile.am    
2007-04-12 05:27:09 UTC (rev 4966)
@@ -31,6 +31,12 @@
        README.locking                  
 
 
+BUILT_SOURCES =                                \
+       qa_bitset_mbh.cc                
+
+qa_bitset_mbh.cc : qa_bitset.mbh
+       $(COMPILE_MBH) qa_bitset.mbh qa_bitset_mbh.cc
+
 # These are the source files that go into the mblock shared library
 libmblock_la_SOURCES =                 \
        mb_class_registry.cc            \
@@ -95,6 +101,8 @@
 # Build the qa code into its own library
 
 libmblock_qa_la_SOURCES =              \
+       qa_bitset.cc                    \
+       qa_bitset_mbh.cc                \
        qa_mblock.cc                    \
        qa_mblock_prims.cc              \
        qa_mblock_send.cc               \

Modified: gnuradio/branches/features/inband-usb/mblock/src/lib/mb_mblock.cc
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/mb_mblock.cc   
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/mb_mblock.cc   
2007-04-12 05:27:09 UTC (rev 4966)
@@ -84,9 +84,14 @@
       }
     }
     catch (pmt_exception e){
-      std::cerr << std::endl << instance_name()
-               << "::main_loop: ignoring pmt_exception: "
-               << e.what() << std::endl;
+      std::cerr << "\nmb_mblock::main_loop: ignored pmt_exception: "
+               << e.what()
+               << "\nin mblock instance \"" << instance_name()
+               << "\" while handling message:"
+               << "\n    port_id = " << msg->port_id()
+               << "\n     signal = " << msg->signal()
+               << "\n       data = " << msg->data()
+               << "\n  metatdata = " << msg->metadata() << std::endl;
     }
   }
 }

Modified: gnuradio/branches/features/inband-usb/mblock/src/lib/mb_port_simple.cc
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/mb_port_simple.cc      
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/mb_port_simple.cc      
2007-04-12 05:27:09 UTC (rev 4966)
@@ -78,6 +78,8 @@
 
   case mb_port::EXTERNAL:      // binding is in parent's name space
     context = p->mblock()->parent();
+    if (!context)                      // can't be bound if there's no parent
+      return mb_msg_accepter_sptr();   // not bound
     break;
 
   default:

Modified: 
gnuradio/branches/features/inband-usb/mblock/src/lib/mb_protocol_class.cc
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/mb_protocol_class.cc   
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/mb_protocol_class.cc   
2007-04-12 05:27:09 UTC (rev 4966)
@@ -90,8 +90,10 @@
   while (1){
     pmt_t obj = pmt_deserialize(sb);
 
-    pmt_write(obj, std::cout);
-    std::cout << std::endl;
+    if (0){
+      pmt_write(obj, std::cout);
+      std::cout << std::endl;
+    }
 
     if (pmt_is_eof_object(obj))
       return;

Modified: 
gnuradio/branches/features/inband-usb/mblock/src/lib/mb_runtime_thread_per_block.cc
===================================================================
--- 
gnuradio/branches/features/inband-usb/mblock/src/lib/mb_runtime_thread_per_block.cc
 2007-04-12 05:14:57 UTC (rev 4965)
+++ 
gnuradio/branches/features/inband-usb/mblock/src/lib/mb_runtime_thread_per_block.cc
 2007-04-12 05:27:09 UTC (rev 4966)
@@ -58,8 +58,9 @@
 {
   // FIXME iterate over workers and ensure that they are dead.
 
-  std::cerr << "\nmb_runtime_thread_per_block: dtor (# workers = "
-           << d_workers.size() << ")\n";
+  if (!d_workers.empty())
+    std::cerr << "\nmb_runtime_thread_per_block: dtor (# workers = "
+             << d_workers.size() << ")\n";
 }
 
 void
@@ -110,32 +111,34 @@
    * FIXME probably ought to recode this to use a message queue
    * and state machine like the rest of the world ;)
    */
+
+  omni_mutex_lock l1(d_mutex);
+
   while (1){
+
     reap_dead_workers();
-    {
-      omni_mutex_lock l1(d_mutex);
-      if (d_workers.empty())   // no work left to do...
-       return;         
 
-      if (d_shutdown_requested && !d_shutdown_in_progress){
-       d_shutdown_in_progress = true;
+    if (d_workers.empty())     // no work left to do...
+      return;          
 
-       // FIXME state machine, delay before sending %halt
-       send_all_sys_msg(s_shutdown);
-       send_all_sys_msg(s_halt);
+    if (d_shutdown_requested && !d_shutdown_in_progress){
+      d_shutdown_in_progress = true;
 
-       continue;
-      }
+      // FIXME state machine, delay before sending %halt
+      send_all_sys_msg(s_shutdown);
+      send_all_sys_msg(s_halt);
 
-      d_runtime_cond.wait();   // wait for something to do.
+      continue;
     }
+
+    d_runtime_cond.wait();     // wait for something to do.
   }
 }
 
 void
 mb_runtime_thread_per_block::reap_dead_workers()
 {
-  omni_mutex_lock l1(d_mutex);
+  // omni_mutex_lock l1(d_mutex);
 
   for (worker_iter_t wi = d_workers.begin(); wi != d_workers.end(); ){
     bool is_dead;
@@ -149,10 +152,12 @@
       omni_mutex_lock l2((*wi)->d_mutex);
       is_dead = (*wi)->d_state == mb_worker::TS_DEAD;
     }
-      
+
     if (is_dead){
-      std::cerr << "\nruntime: "
-               << (*wi)->d_mblock->instance_name() << " is TS_DEAD\n";
+      if (0)
+       std::cerr << "\nruntime: "
+                 << "(" << (*wi)->id() << ") "
+                 << (*wi)->d_mblock->instance_name() << " is TS_DEAD\n";
       void *ignore;
       (*wi)->join(&ignore);
       wi = d_workers.erase(wi);
@@ -219,6 +224,11 @@
     d_workers.push_back(w);
   }
 
+  if (0)
+    std::cerr << "\nruntime: created "
+             << "(" << w->id() << ") "
+             << w->d_mblock->instance_name() << "\n";
+
   return w->d_mblock;
 }
 

Modified: gnuradio/branches/features/inband-usb/mblock/src/lib/mb_worker.cc
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/mb_worker.cc   
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/mb_worker.cc   
2007-04-12 05:27:09 UTC (rev 4966)
@@ -90,6 +90,13 @@
   catch (mbe_exit){
     d_why_dead = RIP_EXIT;
   }
+  catch (std::logic_error e){
+    if (d_why_dead == RIP_NOT_DEAD_YET)
+      d_why_dead = RIP_UNHANDLED_EXCEPTION;
+
+    std::cerr << "\nmb_worker::run_undetached: unhandled exception:\n";
+    std::cerr << "  " << e.what() << std::endl;
+  }
   catch (...){
     if (d_why_dead == RIP_NOT_DEAD_YET)
       d_why_dead = RIP_UNHANDLED_EXCEPTION;

Copied: gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.cc (from 
rev 4965, gnuradio/branches/developers/eb/ibu/mblock/src/lib/qa_bitset.cc)
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.cc           
                (rev 0)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.cc   
2007-04-12 05:27:09 UTC (rev 4966)
@@ -0,0 +1,440 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <mb_mblock.h>
+#include <mb_protocol_class.h>
+#include <mb_message.h>
+#include <mb_class_registry.h>
+#include <iostream>
+#include <bitset>
+
+static pmt_t s_in = pmt_intern("in");
+static pmt_t s_out = pmt_intern("out");
+static pmt_t s_data = pmt_intern("data");
+static pmt_t s_start = pmt_intern("start");
+static pmt_t s_send_batch = pmt_intern("send-batch");
+static pmt_t s_long0 = pmt_from_long(0);
+
+class qa_bitset : public mb_mblock
+{
+  mb_port_sptr d_in;
+  mb_port_sptr d_out;
+  int          d_bitno;
+
+public:
+  qa_bitset(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+  void handle_message(mb_message_sptr msg);
+};
+
+qa_bitset::qa_bitset(mb_runtime *runtime, const std::string &instance_name, 
pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  d_bitno = pmt_to_long(user_arg);     // The bit we are to set
+
+  d_in  = define_port("in", "qa-bitset", false, mb_port::EXTERNAL);
+  d_out = define_port("out", "qa-bitset", true, mb_port::EXTERNAL);
+}
+
+void
+qa_bitset::handle_message(mb_message_sptr msg)
+{
+  if (pmt_eq(msg->port_id(), s_in) && pmt_eq(msg->signal(), s_data)){
+    d_out->send(s_data, pmt_cons(pmt_car(msg->data()),
+                                pmt_from_long((1L << d_bitno) | 
pmt_to_long(pmt_cdr(msg->data())))));
+  }
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset2 : public mb_mblock
+{
+  mb_port_sptr d_in;
+  mb_port_sptr d_out;
+
+public:
+  qa_bitset2(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+};
+
+qa_bitset2::qa_bitset2(mb_runtime *runtime, const std::string &instance_name, 
pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  long bitno = pmt_to_long(user_arg);  // The bit we are to set
+
+  d_in  = define_port("in", "qa-bitset", false, mb_port::RELAY);
+  d_out = define_port("out", "qa-bitset", true, mb_port::RELAY);
+
+  define_component("bs0", "qa_bitset", pmt_from_long(bitno));
+  define_component("bs1", "qa_bitset", pmt_from_long(bitno + 1));
+  connect("self", "in", "bs0", "in");
+  connect("bs0", "out", "bs1", "in");
+  connect("bs1", "out", "self", "out");
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset2);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset4 : public mb_mblock
+{
+  mb_port_sptr d_in;
+  mb_port_sptr d_out;
+
+public:
+  qa_bitset4(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+};
+
+qa_bitset4::qa_bitset4(mb_runtime *runtime, const std::string &instance_name, 
pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  long bitno = pmt_to_long(user_arg);  // The bit we are to set
+
+  d_in  = define_port("in", "qa-bitset", false, mb_port::RELAY);
+  d_out = define_port("out", "qa-bitset", true, mb_port::RELAY);
+
+  define_component("bs0", "qa_bitset2", pmt_from_long(bitno));
+  define_component("bs1", "qa_bitset2", pmt_from_long(bitno + 2));
+  connect("self", "in", "bs0", "in");
+  connect("bs0", "out", "bs1", "in");
+  connect("bs1", "out", "self", "out");
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset4);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset8 : public mb_mblock
+{
+  mb_port_sptr d_in;
+  mb_port_sptr d_out;
+
+public:
+  qa_bitset8(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+};
+
+qa_bitset8::qa_bitset8(mb_runtime *runtime, const std::string &instance_name, 
pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  long bitno = pmt_to_long(user_arg);  // The bit we are to set
+
+  d_in  = define_port("in", "qa-bitset", false, mb_port::RELAY);
+  d_out = define_port("out", "qa-bitset", true, mb_port::RELAY);
+
+  define_component("bs0", "qa_bitset4", pmt_from_long(bitno));
+  define_component("bs1", "qa_bitset4", pmt_from_long(bitno + 4));
+  connect("self", "in", "bs0", "in");
+  connect("bs0", "out", "bs1", "in");
+  connect("bs1", "out", "self", "out");
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset8);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset16 : public mb_mblock
+{
+  mb_port_sptr d_in;
+  mb_port_sptr d_out;
+
+public:
+  qa_bitset16(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+};
+
+qa_bitset16::qa_bitset16(mb_runtime *runtime, const std::string 
&instance_name, pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  long bitno = pmt_to_long(user_arg);  // The bit we are to set
+
+  d_in  = define_port("in", "qa-bitset", false, mb_port::RELAY);
+  d_out = define_port("out", "qa-bitset", true, mb_port::RELAY);
+
+  define_component("bs0", "qa_bitset8", pmt_from_long(bitno));
+  define_component("bs1", "qa_bitset8", pmt_from_long(bitno + 8));
+  connect("self", "in", "bs0", "in");
+  connect("bs0", "out", "bs1", "in");
+  connect("bs1", "out", "self", "out");
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset16);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset32 : public mb_mblock
+{
+  mb_port_sptr d_in;
+  mb_port_sptr d_out;
+
+public:
+  qa_bitset32(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+};
+
+qa_bitset32::qa_bitset32(mb_runtime *runtime, const std::string 
&instance_name, pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  long bitno = pmt_to_long(user_arg);  // The bit we are to set
+
+  d_in  = define_port("in", "qa-bitset", false, mb_port::RELAY);
+  d_out = define_port("out", "qa-bitset", true, mb_port::RELAY);
+
+  define_component("bs0", "qa_bitset16", pmt_from_long(bitno));
+  define_component("bs1", "qa_bitset16", pmt_from_long(bitno + 16));
+  connect("self", "in", "bs0", "in");
+  connect("bs0", "out", "bs1", "in");
+  connect("bs1", "out", "self", "out");
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset32);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset_src : public mb_mblock
+{
+  mb_port_sptr d_cs_top;
+  mb_port_sptr d_cs;
+  
+  mb_port_sptr d_out;
+
+  long         d_msg_number;           // starting message number
+  long         d_nmsgs_to_send;        // # of messages to send
+  long         d_batch_size;           // # of messages to send per batch
+  
+public:
+  qa_bitset_src(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+  void handle_message(mb_message_sptr msg);
+
+protected:
+  void send_one();
+  void send_batch();
+};
+
+qa_bitset_src::qa_bitset_src(mb_runtime *runtime, const std::string 
&instance_name, pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  d_msg_number    = pmt_to_long(pmt_nth(0, user_arg));
+  d_nmsgs_to_send = pmt_to_long(pmt_nth(1, user_arg));
+  d_batch_size    = pmt_to_long(pmt_nth(2, user_arg));
+
+  d_cs_top = define_port("cs_top", "qa-bitset-cs", true, mb_port::EXTERNAL);
+  d_cs = define_port("cs", "qa-bitset-cs", true, mb_port::EXTERNAL);
+
+  d_out = define_port("out", "qa-bitset", true, mb_port::EXTERNAL);
+}
+
+void
+qa_bitset_src::handle_message(mb_message_sptr msg)
+{
+  if ((pmt_eq(msg->port_id(), d_cs_top->port_symbol())
+       || pmt_eq(msg->port_id(), d_cs->port_symbol()))
+      && pmt_eq(msg->signal(), s_send_batch)){
+    send_batch();
+  }
+}
+
+void
+qa_bitset_src::send_batch()
+{
+  for (int i = 0; i < d_batch_size; i++)
+    send_one();
+}
+
+void
+qa_bitset_src::send_one()
+{
+  if (d_nmsgs_to_send > 0){
+    pmt_t msg_number = pmt_from_long(d_msg_number++);
+    d_out->send(s_data, pmt_cons(msg_number, s_long0));
+  }
+  if (--d_nmsgs_to_send <= 0)
+    exit();
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset_src);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset_sink : public mb_mblock
+{
+  // Maximum number of messages we can track
+  static const size_t MAX_MSGS = 1 * 1024 * 1024; 
+  
+  mb_port_sptr d_cs0;
+  mb_port_sptr d_cs1;
+  mb_port_sptr d_cs2;
+  mb_port_sptr d_cs3;
+  
+  mb_port_sptr d_in0;
+  mb_port_sptr d_in1;
+  mb_port_sptr d_in2;
+  mb_port_sptr d_in3;
+
+  long                 d_nmsgs_to_recv; // # of messages to receive
+  long                 d_batch_size;    // # of messages to receive per batch
+  uint32_t             d_expected_mask;
+
+  std::bitset<MAX_MSGS>        d_bitset;
+  long                 d_nrecvd;
+  
+public:
+  qa_bitset_sink(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+  void handle_message(mb_message_sptr msg);
+
+protected:
+  void receive_one(mb_message_sptr msg);
+};
+
+qa_bitset_sink::qa_bitset_sink(mb_runtime *runtime, const std::string 
&instance_name, pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg),
+    d_nrecvd(0)
+{
+  d_nmsgs_to_recv = pmt_to_long(pmt_nth(0, user_arg));
+  d_batch_size    = pmt_to_long(pmt_nth(1, user_arg));
+  d_expected_mask = pmt_to_long(pmt_nth(2, user_arg));
+
+  if (d_nmsgs_to_recv > (long) MAX_MSGS)
+    throw std::out_of_range("qa_bitset_sink: nmsgs_to_recv is too big");
+
+  if (d_batch_size < 1)
+    throw std::out_of_range("qa_bitset_sink: batch_size must be >= 1");
+
+  d_cs0 = define_port("cs0", "qa-bitset-cs", true, mb_port::EXTERNAL);
+  d_cs1 = define_port("cs1", "qa-bitset-cs", true, mb_port::EXTERNAL);
+  d_cs2 = define_port("cs2", "qa-bitset-cs", true, mb_port::EXTERNAL);
+  d_cs3 = define_port("cs3", "qa-bitset-cs", true, mb_port::EXTERNAL);
+
+  d_in0 = define_port("in0", "qa-bitset", false, mb_port::EXTERNAL);
+  d_in1 = define_port("in1", "qa-bitset", false, mb_port::EXTERNAL);
+  d_in2 = define_port("in2", "qa-bitset", false, mb_port::EXTERNAL);
+  d_in3 = define_port("in3", "qa-bitset", false, mb_port::EXTERNAL);
+}
+
+void
+qa_bitset_sink::handle_message(mb_message_sptr msg)
+{
+  if ((pmt_eq(msg->port_id(), d_in0->port_symbol())
+       || pmt_eq(msg->port_id(), d_in1->port_symbol())
+       || pmt_eq(msg->port_id(), d_in2->port_symbol())
+       || pmt_eq(msg->port_id(), d_in3->port_symbol()))
+      && pmt_eq(msg->signal(), s_data)){
+
+    receive_one(msg);
+  }
+}
+
+void
+qa_bitset_sink::receive_one(mb_message_sptr msg)
+{
+  long msg_number = pmt_to_long(pmt_car(msg->data()));
+  uint32_t mask = pmt_to_long(pmt_cdr(msg->data()));
+
+  // std::cout << msg->data() << std::endl;
+
+  d_nrecvd++;
+  if (d_nrecvd % d_batch_size == d_batch_size - 1){
+    d_cs0->send(s_send_batch);
+    d_cs1->send(s_send_batch);
+    d_cs2->send(s_send_batch);
+    d_cs3->send(s_send_batch);
+  }
+
+  if (msg_number >= d_nmsgs_to_recv){
+    std::cerr << "qa_bitset_sink::receive_one: msg_number too big ("
+             << msg_number << ")\n";
+    shutdown_all(PMT_F);
+    return;
+  }
+  if (mask != d_expected_mask){
+    fprintf(stderr,
+           "qa_bitset_sink::receive_one: Wrong mask.  Expected 0x%08x, got 
0x%08x\n",
+           d_expected_mask, mask);
+    shutdown_all(PMT_F);
+    return;
+  }
+
+  if (d_bitset.test((size_t) msg_number)){
+    std::cerr << "qa_bitset_sink::receive_one: duplicate msg_number ("
+             << msg_number << ")\n";
+    shutdown_all(PMT_F);
+    return;
+  }
+
+  d_bitset.set((size_t) msg_number);
+  if (d_nrecvd == d_nmsgs_to_recv)
+    shutdown_all(PMT_T);               // we're done!
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset_sink);
+
+// ------------------------------------------------------------------------
+
+class qa_bitset_top : public mb_mblock
+{
+  mb_port_sptr         d_cs0;
+  
+  long                 d_nmsgs;         // # of messages to send
+  long                 d_batch_size;    // # of messages to receive per batch
+
+public:
+  qa_bitset_top(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+  void initial_transition();
+};
+
+qa_bitset_top::qa_bitset_top(mb_runtime *runtime,
+                            const std::string &instance_name, pmt_t user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  d_nmsgs      = pmt_to_long(pmt_nth(0, user_arg));
+  d_batch_size = pmt_to_long(pmt_nth(1, user_arg));
+
+  d_cs0 = define_port("cs0", "qa-bitset-cs", false, mb_port::INTERNAL);
+  
+  // source of test messages
+  define_component("src0", "qa_bitset_src",
+                  pmt_list3(pmt_from_long(0),
+                            pmt_from_long(d_nmsgs),
+                            pmt_from_long(d_batch_size)));
+
+  // 32-mblock processing pipeline
+  define_component("pipeline", "qa_bitset32", pmt_from_long(0));
+
+  // sink for output of pipeline
+  define_component("sink", "qa_bitset_sink",
+                  pmt_list3(pmt_from_long(d_nmsgs),
+                            pmt_from_long(d_batch_size),
+                            pmt_from_long(0xffffffff)));
+
+  connect("self", "cs0", "src0", "cs_top");
+  connect("src0", "out", "pipeline", "in");
+  connect("src0", "cs", "sink", "cs0");
+  connect("pipeline", "out", "sink", "in0");
+}
+
+void
+qa_bitset_top::initial_transition()
+{
+  d_cs0->send(s_send_batch);   // prime the pump
+  d_cs0->send(s_send_batch);
+}
+
+REGISTER_MBLOCK_CLASS(qa_bitset_top);

Copied: gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.mbh 
(from rev 4965, 
gnuradio/branches/developers/eb/ibu/mblock/src/lib/qa_bitset.mbh)
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.mbh          
                (rev 0)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/qa_bitset.mbh  
2007-04-12 05:27:09 UTC (rev 4966)
@@ -0,0 +1,42 @@
+;; -*- scheme -*- ; not really, but tells emacs how to format this
+;;
+;; Copyright 2007 Free Software Foundation, Inc.
+;; 
+;; This file is part of GNU Radio
+;; 
+;; GNU Radio is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+;; 
+;; GNU Radio is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;; 
+;; You should have received a copy of the GNU General Public License along
+;; with this program; if not, write to the Free Software Foundation, Inc.,
+;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+;;
+
+;; ----------------------------------------------------------------
+;; qa-bitset -- interface to mblock QA code
+;;
+
+(define-protocol-class qa-bitset
+
+  (:incoming
+
+   (data n bitmask)
+
+   )
+  )
+
+(define-protocol-class qa-bitset-cs
+
+  (:outgoing
+
+   (send-batch)
+
+   )
+  )

Modified: gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.cc
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.cc       
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.cc       
2007-04-12 05:27:09 UTC (rev 4966)
@@ -38,6 +38,7 @@
 #include <mb_class_registry.h>
 #include <stdio.h>
 #include <string.h>
+#include <iostream>
 
 
 static pmt_t s_data    = pmt_intern("data");
@@ -66,7 +67,7 @@
 class sys_1 : public mb_mblock
 {
   pmt_t                d_user_arg;
-  mb_port_sptr p_data;
+  mb_port_sptr d_data;
 
 public:
   sys_1(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
@@ -78,7 +79,7 @@
   : mb_mblock(runtime, instance_name, user_arg),
     d_user_arg(user_arg)
 {
-  p_data = define_port("data", "data", true, mb_port::EXTERNAL);
+  d_data = define_port("data", "data", true, mb_port::EXTERNAL);
 }
 
 sys_1::~sys_1(){}
@@ -123,14 +124,129 @@
   CPPUNIT_ASSERT(pmt_equal(n2, result));
 }
 
+// ================================================================
+//                       test_sys_2
+// ================================================================
 
+class squarer : public mb_mblock
+{
+  mb_port_sptr d_data;
+
+public:
+  squarer(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg);
+
+  void handle_message(mb_message_sptr msg);
+};
+
+squarer::squarer(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  d_data = define_port("data", "data", true, mb_port::EXTERNAL);
+}
+
 void
+squarer::handle_message(mb_message_sptr msg)
+{
+  if (!pmt_eq(msg->signal(), s_data))  // we only handle the "data" message
+    return;
+
+  // long x -> (long x . long (x * x))
+
+  pmt_t x_pmt = msg->data();
+  long x = pmt_to_long(x_pmt);
+  d_data->send(s_data, pmt_cons(x_pmt, pmt_from_long(x * x)));
+}
+
+REGISTER_MBLOCK_CLASS(squarer);
+
+// ----------------------------------------------------------------
+
+class sys_2 : public mb_mblock
+{
+  mb_port_sptr d_data;
+
+public:
+  sys_2(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
+  void initial_transition();
+  void handle_message(mb_message_sptr msg);
+};
+
+sys_2::sys_2(mb_runtime *runtime, const std::string &instance_name, pmt_t 
user_arg)
+  : mb_mblock(runtime, instance_name, user_arg)
+{
+  d_data = define_port("data", "data", true, mb_port::INTERNAL);
+  define_component("squarer", "squarer");
+  connect("self", "data", "squarer", "data");
+}
+
+void
+sys_2::initial_transition()
+{
+  // FIXME start timer to detect general failure
+
+  d_data->send(s_data, pmt_from_long(0)); // send initial message
+}
+
+void
+sys_2::handle_message(mb_message_sptr msg)
+{
+  if (!pmt_eq(msg->signal(), s_data))  // we only handle the "data" message
+    return;
+
+  // first check correctness of message
+
+  long x = pmt_to_long(pmt_car(msg->data()));
+  long y = pmt_to_long(pmt_cdr(msg->data()));
+
+  // std::cout << msg->data() << std::endl;
+
+  if (y != x * x){
+    std::cerr << "sys_2::handle_message: Expected y == x * x.  Got y = "
+             << y << " for x = " << x << std::endl;
+
+    shutdown_all(PMT_F);       // failed
+  }
+
+  if (x == 100)
+    shutdown_all(PMT_T);                       // done, OK
+  else 
+    d_data->send(s_data, pmt_from_long(x + 1));        // send next request
+}
+
+REGISTER_MBLOCK_CLASS(sys_2);
+
+// ----------------------------------------------------------------
+
+void
 qa_mblock_sys::test_sys_2()
 {
+  mb_runtime_sptr rt = mb_make_runtime();
+  pmt_t result = PMT_NIL;
+
+  // std::cerr << "qa_mblock_sys::test_sys_2 (enter)\n";
+  
+  rt->run("top-sys-2", "sys_2", PMT_F, &result);
+  CPPUNIT_ASSERT(pmt_equal(PMT_T, result));
 }
 
+// ================================================================
+//                       test_bitset_1
+// ================================================================
+
 void
-qa_mblock_sys::test_sys_3()
+qa_mblock_sys::test_bitset_1()
 {
+  mb_runtime_sptr rt = mb_make_runtime();
+  pmt_t result = PMT_NIL;
+
+  long nmsgs =        1000;
+  long batch_size =      8;
+  
+  pmt_t arg = pmt_list2(pmt_from_long(nmsgs),  // # of messages to send 
through pipe
+                       pmt_from_long(batch_size));
+
+  rt->run("top", "qa_bitset_top", arg, &result);
+
+  CPPUNIT_ASSERT(pmt_equal(PMT_T, result));
 }
 

Modified: gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.h
===================================================================
--- gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.h        
2007-04-12 05:14:57 UTC (rev 4965)
+++ gnuradio/branches/features/inband-usb/mblock/src/lib/qa_mblock_sys.h        
2007-04-12 05:27:09 UTC (rev 4966)
@@ -30,13 +30,13 @@
   CPPUNIT_TEST_SUITE(qa_mblock_sys);
   CPPUNIT_TEST(test_sys_1);
   CPPUNIT_TEST(test_sys_2);
-  CPPUNIT_TEST(test_sys_3);
+  CPPUNIT_TEST(test_bitset_1);
   CPPUNIT_TEST_SUITE_END();
 
  private:
   void test_sys_1();
   void test_sys_2();
-  void test_sys_3();
+  void test_bitset_1();
 };
 
 #endif /* INCLUDED_QA_MBLOCK_SYS_H */





reply via email to

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