Avoid use of uninitialized base class Genode::Connection

Remove legacy facade from Genode::Connection constructor.
This commit is contained in:
Ehmry - 2019-09-06 11:36:47 +02:00
parent 706774819a
commit 6a33b3f0ec
34 changed files with 111 additions and 197 deletions

View File

@ -45,14 +45,6 @@ class Genode::Connection_base : Noncopyable, Interface
_id_space_element(_parent_client, _env.id_space())
{ }
/**
* Legacy constructor
*
* \noapi
*/
Connection_base();
void upgrade(Session::Resources resources)
{
String<80> const args("ram_quota=", resources.ram_quota, ", "
@ -78,41 +70,41 @@ class Genode::Connection_base : Noncopyable, Interface
template <typename SESSION_TYPE>
class Genode::Connection : public Connection_base
{
public:
struct Args {
Parent::Session_args session_args;
Affinity affinity;
};
private:
/*
* Buffer for storing the session arguments passed to the
* 'session' method that is called before the 'Connection' is
* constructed.
*/
Args const _args;
enum { FORMAT_STRING_SIZE = Parent::Session_args::MAX_SIZE };
char _session_args[FORMAT_STRING_SIZE];
char _affinity_arg[sizeof(Affinity)];
void _session(Parent &,
Affinity const &affinity,
static
Args _session(Affinity const &affinity,
const char *format_args, va_list list)
{
String_console sc(_session_args, FORMAT_STRING_SIZE);
enum { FORMAT_STRING_SIZE = Parent::Session_args::MAX_SIZE };
char session_args[FORMAT_STRING_SIZE];
String_console sc(session_args, FORMAT_STRING_SIZE);
sc.vprintf(format_args, list);
va_end(list);
memcpy(_affinity_arg, &affinity, sizeof(Affinity));
return Args { session_args, affinity };
}
Capability<SESSION_TYPE> _request_cap()
{
Affinity affinity;
memcpy(&affinity, _affinity_arg, sizeof(Affinity));
try {
return _env.session<SESSION_TYPE>(_id_space_element.id(),
_session_args, affinity); }
_args.session_args,
_args.affinity);
}
catch (...) {
error(SESSION_TYPE::service_name(), "-session creation failed "
"(", Cstring(_session_args), ")");
"(", _args.session_args.string(), ")");
throw;
}
}
@ -126,9 +118,9 @@ class Genode::Connection : public Connection_base
/**
* Constructor
*/
Connection(Env &env, Capability<SESSION_TYPE>)
Connection(Env &env, Args const &args)
:
Connection_base(env), _cap(_request_cap())
Connection_base(env), _args(args), _cap(_request_cap())
{ }
/**
@ -142,29 +134,26 @@ class Genode::Connection : public Connection_base
Capability<SESSION_TYPE> cap() const { return _cap; }
/**
* Issue session request to the parent
* Construct session argument buffer
*/
Capability<SESSION_TYPE> session(Parent &parent, const char *format_args, ...)
static Args args(const char *format_args, ...)
{
va_list list;
va_start(list, format_args);
_session(parent, Affinity(), format_args, list);
return Capability<SESSION_TYPE>();
return _session(Affinity(), format_args, list);
}
/**
* Issue session request to the parent
* Construct session argument buffer
*/
Capability<SESSION_TYPE> session(Parent &parent,
Affinity const &affinity,
char const *format_args, ...)
static Args args(Affinity const &affinity,
char const *format_args, ...)
{
va_list list;
va_start(list, format_args);
_session(parent, affinity, format_args, list);
return Capability<SESSION_TYPE>();
return _session(affinity, format_args, list);
}
};

View File

@ -35,10 +35,10 @@ struct Genode::Cpu_connection : Connection<Cpu_session>, Cpu_session_client
Affinity const &affinity = Affinity())
:
Connection<Cpu_session>(env,
session(env.parent(), affinity,
"priority=0x%lx, ram_quota=%u, "
"cap_quota=%u, label=\"%s\"",
priority, RAM_QUOTA, CAP_QUOTA, label)),
args(affinity,
"priority=0x%lx, ram_quota=%u, "
"cap_quota=%u, label=\"%s\"",
priority, RAM_QUOTA, CAP_QUOTA, label)),
Cpu_session_client(cap())
{ }
};

