discuss-gnuradio
[Top][All Lists]
Advanced

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

[Discuss-gnuradio] FG probe generation of thread.start() race conditions


From: James Shimer
Subject: [Discuss-gnuradio] FG probe generation of thread.start() race conditions (python tutorials)
Date: Wed, 29 Mar 2017 17:22:03 +0000

Sorry if this is a duplicate/newbie question (didn't find anything searching).  When going thru the python examples.  I came across a race condition where the thread would start to run prior to object's constructor completing.  The fix is to manually move the code generated for starting the probe thread to the very end of the constructor.


If this "bug" is open already thanks for your time, if not here are some more details:


Tutorial 3, section 3.1.5, you're asked to modify the probe thread to reference members of the class to set_ampl and set_freq, those functions in-turn access members of the object, which may not have been initialized yet because the thread runs while the constructor is still running.

https://wiki.gnuradio.org/index.php/Guided_Tutorial_GNU_Radio_in_Python

The symptom:

Exception in thread Thread-1:

Traceback (most recent call last):

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 801, in __bootstrap_inner

    self.run()

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 754, in run

    self.__target(*self.__args, **self.__kwargs)

  File "power.py", line 95, in _variable_function_probe_0_probe

    self.set_ampl(0.3)

  File "power.py", line 174, in set_ampl

    self.analog_sig_source_x_0.set_amplitude(self.ampl)

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/hier_block2.py", line 92, in __getattr__

    return getattr(self._impl, name)

AttributeError: 'top_block_sptr' object has no attribute 'analog_sig_source_x_0'


The resolution:

diff -rupN if_else.py if_else2.py 

--- if_else.py 2017-03-29 13:20:32.000000000 -0400

+++ if_else2.py 2017-03-29 13:19:37.000000000 -0400

@@ -101,7 +101,6 @@ class if_else(gr.top_block, Qt.QWidget):

                 time.sleep(1.0 / (10))

         _variable_function_probe_0_thread = threading.Thread(target=_variable_function_probe_0_probe)

         _variable_function_probe_0_thread.daemon = True

-        _variable_function_probe_0_thread.start()

 

         self.qtgui_time_sink_x_0 = qtgui.time_sink_f(

         1024, #size

@@ -160,6 +159,7 @@ class if_else(gr.top_block, Qt.QWidget):

         self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0))

         self.connect((self.analog_sig_source_x_1, 0), (self.qtgui_time_sink_x_0, 0))

         self.connect((self.blocks_throttle_0, 0), (self.probe, 0))

+        _variable_function_probe_0_thread.start()

 

     def closeEvent(self, event):

         self.settings = Qt.QSettings("GNU Radio", "if_else")



Thanks


reply via email to

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