Consolidate timer connections at Init
This commit is contained in:
parent
22164d72e6
commit
8f19fa4143
|
@ -28,17 +28,17 @@ class Init::Heartbeat : Genode::Noncopyable
|
|||
|
||||
Env &_env;
|
||||
|
||||
Genode::Timeout_scheduler &_timer;
|
||||
|
||||
Child_registry &_children;
|
||||
|
||||
Report_update_trigger &_report_update_trigger;
|
||||
|
||||
Constructible<Timer::Connection> _timer { };
|
||||
|
||||
uint64_t _rate_ms = 0;
|
||||
|
||||
Signal_handler<Heartbeat> _timer_handler;
|
||||
Constructible<Timer::Periodic_timeout<Heartbeat>> _timer_handler { };
|
||||
|
||||
void _handle_timer()
|
||||
void _handle_timer(Genode::Duration)
|
||||
{
|
||||
bool any_skipped_heartbeats = false;
|
||||
|
||||
|
@ -56,22 +56,22 @@ class Init::Heartbeat : Genode::Noncopyable
|
|||
|
||||
public:
|
||||
|
||||
Heartbeat(Env &env, Child_registry &children,
|
||||
Heartbeat(Env &env, Genode::Timeout_scheduler &timer,
|
||||
Child_registry &children,
|
||||
Report_update_trigger &report_update_trigger)
|
||||
:
|
||||
_env(env), _children(children),
|
||||
_report_update_trigger(report_update_trigger),
|
||||
_timer_handler(_env.ep(), *this, &Heartbeat::_handle_timer)
|
||||
_env(env), _timer(timer), _children(children),
|
||||
_report_update_trigger(report_update_trigger)
|
||||
{ }
|
||||
|
||||
void apply_config(Xml_node config)
|
||||
{
|
||||
bool const enabled = config.has_sub_node("heartbeat");
|
||||
|
||||
_timer.conditional(enabled, _env);
|
||||
|
||||
if (!enabled) {
|
||||
_rate_ms = 0;
|
||||
if (_timer_handler.constructed())
|
||||
_timer_handler.destruct();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -79,9 +79,13 @@ class Init::Heartbeat : Genode::Noncopyable
|
|||
config.sub_node("heartbeat").attribute_value("rate_ms", 1000UL);
|
||||
|
||||
if (rate_ms != _rate_ms) {
|
||||
if (_timer_handler.constructed())
|
||||
_timer_handler.destruct();
|
||||
|
||||
_rate_ms = rate_ms;
|
||||
_timer->sigh(_timer_handler);
|
||||
_timer->trigger_periodic(_rate_ms*1000);
|
||||
_timer_handler.construct(
|
||||
_timer, *this, &Heartbeat::_handle_timer,
|
||||
Microseconds{_rate_ms*1000});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -34,6 +34,8 @@ struct Init::Main : State_reporter::Producer,
|
|||
Registry<Routed_service> _child_services { };
|
||||
Child_registry _children { };
|
||||
|
||||
Timer::Connection _timer { _env };
|
||||
|
||||
Heap _heap { _env.ram(), _env.rm() };
|
||||
|
||||
Attached_rom_dataspace _config { _env, "config" };
|
||||
|
@ -138,9 +140,9 @@ struct Init::Main : State_reporter::Producer,
|
|||
*/
|
||||
Cap_quota default_caps() override { return _default_caps; }
|
||||
|
||||
State_reporter _state_reporter { _env, *this };
|
||||
State_reporter _state_reporter { _env, _timer, *this };
|
||||
|
||||
Heartbeat _heartbeat { _env, _children, _state_reporter };
|
||||
Heartbeat _heartbeat { _env, _timer, _children, _state_reporter };
|
||||
|
||||
Signal_handler<Main> _resource_avail_handler {
|
||||
_env.ep(), *this, &Main::_handle_resource_avail };
|
||||
|
|
|
@ -37,6 +37,8 @@ class Init::State_reporter : public Report_update_trigger
|
|||
|
||||
Env &_env;
|
||||
|
||||
Genode::Timeout_scheduler &_timer;
|
||||
|
||||
Producer &_producer;
|
||||
|
||||
Constructible<Reporter> _reporter { };
|
||||
|
@ -54,24 +56,13 @@ class Init::State_reporter : public Report_update_trigger
|
|||
typedef String<64> Version;
|
||||
Version _version { };
|
||||
|
||||
Constructible<Timer::Connection> _timer { };
|
||||
Constructible<Timer::Connection> _timer_periodic { };
|
||||
Constructible<Timer::Periodic_timeout<State_reporter>> _timer_periodic { };
|
||||
|
||||
Signal_handler<State_reporter> _timer_handler {
|
||||
_env.ep(), *this, &State_reporter::_handle_timer };
|
||||
Timer::One_shot_timeout<State_reporter> _timer_one_shot {
|
||||
_timer, *this, &State_reporter::_handle_timer };
|
||||
|
||||
Signal_handler<State_reporter> _timer_periodic_handler {
|
||||
_env.ep(), *this, &State_reporter::_handle_timer };
|
||||
|
||||
Signal_handler<State_reporter> _immediate_handler {
|
||||
_env.ep(), *this, &State_reporter::_handle_timer };
|
||||
|
||||
bool _scheduled = false;
|
||||
|
||||
void _handle_timer()
|
||||
void _handle_timer(Genode::Duration)
|
||||
{
|
||||
_scheduled = false;
|
||||
|
||||
try {
|
||||
Reporter::Xml_generator xml(*_reporter, [&] () {
|
||||
|
||||
|
@ -96,9 +87,9 @@ class Init::State_reporter : public Report_update_trigger
|
|||
|
||||
public:
|
||||
|
||||
State_reporter(Env &env, Producer &producer)
|
||||
State_reporter(Env &env, Genode::Timeout_scheduler &timer, Producer &producer)
|
||||
:
|
||||
_env(env), _producer(producer)
|
||||
_env(env), _timer(timer), _producer(producer)
|
||||
{ }
|
||||
|
||||
void apply_config(Xml_node config)
|
||||
|
@ -134,13 +125,8 @@ class Init::State_reporter : public Report_update_trigger
|
|||
trigger_update = true;
|
||||
}
|
||||
|
||||
if (_report_delay_ms) {
|
||||
if (!_timer.constructed()) {
|
||||
_timer.construct(_env);
|
||||
_timer->sigh(_timer_handler);
|
||||
}
|
||||
if (_report_delay_ms)
|
||||
trigger_update = true;
|
||||
}
|
||||
|
||||
if (trigger_update)
|
||||
trigger_report_update();
|
||||
|
@ -162,35 +148,28 @@ class Init::State_reporter : public Report_update_trigger
|
|||
bool const period_changed = (_report_period_ms != period_ms);
|
||||
bool const report_periodically = _report_detail->child_ram()
|
||||
|| _report_detail->child_caps();
|
||||
_report_period_ms = report_periodically ? period_ms : 0;
|
||||
|
||||
if ((!report_periodically || period_changed) && _timer_periodic.constructed())
|
||||
_timer_periodic.destruct();
|
||||
|
||||
if (report_periodically && !_timer_periodic.constructed()) {
|
||||
_timer_periodic.construct(_env);
|
||||
_timer_periodic->sigh(_timer_periodic_handler);
|
||||
}
|
||||
|
||||
if (!report_periodically && _timer_periodic.constructed()) {
|
||||
_report_period_ms = 0;
|
||||
_timer_periodic.destruct();
|
||||
}
|
||||
|
||||
if (period_changed && _timer_periodic.constructed()) {
|
||||
_report_period_ms = period_ms;
|
||||
_timer_periodic->trigger_periodic(1000*_report_period_ms);
|
||||
_timer_periodic.construct(
|
||||
_timer, *this, &State_reporter::_handle_timer,
|
||||
Genode::Microseconds(_report_period_ms * 1000));
|
||||
}
|
||||
}
|
||||
|
||||
void trigger_report_update() override
|
||||
{
|
||||
if (!_scheduled && _timer.constructed() && _report_delay_ms) {
|
||||
_timer->trigger_once(_report_delay_ms*1000);
|
||||
_scheduled = true;
|
||||
}
|
||||
if (_report_delay_ms && !_timer_one_shot.scheduled())
|
||||
_timer_one_shot.schedule(Genode::Microseconds{_report_delay_ms*1000});
|
||||
}
|
||||
|
||||
void trigger_immediate_report_update() override
|
||||
{
|
||||
if (_report_delay_ms)
|
||||
Signal_transmitter(_immediate_handler).submit();
|
||||
_timer_one_shot.schedule(Genode::Microseconds{_report_delay_ms*1000});
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user