View File

@ -32,11 +32,10 @@ struct Genode::Io_mem_connection : Connection<Io_mem_session>, Io_mem_session_cl
Io_mem_connection(Env &env, addr_t base, size_t size, bool write_combined = false)
:
Connection<Io_mem_session>(env,
session(env.parent(),
"cap_quota=%u, ram_quota=6K, "
"base=0x%p, size=0x%lx, wc=%s",
CAP_QUOTA, base, size,
write_combined ? "yes" : "no")),
args("cap_quota=%u, ram_quota=6K, "
"base=0x%p, size=0x%lx, wc=%s",
CAP_QUOTA, base, size,
write_combined ? "yes" : "no")),
Io_mem_session_client(cap())
{ }
};

View File

@ -23,17 +23,6 @@ namespace Genode { struct Io_port_connection; }
struct Genode::Io_port_connection : Connection<Io_port_session>,
Io_port_session_client
{
/**
* Issue session request
*
* \noapi
*/
Capability<Io_port_session> _session(Parent &parent, unsigned base, unsigned size)
{
return session(parent, "ram_quota=6K, cap_quota=%u, io_port_base=%u, io_port_size=%u",
CAP_QUOTA, base, size);
}
/**
* Constructor
*
@ -43,10 +32,9 @@ struct Genode::Io_port_connection : Connection<Io_port_session>,
Io_port_connection(Env &env, unsigned base, unsigned size)
:
Connection<Io_port_session>(env,
session(env.parent(),
"ram_quota=6K, cap_quota=%u, "
"io_port_base=%u, io_port_size=%u",
CAP_QUOTA, base, size)),
args("ram_quota=6K, cap_quota=%u, "
"io_port_base=%u, io_port_size=%u",
CAP_QUOTA, base, size)),
Io_port_session_client(cap())
{ }
};

View File

@ -34,11 +34,10 @@ struct Genode::Irq_connection : Connection<Irq_session>, Irq_session_client
Irq_session::Polarity polarity = Irq_session::POLARITY_UNCHANGED,
Genode::addr_t device_config_phys = 0)
:
Connection<Irq_session>(env, session(env.parent(),
"ram_quota=6K, cap_quota=4, "
"irq_number=%u, irq_trigger=%u, "
"irq_polarity=%u, device_config_phys=0x%lx",
irq, trigger, polarity, device_config_phys)),
Connection<Irq_session>(env, args("ram_quota=6K, cap_quota=4, "
"irq_number=%u, irq_trigger=%u, "
"irq_polarity=%u, device_config_phys=0x%lx",
irq, trigger, polarity, device_config_phys)),
Irq_session_client(cap())
{ }
};

View File

@ -30,9 +30,8 @@ struct Genode::Log_connection : Connection<Log_session>, Log_session_client
*/
Log_connection(Env &env, Session_label label = Session_label())
:
Connection<Log_session>(env, session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, label=\"%s\"",
RAM_QUOTA, CAP_QUOTA, label.string())),
Connection<Log_session>(env, args("ram_quota=%ld, cap_quota=%ld, label=\"%s\"",
RAM_QUOTA, CAP_QUOTA, label.string())),
Log_session_client(cap())
{ }
};

View File

@ -32,9 +32,8 @@ struct Genode::Pd_connection : Connection<Pd_session>, Pd_session_client
*/
Pd_connection(Env &env, char const *label = "", Virt_space space = CONSTRAIN)
:
Connection<Pd_session>(env, session(env.parent(),
"ram_quota=%u, cap_quota=%u, label=\"%s\", virt_space=%u",
RAM_QUOTA, CAP_QUOTA, label, space)),
Connection<Pd_session>(env, args("ram_quota=%u, cap_quota=%u, label=\"%s\", virt_space=%u",
RAM_QUOTA, CAP_QUOTA, label, space)),
Pd_session_client(cap())
{ }
};

View File

