summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/python/gnuradio/gr/scheduler.py
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src/python/gnuradio/gr/scheduler.py')
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/scheduler.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/gnuradio-core/src/python/gnuradio/gr/scheduler.py b/gnuradio-core/src/python/gnuradio/gr/scheduler.py
new file mode 100644
index 0000000000..919d07f0a4
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/scheduler.py
@@ -0,0 +1,70 @@
+#
+# Copyright 2004 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 GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+
+from gnuradio.gr.exceptions import *
+from gnuradio_swig_python import single_threaded_scheduler, sts_pyrun
+import gr_threading as _threading
+#import threading as _threading
+
+class scheduler_thread(_threading.Thread):
+ def __init__(self, sts):
+ _threading.Thread.__init__(self)
+ self.sts = sts
+ def run(self):
+ # Invoke the single threaded scheduler's run method
+ #
+ # Note that we're in a new thread, and that sts_pyrun
+ # releases the global interpreter lock. This has the
+ # effect of evaluating the graph in parallel to the
+ # main line control code.
+ sts_pyrun(self.sts)
+ self.sts = None
+
+class scheduler(object):
+ def __init__(self, fg):
+ graphs = fg.partition_graph(fg.blocks)
+ # print "@@@ # graphs = %d" % (len(graphs))
+
+ self.state = []
+
+ for g in graphs:
+ list_of_blocks = [x.block() for x in g]
+ sts = single_threaded_scheduler(list_of_blocks)
+ thread = scheduler_thread(sts)
+ thread.setDaemon(1)
+ self.state.append((sts, thread))
+
+ def start(self):
+ for (sts, thread) in self.state:
+ thread.start()
+
+ def stop(self):
+ for (sts, thread) in self.state:
+ sts.stop()
+ self.wait()
+
+ def wait(self):
+ for (sts, thread) in self.state:
+ timeout = 0.100
+ while True:
+ thread.join(timeout)
+ if not thread.isAlive():
+ break