genode/os/include/timer_session/timer_session.h
Stefan Kalkowski 4254cb04e1 Reduce IPC with timer service in timed semaphore
Instead of using msleep to sleep periodically, and then increase jiffies
counter in the alarm scheduler implementation of the timed semaphore
use the 'trigger_periodic' call introduced by the change of the timer session
interface into an asynchronous one. Thereby, we can reduce the necessary IPC
communication with the timer service effectively.

Ref #35
2013-08-30 13:38:21 +02:00

83 lines
2.0 KiB
C++

/*
* \brief Timer session interface
* \author Norman Feske
* \author Markus Partheymueller
* \date 2006-08-15
*/
/*
* Copyright (C) 2006-2013 Genode Labs GmbH
* Copyright (C) 2012 Intel Corporation
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__TIMER_SESSION__TIMER_SESSION_H_
#define _INCLUDE__TIMER_SESSION__TIMER_SESSION_H_
#include <base/signal.h>
#include <session/session.h>
namespace Timer {
using namespace Genode;
struct Session : Genode::Session
{
static const char *service_name() { return "Timer"; }
virtual ~Session() { }
/**
* Program single timeout (relative from now in microseconds)
*/
virtual void trigger_once(unsigned us) = 0;
/**
* Program periodic timeout (in microseconds)
*
* The first period will be triggered after 'us' at the latest,
* but it might be triggered earlier as well.
*/
virtual void trigger_periodic(unsigned us) = 0;
/**
* Register timeout signal handler
*/
virtual void sigh(Signal_context_capability sigh) = 0;
/**
* Return number of elapsed milliseconds since session creation
*/
virtual unsigned long elapsed_ms() const = 0;
/**
* Client-side convenience function for sleeping the specified number
* of milliseconds
*/
virtual void msleep(unsigned ms) = 0;
/**
* Client-side convenience function for sleeping the specified number
* of microseconds
*/
virtual void usleep(unsigned us) = 0;
/*********************
** RPC declaration **
*********************/
GENODE_RPC(Rpc_trigger_once, void, trigger_once, unsigned);
GENODE_RPC(Rpc_trigger_periodic, void, trigger_periodic, unsigned);
GENODE_RPC(Rpc_sigh, void, sigh, Genode::Signal_context_capability);
GENODE_RPC(Rpc_elapsed_ms, unsigned long, elapsed_ms);
GENODE_RPC_INTERFACE(Rpc_trigger_once, Rpc_trigger_periodic,
Rpc_sigh, Rpc_elapsed_ms);
};
}
#endif /* _INCLUDE__TIMER_SESSION__TIMER_SESSION_H_ */