mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-20 06:07:59 +00:00
Simple CPU-time burner application
This commit is contained in:
parent
503263a8a2
commit
8b013287ba
2
repos/os/src/app/cpu_burner/README
Normal file
2
repos/os/src/app/cpu_burner/README
Normal file
@ -0,0 +1,2 @@
|
||||
This directory contains a simple CPU burner. The percentage of CPU time to burn
|
||||
can be configured via its '<config>' attribute 'percent'.
|
97
repos/os/src/app/cpu_burner/main.cc
Normal file
97
repos/os/src/app/cpu_burner/main.cc
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* \brief CPU burner
|
||||
* \author Norman Feske
|
||||
* \date 2015-06-30
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2015 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
/* Genode includes */
|
||||
#include <os/config.h>
|
||||
#include <timer_session/connection.h>
|
||||
|
||||
struct Cpu_burner
|
||||
{
|
||||
Timer::Connection _timer;
|
||||
|
||||
unsigned long _percent = 100;
|
||||
|
||||
void _handle_config(unsigned)
|
||||
{
|
||||
Genode::config()->reload();
|
||||
|
||||
_percent = 100;
|
||||
try {
|
||||
Genode::config()->xml_node().attribute("percent").value(&_percent);
|
||||
} catch (...) { }
|
||||
}
|
||||
|
||||
Genode::Signal_dispatcher<Cpu_burner> _config_dispatcher;
|
||||
|
||||
unsigned _burn_per_iteration = 10;
|
||||
|
||||
void _handle_period(unsigned)
|
||||
{
|
||||
unsigned long const start_ms = _timer.elapsed_ms();
|
||||
|
||||
unsigned iterations = 0;
|
||||
for (;; iterations++) {
|
||||
|
||||
unsigned long const curr_ms = _timer.elapsed_ms();
|
||||
unsigned long passed_ms = curr_ms - start_ms;
|
||||
|
||||
if (passed_ms >= 10*_percent)
|
||||
break;
|
||||
|
||||
/* burn some time */
|
||||
for (unsigned volatile i = 0; i < _burn_per_iteration; i++)
|
||||
for (unsigned volatile j = 0; j < 1000*1000; j++)
|
||||
(void) (i*j);
|
||||
}
|
||||
|
||||
/* adjust busy loop duration */
|
||||
if (iterations > 10)
|
||||
_burn_per_iteration *= 2;
|
||||
|
||||
if (iterations < 5)
|
||||
_burn_per_iteration /= 2;
|
||||
}
|
||||
|
||||
Genode::Signal_dispatcher<Cpu_burner> _period_dispatcher;
|
||||
|
||||
Cpu_burner(Genode::Signal_receiver &sig_rec)
|
||||
:
|
||||
_config_dispatcher(sig_rec, *this, &Cpu_burner::_handle_config),
|
||||
_period_dispatcher(sig_rec, *this, &Cpu_burner::_handle_period)
|
||||
{
|
||||
Genode::config()->sigh(_config_dispatcher);
|
||||
_handle_config(0);
|
||||
|
||||
_timer.sigh(_period_dispatcher);
|
||||
_timer.trigger_periodic(1000*1000);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
||||
static Genode::Signal_receiver sig_rec;
|
||||
|
||||
static Cpu_burner cpu_burner(sig_rec);
|
||||
|
||||
while (1) {
|
||||
|
||||
Genode::Signal signal = sig_rec.wait_for_signal();
|
||||
|
||||
Genode::Signal_dispatcher_base *dispatcher =
|
||||
static_cast<Genode::Signal_dispatcher_base *>(signal.context());
|
||||
|
||||
dispatcher->dispatch(signal.num());
|
||||
}
|
||||
}
|
3
repos/os/src/app/cpu_burner/target.mk
Normal file
3
repos/os/src/app/cpu_burner/target.mk
Normal file
@ -0,0 +1,3 @@
|
||||
TARGET = cpu_burner
|
||||
SRC_CC = main.cc
|
||||
LIBS = base config
|
Loading…
Reference in New Issue
Block a user