@ -30,7 +30,7 @@ struct Genode::Rm_connection : Connection<Rm_session>, Rm_session_client
*/
Rm_connection(Env &env)
:
Connection<Rm_session>(env, session(env.parent(), "ram_quota=%u, cap_quota=%u",
Connection<Rm_session>(env, args("ram_quota=%u, cap_quota=%u",
RAM_QUOTA, CAP_QUOTA)),
Rm_session_client(cap())
{ }

View File

@ -37,10 +37,8 @@ struct Genode::Rom_connection : Connection<Rom_session>,
*/
Rom_connection(Env &env, const char *label)
try :
Connection<Rom_session>(env,
session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, label=\"%s\"",
RAM_QUOTA, CAP_QUOTA, label)),
Connection<Rom_session>(env, args("ram_quota=%ld, cap_quota=%ld, label=\"%s\"",
RAM_QUOTA, CAP_QUOTA, label)),
Rom_session_client(cap())
{ }
catch (...) {

View File

@ -33,8 +33,8 @@ struct Genode::Trace::Connection : Genode::Connection<Genode::Trace::Session>,
Connection(Env &env, size_t ram_quota, size_t arg_buffer_size, unsigned parent_levels)
:
Genode::Connection<Session>(env,
session(env.parent(), "ram_quota=%lu, arg_buffer_size=%lu, parent_levels=%u",
ram_quota + 2048, arg_buffer_size, parent_levels)),
args("ram_quota=%lu, arg_buffer_size=%lu, parent_levels=%u",
ram_quota + 2048, arg_buffer_size, parent_levels)),
Session_client(env.rm(), cap())
{ }
};

View File

@ -24,19 +24,6 @@ namespace Genode { struct Vm_connection; }
struct Genode::Vm_connection : Connection<Vm_session>, Vm_session_client
{
/**
* Issue session request
*
* \noapi
*/
Capability<Vm_session> _session(Parent &parent, char const *label, long priority,
unsigned long affinity)
{
return session(parent,
"priority=0x%lx, affinity=0x%lx, ram_quota=16K, cap_quota=10, label=\"%s\"",
priority, affinity, label);
}
/**
* Constructor
*
@ -48,7 +35,9 @@ struct Genode::Vm_connection : Connection<Vm_session>, Vm_session_client
long priority = Cpu_session::DEFAULT_PRIORITY,
unsigned long affinity = 0)
:
Connection<Vm_session>(env, _session(env.parent(), label, priority, affinity)),
Connection<Vm_session>(env,
args("priority=0x%lx, affinity=0x%lx, ram_quota=16K, cap_quota=10, label=\"%s\"",
priority, affinity, label)),
Vm_session_client(cap())
{ }

View File

@ -38,13 +38,3 @@ Id_space<Parent::Client> &Genode::env_session_id_space()
return id_space;
}
/*
* \deprecated
*/
Connection_base::Connection_base()
:
_env(internal_env()),
_id_space_element(_parent_client, _env.id_space())
{ }

View File

@ -129,7 +129,7 @@ void Timer::Connection::_enable_modern_mode()
Timer::Connection::Connection(Genode::Env &env, char const *label)
:
Genode::Connection<Session>(env, session(env.parent(),
Genode::Connection<Session>(env, args(
"ram_quota=10K, cap_quota=%u, label=\"%s\"",
CAP_QUOTA, label)),
Session_client(cap()),

View File

@ -25,8 +25,7 @@ struct Hello::Connection : Genode::Connection<Session>, Session_client
Connection(Genode::Env &env)
:
/* create session */
Genode::Connection<Hello::Session>(env, session(env.parent(),
"ram_quota=6K, cap_quota=4")),
Genode::Connection<Hello::Session>(env, args("ram_quota=6K, cap_quota=4")),
/* initialize RPC interface */
Session_client(cap()) { }

View File

@ -23,17 +23,6 @@ namespace Audio_in { struct Connection; }
struct Audio_in::Connection : Genode::Connection<Session>, Audio_in::Session_client
{
/**
* Issue session request
*
* \noapi
*/
Genode::Capability<Audio_in::Session> _session(Genode::Parent &parent, char const *channel)
{
return session(parent, "ram_quota=%ld, cap_quota=%ld, channel=\"%s\"",
10*1024 + sizeof(Stream), CAP_QUOTA, channel);
}
/**
* Constructor
*
@ -43,7 +32,9 @@ struct Audio_in::Connection : Genode::Connection<Session>, Audio_in::Session_cli
*/
Connection(Genode::Env &env, char const *channel, bool progress_signal = false)
:
Genode::Connection<Session>(env, _session(env.parent(), channel)),
Genode::Connection<Session>(env,
args("ram_quota=%ld, cap_quota=%ld, channel=\"%s\"",
10*1024 + sizeof(Stream), CAP_QUOTA, channel)),
Session_client(env.rm(), cap(), progress_signal)
{ }
};

View File

@ -39,9 +39,8 @@ struct Audio_out::Connection : Genode::Connection<Session>, Audio_out::Session_c
bool progress_signal = false)
:
Genode::Connection<Session>(env,
session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, channel=\"%s\"",
2*4096 + 2048 + sizeof(Stream), CAP_QUOTA, channel)),
args("ram_quota=%ld, cap_quota=%ld, channel=\"%s\"",
2*4096 + 2048 + sizeof(Stream), CAP_QUOTA, channel)),
Session_client(env.rm(), cap(), alloc_signal, progress_signal)
{ }
};

View File

@ -222,9 +222,8 @@ struct Block::Connection : Genode::Connection<Session>, Session_client
const char *label = "")
:
Genode::Connection<Session>(env,
session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, tx_buf_size=%ld, label=\"%s\"",
14*1024 + tx_buf_size, CAP_QUOTA, tx_buf_size, label)),
args("ram_quota=%ld, cap_quota=%ld, tx_buf_size=%ld, label=\"%s\"",
14*1024 + tx_buf_size, CAP_QUOTA, tx_buf_size, label)),
Session_client(cap(), *tx_block_alloc, env.rm()),
_max_block_count(_init_max_block_count(_tx.source()->bulk_buffer_size()))
{ }

View File

@ -72,17 +72,16 @@ struct File_system::Connection : Genode::Connection<Session>, Session_client
size_t tx_buf_size = DEFAULT_TX_BUF_SIZE)
:
Genode::Connection<Session>(env,
session(env.parent(),
"ram_quota=%ld, "
"cap_quota=%ld, "
"tx_buf_size=%ld, "
"label=\"%s\", "
"root=\"%s\", "
"writeable=%d",
8*1024*sizeof(long) + tx_buf_size,
CAP_QUOTA,
tx_buf_size,
label, root, writeable)),
args("ram_quota=%ld, "
"cap_quota=%ld, "
"tx_buf_size=%ld, "
"label=\"%s\", "
"root=\"%s\", "
"writeable=%d",
8*1024*sizeof(long) + tx_buf_size,
CAP_QUOTA,
tx_buf_size,
label, root, writeable)),
Session_client(cap(), tx_block_alloc, env.rm())
{ }

View File

@ -31,11 +31,9 @@ class Framebuffer::Connection : public Genode::Connection<Session>,
private:
/**
* Create session and return typed session capability
* Create session arguments
*/
Session_capability _connect(Genode::Parent &parent,
unsigned width, unsigned height,
Mode::Format format)
Args _args(unsigned width, unsigned height, Mode::Format format)
{
using namespace Genode;
@ -55,7 +53,7 @@ class Framebuffer::Connection : public Genode::Connection<Session>,
if (format != Mode::INVALID)
Arg_string::set_arg(argbuf, sizeof(argbuf), "fb_format", format);
return session(parent, argbuf);
return args(argbuf);
}
public:
@ -71,9 +69,9 @@ class Framebuffer::Connection : public Genode::Connection<Session>,
*/
Connection(Genode::Env &env, Framebuffer::Mode mode)
:
Genode::Connection<Session>(env, _connect(env.parent(),
mode.width(), mode.height(),
mode.format())),
Genode::Connection<Session>(env, _args(mode.width(),
mode.height(),
mode.format())),
Session_client(cap())
{ }
};

View File

@ -28,9 +28,8 @@ struct Gpio::Connection : Genode::Connection<Session>, Session_client
*/
Connection(Genode::Env &env, unsigned long gpio_pin)
:
Genode::Connection<Session>(env, session(env.parent(),
"ram_quota=8K, cap_quota=%ld, gpio=%ld",
CAP_QUOTA, gpio_pin)),
Genode::Connection<Session>(env, args("ram_quota=8K, cap_quota=%ld, gpio=%ld",
CAP_QUOTA, gpio_pin)),
Session_client(cap())
{ }
};

View File

