10# include <click/simclick.h>
14#define CLICK_DEBUG_MASTER 0
28 inline void unpause();
29 bool paused()
const {
return _master_paused > 0; }
31 inline int nthreads()
const;
36 int add_signal_handler(
int signo,
Router *router,
String handler);
37 int remove_signal_handler(
int signo,
Router *router,
String handler);
39 static void signal_handler(
int signo);
45 void initialize_ns(simclick_node_t *simnode);
46 simclick_node_t *simnode()
const {
return _simnode; }
49#if CLICK_DEBUG_MASTER || CLICK_DEBUG_SCHEDULING
54 static volatile sig_atomic_t signals_pending;
66 void register_router(
Router*);
67 void prepare_router(
Router*);
68 void run_router(
Router*,
bool foreground);
69 void unregister_router(
Router*);
72 spinlock_t _master_lock;
73 struct task_struct *_master_lock_task;
74 int _master_lock_count;
79 inline void lock_master();
80 inline void unlock_master();
92 SignalInfo(
int signo_,
Router *router_,
const String &handler_)
93 : signo(signo_), router(router_), handler(handler_), next() {
95 bool equals(
int signo_,
Router *router_,
const String &handler_)
const {
96 return signo == signo_ && router == router_ && handler == handler_;
100 sigset_t _sig_dispatching;
105 simclick_node_t *_simnode;
108 Master(
const Master&);
109 Master& operator=(
const Master&);
117Master::nthreads()
const
119 return _nthreads - 1;
123Master::thread(
int id)
const
127 if (
unsigned(
id + 1) <
unsigned(_nthreads))
128 return _threads[
id + 1];
134Master::wake_somebody()
141RouterThread::run_signals()
143 if (Master::signals_pending)
144 _master->process_signals(
this);
148TimerSet::next_timer_delay(
bool more_tasks,
Timestamp &t)
const
152 (void) more_tasks, (
void) t;
155 if (more_tasks || Master::signals_pending)
157 t = timer_expiry_steady_adjusted();
160#if TIMESTAMP_WARPABLE
161 else if (unlikely(Timestamp::warp_jumping())) {
162 Timestamp::warp_jump_steady(t);
167#if TIMESTAMP_WARPABLE
168 t = t.warp_real_delay();
178Master::request_stop()
180 for (
RouterThread **t = _threads; t != _threads + _nthreads; ++t)
181 (*t)->_stop_flag =
true;
190 if (current != _master_lock_task) {
191 spin_lock(&_master_lock);
192 _master_lock_task = current;
194 _master_lock_count++;
195#elif HAVE_MULTITHREAD
196 _master_lock.acquire();
201Master::unlock_master()
204 assert(current == _master_lock_task);
205 if (_master_lock_count == 0) {
206 _master_lock_task = 0;
207 spin_unlock(&_master_lock);
209 _master_lock_count--;
210#elif HAVE_MULTITHREAD
211 _master_lock.release();
An atomic 32-bit integer.
Master * master() const
Return the element's master.
Definition master.hh:222
A router configuration.
Definition router.hh:28
Master * master() const
Return the Master object for this router.
Definition router.hh:591
A set of Tasks scheduled on the same CPU.
Definition routerthread.hh:32
A recursive spinlock for SMP Click threads.
Definition sync.hh:439
A string of characters.
Definition string.hh:22
Represents a frequently-scheduled computational task.
Definition task.hh:49
Represents a moment or interval in time.
Definition timestamp.hh:125
static Timestamp now_steady()
Return the current steady-clock time.
Definition timestamp.hh:986
bool is_negative() const
Test if this Timestamp is negative (< Timestamp(0, 0)).
Definition timestamp.hh:228
A 32-bit integer with support for atomic operations.
Definition atomic.hh:71
The Router class implementing a router configuration.