1 /*
2 * \brief Root interface
3 * \author Norman Feske
4 * \date 2006-05-11
5 */
6
7 /*
8 * Copyright (C) 2006-2013 Genode Labs GmbH
9 *
10 * This file is part of the Genode OS framework, which is distributed
11 * under the terms of the GNU General Public License version 2.
12 */
13
14 #ifndef _INCLUDE__ROOT__ROOT_H_
15 #define _INCLUDE__ROOT__ROOT_H_
16
17 #include <base/exception.h>
18 #include <base/rpc.h>
19 #include <base/rpc_args.h>
20 #include <base/affinity.h>
21 #include <session/capability.h>
22
23 namespace Genode {
24
25 struct Root;
26 template <typename> struct Typed_root;
27 }
28
29
30 struct Genode::Root
31 {
32 /*********************
33 ** Exception types **
34 *********************/
35
36 class Exception : public ::Genode::Exception { };
37 class Unavailable : public Exception { };
38 class Quota_exceeded : public Exception { };
39 class Invalid_args : public Exception { };
40
41 typedef Rpc_in_buffer<160> Session_args;
42 typedef Rpc_in_buffer<160> Upgrade_args;
43
44 virtual ~Root() { }
45
46 /**
47 * Create session
48 *
49 * \throw Unavailable
50 * \throw Quota_exceeded
51 * \throw Invalid_args
52 *
53 * \return capability to new session
54 */
55 virtual Session_capability session(Session_args const &args,
56 Affinity const &affinity) = 0;
57
58 /**
59 * Extend resource donation to an existing session
60 */
61 virtual void upgrade(Session_capability session, Upgrade_args const &args) = 0;
62
63 /**
64 * Close session
65 */
66 virtual void close(Session_capability session) = 0;
67
68
69 /*********************
70 ** RPC declaration **
71 *********************/
72
73 GENODE_RPC_THROW(Rpc_session, Session_capability, session,
74 GENODE_TYPE_LIST(Unavailable, Quota_exceeded, Invalid_args),
75 Session_args const &, Affinity const &);
76 GENODE_RPC_THROW(Rpc_upgrade, void, upgrade,
77 GENODE_TYPE_LIST(Invalid_args),
78 Session_capability, Upgrade_args const &);
79 GENODE_RPC(Rpc_close, void, close, Session_capability);
80
81 GENODE_RPC_INTERFACE(Rpc_session, Rpc_upgrade, Rpc_close);
82 };
83
84
85 /**
86 * Root interface supplemented with information about the managed
87 * session type
88 *
89 * This class template is used to automatically propagate the
90 * correct session type to `Parent::announce()` when announcing
91 * a service.
92 */
93 template <typename SESSION_TYPE>
94 struct Genode::Typed_root : Root
95 {
96 typedef SESSION_TYPE Session_type;
97 };
98
99 #endif /* _INCLUDE__ROOT__ROOT_H_ */