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:
parent
eac9055c92
commit
847c8cccd9
|
@ -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>(); }
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue