Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / runtime / gr_runtime_impl.h @ f561a45c

History | View | Annotate | Download (2.7 kB)

1
/* -*- c++ -*- */
2
/*
3
 * Copyright 2006,2007 Free Software Foundation, Inc.
4
 * 
5
 * This file is part of GNU Radio
6
 * 
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)
10
 * any later version.
11
 * 
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.
16
 * 
17
 * You should have received a copy of the GNU General Public License
18
 * along with GNU Radio; see the file COPYING.  If not, write to
19
 * the Free Software Foundation, Inc., 51 Franklin Street,
20
 * Boston, MA 02110-1301, USA.
21
 */
22
23
#ifndef INCLUDED_GR_RUNTIME_IMPL_H
24
#define INCLUDED_GR_RUNTIME_IMPL_H
25
26
#include <gr_runtime_types.h>
27
#include <gr_block.h>
28
#include <omnithread.h>
29
#include <gr_single_threaded_scheduler.h>
30
31
// omnithread calls delete on itself after thread exits, so can't use shared ptr
32
class gr_scheduler_thread;
33
typedef std::vector<gr_scheduler_thread *> gr_scheduler_thread_vector_t;
34
typedef gr_scheduler_thread_vector_t::iterator gr_scheduler_thread_viter_t;
35
36
/*!
37
 *\brief A single thread of execution for the scheduler
38
 *
39
 * This class implements a single thread that runs undetached, and
40
 * invokes the single-threaded block scheduler.  The runtime makes
41
 * one of these for each distinct partition of a flowgraph and runs
42
 * them in parallel.
43
 *
44
 */
45
class gr_scheduler_thread : public omni_thread
46
{
47
private:
48
  gr_single_threaded_scheduler_sptr d_sts;    
49
50
public:
51
  gr_scheduler_thread(gr_block_vector_t graph);
52
  ~gr_scheduler_thread();
53
54
  virtual void *run_undetached(void *arg);
55
  void start();
56
  void stop();
57
};
58
59
/*!
60
 *\brief Implementation details of gr_runtime
61
 *
62
 * The actual implementation of gr_runtime. Separate class allows
63
 * decoupling of changes from dependent classes.
64
 *
65
 */
66
class gr_runtime_impl
67
{
68
private:
69
  gr_runtime_impl(gr_hier_block2_sptr top_block, gr_runtime *owner);
70
  friend void runtime_sigint_handler(int signum);
71
  friend class gr_runtime;
72
    
73
  bool                           d_running;
74
  gr_hier_block2_sptr            d_top_block;
75
  gr_flat_flowgraph_sptr         d_ffg;
76
  std::vector<gr_basic_block_vector_t> d_graphs;
77
  gr_scheduler_thread_vector_t   d_threads;
78
  gr_runtime                    *d_owner;
79
  int                            d_lock_count;
80
  omni_mutex                     d_reconf;
81
82
  void start();
83
  void start_threads();
84
  void stop();
85
  void wait();
86
  void restart();
87
  void lock();
88
  void unlock();
89
90
public:
91
  ~gr_runtime_impl();
92
93
};
94
95
#endif /* INCLUDED_GR_RUNTIME_IMPL_H */