@ -22,17 +22,6 @@ namespace Gpu { struct Connection; }
struct Gpu::Connection : Genode::Connection<Session>, Session_client
{
/**
* Issue session request
*
* \noapi
*/
Genode::Capability<Gpu::Session> _session(Genode::Parent &parent,
char const *label, Genode::size_t quota)
{
return session(parent, "ram_quota=%ld, label=\"%s\"", quota, label);
}
/**
* Constructor
*
@ -43,7 +32,7 @@ struct Gpu::Connection : Genode::Connection<Session>, Session_client
Genode::size_t quota = Session::REQUIRED_QUOTA,
const char *label = "")
:
Genode::Connection<Session>(env, _session(env.parent(), label, quota)),
Genode::Connection<Session>(env, args("ram_quota=%ld, label=\"%s\"", quota, label)),
Session_client(cap())
{ }
};

View File

@ -27,9 +27,8 @@ struct Input::Connection : Genode::Connection<Session>, Session_client
Connection(Genode::Env &env, char const *label = "")
:
Genode::Connection<Input::Session>(env,
session(env.parent(),
"ram_quota=18K, cap_quota=%u, label=\"%s\"",
CAP_QUOTA, label)),
args("ram_quota=18K, cap_quota=%u, label=\"%s\"",
CAP_QUOTA, label)),
Session_client(env.rm(), cap())
{ }
};

View File

@ -28,10 +28,9 @@ struct Loader::Connection : Genode::Connection<Session>, Session_client
*/
Connection(Genode::Env &env, Ram_quota ram_quota, Cap_quota cap_quota)
:
Genode::Connection<Session>(env, session(env.parent(),
"ram_quota=%ld, cap_quota=%ld",
ram_quota.value,
CAP_QUOTA + cap_quota.value)),
Genode::Connection<Session>(env, args("ram_quota=%ld, cap_quota=%ld",
ram_quota.value,
CAP_QUOTA + cap_quota.value)),
Session_client(cap())
{ }
};

View File

@ -38,11 +38,10 @@ struct Nic::Connection : Genode::Connection<Session>, Session_client
char const *label = "")
:
Genode::Connection<Session>(env,
session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, "
"tx_buf_size=%ld, rx_buf_size=%ld, label=\"%s\"",
32*1024*sizeof(long) + tx_buf_size + rx_buf_size,
CAP_QUOTA, tx_buf_size, rx_buf_size, label)),
args("ram_quota=%ld, cap_quota=%ld, "
"tx_buf_size=%ld, rx_buf_size=%ld, label=\"%s\"",
32*1024*sizeof(long) + tx_buf_size + rx_buf_size,
CAP_QUOTA, tx_buf_size, rx_buf_size, label)),
Session_client(cap(), *tx_block_alloc, env.rm())
{ }
};

View File

@ -39,7 +39,7 @@ class Nitpicker::Connection : public Genode::Connection<Session>,
/**
* Create session and return typed session capability
*/
Session_capability _connect(Genode::Parent &parent, char const *label)
Args _args(char const *label)
{
enum { ARGBUF_SIZE = 128 };
char argbuf[ARGBUF_SIZE];
@ -55,7 +55,7 @@ class Nitpicker::Connection : public Genode::Connection<Session>,
Arg_string::set_arg(argbuf, sizeof(argbuf), "ram_quota", RAM_QUOTA);
Arg_string::set_arg(argbuf, sizeof(argbuf), "cap_quota", CAP_QUOTA);
return session(parent, argbuf);
return args(argbuf);
}
public:
@ -66,7 +66,7 @@ class Nitpicker::Connection : public Genode::Connection<Session>,
Connection(Genode::Env &env, char const *label = "")
:
/* establish nitpicker session */
Genode::Connection<Session>(env, _connect(env.parent(), label)),
Genode::Connection<Session>(env, _args(label)),
Session_client(env.rm(), cap()),
/* request frame-buffer and input sub sessions */

View File

@ -27,8 +27,7 @@ struct Platform::Connection : Genode::Connection<Session>, Client
* Constructor
*/
Connection(Genode::Env &env)
: Genode::Connection<Session>(env, session(env.parent(),
"ram_quota=6K, cap_quota=%ld", CAP_QUOTA)),
: Genode::Connection<Session>(env, args("ram_quota=6K, cap_quota=%ld", CAP_QUOTA)),
Client(cap()) { }
};

