Hi all,

I'm struggling to understand an issue I'm having with a simple python block 
with a registered message port connected to the copy block.

The python block looks like this: it literally does nothing, it just happens to 
have a message port registered:

class signal_sink(gr.sync_block):
  def __init__(self):
    gr.sync_block.__init__(self, name="sink", in_sig=[np.float32], out_sig=None)
    self.signal = pmt.from_bool(False)
    self.port_name = pmt.intern("sig")
    self.message_port_register_out(self.port_name)

def work(self, input_items, output_items):
    return len(input_items[0])

Then I have a gr.unittest case that connects a vector_source, the copy block, 
and the above signal sink:

def test_copy(self):
    src_data = np.arange(1000)
    src = blocks.vector_source_f(src_data)
    copy = blocks.copy(gr.sizeof_float)
    msg_debug = blocks.message_debug()
    sig_sink = signal_sink()
    self.tb.connect(src, copy, sig_sink)
    self.tb.msg_connect(sig_sink, "sig", copy, "en")

    # Run once (this run is successful)
    self.tb.run()

    # Run again (this run hangs)
    src.rewind()
    self.tb.run()

The second time the flowgraph is "run", it hangs indefinitely. GDB shows 
sig_sink's thread state as
#0 pthread_cond_timedwait@@GLIBC_2.3.2 ()
at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238

Commenting out the "self.tb.msg_connect" line stops the hang, as does 
connecting sig_sink's message port to a message_debug block (which is not in 
the flowgraph).

All this even though the sig_sink block doesn't send any signals over its 
message port.

Any hints would be very much appreciated, my debugging prowess has taken me as 
far as it's going to take me.

I've attached the complete test file that you can run with "python test.py"

Thanks in advance,
-Doug
import numpy as np

from gnuradio import gr, gr_unittest, blocks
import pmt


class signal_sink(gr.sync_block):
    def __init__(self):
        gr.sync_block.__init__(self, name="sink", in_sig=[np.float32], out_sig=None)

        self.signal = pmt.from_bool(False)
        self.port_name = pmt.intern("sig")
        self.message_port_register_out(self.port_name)

    def work(self, input_items, output_items):
        #self.message_port_pub(self.port_name, self.signal)
        return len(input_items[0])


class qa_msg_passing(gr_unittest.TestCase):
    def setUp(self):
        self.tb = gr.top_block()

    def tearDown(self):
        self.tb = None

    def test_copy(self):
        src_data = np.arange(1000)
        src = blocks.vector_source_f(src_data)
        copy = blocks.copy(gr.sizeof_float)
        msg_debug = blocks.message_debug()
        sig_sink = signal_sink()

        self.tb.connect(src, copy, sig_sink)
        self.tb.msg_connect(sig_sink, "sig", copy, "en")           # This causes problems
        #self.tb.msg_connect(sig_sink, "sig", msg_debug, "print")  # This does not

        # Run once (this run is successful)

        self.tb.run()

        # Run again (this run hangs)

        src.rewind()
        self.tb.start()
        print("Debug: 2nd top_block run started...")
        self.tb.wait()
        print("Debug: 2nd top_block run exited...")


if __name__ == '__main__':
    #import os
    #print("Blocked waiting for GDB attach (pid = {})".format(os.getpid()))
    #raw_input("Press Enter to continue...")
    gr_unittest.run(qa_msg_passing)
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to