3 * Copyright 2008,2009 Free Software Foundation, Inc.
5 * This file is part of GNU Radio
7 * GNU Radio is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3, or (at your option)
12 * GNU Radio is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <gr_tpb_thread_body.h>
26 #include <boost/thread.hpp>
27 #include <gruel/pmt.h>
31 gr_tpb_thread_body::gr_tpb_thread_body(gr_block_sptr block)
34 // std::cerr << "gr_tpb_thread_body: " << block << std::endl;
36 gr_block_detail *d = block->detail().get();
37 gr_block_executor::state s;
42 boost::this_thread::interruption_point();
44 // handle any queued up messages
45 while ((msg = d->d_tpb.delete_head_nowait()))
46 block->handle_msg(msg);
48 d->d_tpb.clear_changed();
49 s = d_exec.run_one_iteration();
52 case gr_block_executor::READY: // Tell neighbors we made progress.
53 d->d_tpb.notify_neighbors(d);
56 case gr_block_executor::READY_NO_OUTPUT: // Notify upstream only
57 d->d_tpb.notify_upstream(d);
60 case gr_block_executor::DONE: // Game over.
61 d->d_tpb.notify_neighbors(d);
64 case gr_block_executor::BLKD_IN: // Wait for input.
66 gruel::scoped_lock guard(d->d_tpb.mutex);
67 while (!d->d_tpb.input_changed){
69 // wait for input or message
70 while(!d->d_tpb.input_changed && d->d_tpb.empty_p())
71 d->d_tpb.input_cond.wait(guard);
73 // handle all pending messages
74 while ((msg = d->d_tpb.delete_head_nowait_already_holding_mutex())){
75 guard.unlock(); // release lock while processing msg
76 block->handle_msg(msg);
84 case gr_block_executor::BLKD_OUT: // Wait for output buffer space.
86 gruel::scoped_lock guard(d->d_tpb.mutex);
87 while (!d->d_tpb.output_changed){
89 // wait for output room or message
90 while(!d->d_tpb.output_changed && d->d_tpb.empty_p())
91 d->d_tpb.output_cond.wait(guard);
93 // handle all pending messages
94 while ((msg = d->d_tpb.delete_head_nowait_already_holding_mutex())){
95 guard.unlock(); // release lock while processing msg
96 block->handle_msg(msg);
109 gr_tpb_thread_body::~gr_tpb_thread_body()