View File

@ -32,9 +32,9 @@ struct Regulator::Connection : Genode::Connection<Session>, Session_client
Connection(Genode::Env &env, Regulator_id regulator, const char * label = "")
:
Genode::Connection<Session>(env,
session(env.parent(),
"ram_quota=8K, cap_quota=%ld, regulator=\"%s\", label=\"%s\"",
CAP_QUOTA, regulator_name_by_id(regulator), label)),
args(env.parent(),
"ram_quota=8K, cap_quota=%ld, regulator=\"%s\", label=\"%s\"",
CAP_QUOTA, regulator_name_by_id(regulator), label)),
Session_client(cap())
{ }
};

View File

@ -27,11 +27,10 @@ struct Report::Connection : Genode::Connection<Session>, Session_client
Connection(Genode::Env &env, char const *label, size_t buffer_size = 4096)
:
Genode::Connection<Session>(env,
session(env.parent(),
"label=\"%s\", ram_quota=%ld, "
"cap_quota=%ld, buffer_size=%zd",
label, RAM_QUOTA + buffer_size,
CAP_QUOTA, buffer_size)),
args("label=\"%s\", ram_quota=%ld, "
"cap_quota=%ld, buffer_size=%zd",
label, RAM_QUOTA + buffer_size,
CAP_QUOTA, buffer_size)),
Session_client(cap())
{ }
};

View File

@ -29,7 +29,7 @@ struct Rtc::Connection : Genode::Connection<Session>, Session_client
Connection(Genode::Env &env, char const *label = "")
:
Genode::Connection<Rtc::Session>(
env, session(env.parent(), "ram_quota=8K, label=\"%s\"", label)),
env, args("ram_quota=8K, label=\"%s\"", label)),
Session_client(cap())
{ }
};

View File

@ -27,9 +27,7 @@ struct Platform::Connection : Genode::Connection<Session>, Client
*/
Connection(Genode::Env &env)
:
Genode::Connection<Session>(env, session(env.parent(),
"ram_quota=16K, cap_quota=%u",
CAP_QUOTA)),
Genode::Connection<Session>(env, args("ram_quota=16K, cap_quota=%u", CAP_QUOTA)),
Client(cap())
{ }

View File

@ -49,9 +49,8 @@ struct Terminal::Connection : Genode::Connection<Session>, Session_client
*/
Connection(Genode::Env &env, char const *label = "")
:
Genode::Connection<Session>(env, session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, label=\"%s\"",
10*1024, CAP_QUOTA, label)),
Genode::Connection<Session>(env, args("ram_quota=%ld, cap_quota=%ld, label=\"%s\"",
10*1024, CAP_QUOTA, label)),
Session_client(env.rm(), cap())
{
wait_for_connection(cap());

View File

@ -27,7 +27,7 @@ struct Uart::Connection : Genode::Connection<Session>, Session_client
*/
Connection(Genode::Env &env)
:
Genode::Connection<Session>(env, session(env.parent(), "ram_quota=%ld", 2*4096)),
Genode::Connection<Session>(env, args("ram_quota=%ld", 2*4096)),
Session_client(env.rm(), cap())
{
Terminal::Connection::wait_for_connection(cap());

View File

@ -33,9 +33,8 @@ struct Usb::Connection : Genode::Connection<Session>, Session_client
Genode::Signal_context_capability())
:
Genode::Connection<Session>(env,
session(env.parent(),
"ram_quota=%ld, cap_quota=%ld, tx_buf_size=%ld, label=\"%s\"",
3 * 4096 + tx_buf_size, CAP_QUOTA, tx_buf_size, label)),
args("ram_quota=%ld, cap_quota=%ld, tx_buf_size=%ld, label=\"%s\"",
3 * 4096 + tx_buf_size, CAP_QUOTA, tx_buf_size, label)),
Session_client(cap(), *tx_block_alloc, env.rm(), sigh_state_changed)
{ }
};

View File

@ -27,7 +27,7 @@ struct Noux::Connection : Genode::Connection<Session>, Session_client
*/
Connection(Genode::Env &env)
:
Genode::Connection<Session>(env, session(env.parent(), "")),
Genode::Connection<Session>(env, args("")),
Session_client(cap())
{ }