mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-26 08:51:08 +00:00
6d837c9e26
This patch extends the 'Parent::session()' and 'Root::session()' functions with an additional 'affinity' parameter, which is inteded to express the preferred affinity of the new session. For CPU sessions provided by core, the values will be used to select the set of CPUs assigned to the CPU session. For other services, the session affinity information can be utilized to optimize the locality of the server thread with the client. For example, to enable the IRQ session to route an IRQ to the CPU core on which the corresponding device driver (the IRQ client) is running.
96 lines
2.3 KiB
C++
96 lines
2.3 KiB
C++
/*
|
|
* \brief Root interface
|
|
* \author Norman Feske
|
|
* \date 2006-05-11
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2006-2013 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.
|
|
*/
|
|
|
|
#ifndef _INCLUDE__ROOT__ROOT_H_
|
|
#define _INCLUDE__ROOT__ROOT_H_
|
|
|
|
#include <base/exception.h>
|
|
#include <base/rpc.h>
|
|
#include <base/rpc_args.h>
|
|
#include <base/affinity.h>
|
|
#include <session/capability.h>
|
|
|
|
namespace Genode {
|
|
|
|
struct Root
|
|
{
|
|
/*********************
|
|
** Exception types **
|
|
*********************/
|
|
|
|
class Exception : public ::Genode::Exception { };
|
|
class Unavailable : public Exception { };
|
|
class Quota_exceeded : public Exception { };
|
|
class Invalid_args : public Exception { };
|
|
|
|
typedef Rpc_in_buffer<160> Session_args;
|
|
typedef Rpc_in_buffer<160> Upgrade_args;
|
|
|
|
virtual ~Root() { }
|
|
|
|
/**
|
|
* Create session
|
|
*
|
|
* \throw Unavailable
|
|
* \throw Quota_exceeded
|
|
* \throw Invalid_args
|
|
*
|
|
* \return capability to new session
|
|
*/
|
|
virtual Session_capability session(Session_args const &args,
|
|
Affinity const &affinity) = 0;
|
|
|
|
/**
|
|
* Extend resource donation to an existing session
|
|
*/
|
|
virtual void upgrade(Session_capability session, Upgrade_args const &args) = 0;
|
|
|
|
/**
|
|
* Close session
|
|
*/
|
|
virtual void close(Session_capability session) = 0;
|
|
|
|
|
|
/*********************
|
|
** RPC declaration **
|
|
*********************/
|
|
|
|
GENODE_RPC_THROW(Rpc_session, Session_capability, session,
|
|
GENODE_TYPE_LIST(Unavailable, Quota_exceeded, Invalid_args),
|
|
Session_args const &, Affinity const &);
|
|
GENODE_RPC_THROW(Rpc_upgrade, void, upgrade,
|
|
GENODE_TYPE_LIST(Invalid_args),
|
|
Session_capability, Upgrade_args const &);
|
|
GENODE_RPC(Rpc_close, void, close, Session_capability);
|
|
|
|
GENODE_RPC_INTERFACE(Rpc_session, Rpc_upgrade, Rpc_close);
|
|
};
|
|
|
|
|
|
/**
|
|
* Root interface supplemented with information about the managed
|
|
* session type
|
|
*
|
|
* This class template is used to automatically propagate the
|
|
* correct session type to 'Parent::announce()' when announcing
|
|
* a service.
|
|
*/
|
|
template <typename SESSION_TYPE>
|
|
struct Typed_root : Root
|
|
{
|
|
typedef SESSION_TYPE Session_type;
|
|
};
|
|
}
|
|
|
|
#endif /* _INCLUDE__ROOT__ROOT_H_ */
|