Add 'Timer::Session::elapsed_ms' function

This function allows a timer-session client to request a wall-clock
time value from the timer.
This commit is contained in:
Norman Feske 2012-07-25 13:59:50 +02:00
parent eac9055c92
commit 847c8cccd9
3 changed files with 31 additions and 4 deletions

View File

@ -25,6 +25,8 @@ namespace Timer {
: Genode::Rpc_client<Session>(session) { }
void msleep(unsigned ms) { call<Rpc_msleep>(ms); }
unsigned long elapsed_ms() const { return call<Rpc_elapsed_ms>(); }
};
}

View File

@ -29,14 +29,26 @@ namespace Timer {
*/
virtual void msleep(unsigned ms) = 0;
/**
* Return number of elapsed milliseconds since session creation
*/
virtual unsigned long elapsed_ms() const
{
/*
* XXX Remove default implementation by implementing the
* interface in all timer variants.
*/
return 0; }
/*********************
** RPC declaration **
*********************/
GENODE_RPC(Rpc_msleep, void, msleep, unsigned);
GENODE_RPC(Rpc_elapsed_ms, unsigned long, elapsed_ms);
GENODE_RPC_INTERFACE(Rpc_msleep);
GENODE_RPC_INTERFACE(Rpc_msleep, Rpc_elapsed_ms);
};
}

View File

@ -18,10 +18,12 @@
/* Genode includes */
#include <base/rpc_server.h>
#include <timer_session/capability.h>
#include <os/attached_rom_dataspace.h>
/* Fiasco.OC includes */
namespace Fiasco {
#include <l4/sys/ipc.h>
#include <l4/sys/kip.h>
}
@ -63,8 +65,11 @@ namespace Timer {
{
private:
Genode::Rpc_entrypoint _entrypoint;
Session_capability _session_cap;
Genode::Rpc_entrypoint _entrypoint;
Session_capability _session_cap;
Genode::Attached_rom_dataspace _kip_ds;
Fiasco::l4_kernel_info_t * const _kip;
Fiasco::l4_cpu_time_t const _initial_clock_value;
public:
@ -74,7 +79,10 @@ namespace Timer {
Session_component(Genode::Cap_session *cap)
:
_entrypoint(cap, STACK_SIZE, "timer_session_ep"),
_session_cap(_entrypoint.manage(this))
_session_cap(_entrypoint.manage(this)),
_kip_ds("l4v2_kip"),
_kip(_kip_ds.local_addr<Fiasco::l4_kernel_info_t>()),
_initial_clock_value(_kip->clock)
{ }
/**
@ -109,6 +117,11 @@ namespace Timer {
l4_ipc_sleep(l4_timeout(L4_IPC_TIMEOUT_NEVER, mus_to_timeout(1000*ms)));
}
unsigned long elapsed_ms() const
{
return (_kip->clock - _initial_clock_value) / 1000;
}
};
}