Python message passing block hangs (test file included)

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

On Thu, Mar 12, 2015 at 5:00 PM, Anderson, Douglas J. <
[email protected]> wrote:

gr.sync_block.__init__(self, name="sink", in_sig=[np.float32],

Then I have a gr.unittest case that connects a vector_source, the copy

The second time the flowgraph is “run”, it hangs indefinitely. GDB shows
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

Hi Doug,

What version of GNU Radio are you running (gnuradio-config-info -v)? I
just
tested your test.py script locally and it worked fine. We’ve put in a
patch
for the shutdown system that I think it’s related to your problem, but
it
has not been in a version release, yet. The patch is pretty simple:

commit 035b9d016dffefec890323bd0b24dbaf23aa9186
Author: Tom R. [email protected]
Date: Wed Feb 4 13:06:14 2015 +0000

runtime: possible bug fix for limited-run flowgraphs with 

message-only
blocks.

diff --git a/gnuradio-runtime/lib/block.cc
b/gnuradio-runtime/lib/block.cc
index 9173094…f26d6bb 100644
— a/gnuradio-runtime/lib/block.cc
+++ b/gnuradio-runtime/lib/block.cc
@@ -750,7 +750,10 @@ namespace gr {
bool
block::finished()
{

  • return d_finished;
  • if((detail()->ninputs() != 0) || (detail()->noutputs() != 0))
  •  return false;
    
  • else
  •  return d_finished;
    
    }

If you want to give that a try, I’m interested to hear feedback on this
problem and solution.

Thanks,
Tom

Tom,

Ironically I was using a GNU Radio git build from Feb 3rd, the day
before that patch was merged. I just rebuilt and verified that the test
case I attached works now.

Thanks!
-Doug


From: [email protected] [[email protected]] on behalf of Tom
Rondeau [[email protected]]
Sent: Sunday, March 15, 2015 2:09 PM
To: Anderson, Douglas J.
Cc: GNURadio D.ion List
Subject: Re: [Discuss-gnuradio] Python message passing block hangs (test
file included)

On Thu, Mar 12, 2015 at 5:00 PM, Anderson, Douglas J.
<[email protected]mailto:[email protected]> wrote:
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

Hi Doug,

What version of GNU Radio are you running (gnuradio-config-info -v)? I
just tested your test.py script locally and it worked fine. We’ve put in
a patch for the shutdown system that I think it’s related to your
problem, but it has not been in a version release, yet. The patch is
pretty simple:

commit 035b9d016dffefec890323bd0b24dbaf23aa9186
Author: Tom R. <[email protected]mailto:[email protected]>
Date: Wed Feb 4 13:06:14 2015 +0000

runtime: possible bug fix for limited-run flowgraphs with 

message-only blocks.

diff --git a/gnuradio-runtime/lib/block.cc
b/gnuradio-runtime/lib/block.cc
index 9173094…f26d6bb 100644
— a/gnuradio-runtime/lib/block.cc
+++ b/gnuradio-runtime/lib/block.cc
@@ -750,7 +750,10 @@ namespace gr {
bool
block::finished()
{

  • return d_finished;
  • if((detail()->ninputs() != 0) || (detail()->noutputs() != 0))
  •  return false;
    
  • else
  •  return d_finished;
    
    }

If you want to give that a try, I’m interested to hear feedback on this
problem and solution.

Thanks,
Tom