mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-07 19:34:56 +00:00
base: buffer session args in 'Connection'
This patch is a preparation of the forthcoming async parent interface. Note that this patch increases the size of connection objects. Furthermore it adds a diagnostic message whenever a connection fails. Issue #2166
This commit is contained in:
parent
7fba39831a
commit
82107bef9b
@ -33,40 +33,51 @@ class Genode::Connection : public Noncopyable
|
||||
private:
|
||||
|
||||
/*
|
||||
* Because the argument string is used with the parent interface,
|
||||
* the message-buffer size of the parent-interface provides a
|
||||
* realistic upper bound for dimensioning the format- string
|
||||
* buffer.
|
||||
* Buffer for storing the session arguments passed to the
|
||||
* 'session' method that is called before the 'Connection' is
|
||||
* constructed.
|
||||
*/
|
||||
enum { FORMAT_STRING_SIZE = Parent::Session_args::MAX_SIZE };
|
||||
|
||||
Capability<SESSION_TYPE> _cap;
|
||||
char _session_args[FORMAT_STRING_SIZE];
|
||||
char _affinity_arg[sizeof(Affinity)];
|
||||
|
||||
Parent &_parent;
|
||||
|
||||
On_destruction _on_destruction;
|
||||
|
||||
Capability<SESSION_TYPE> _session(Parent &parent,
|
||||
Affinity const &affinity,
|
||||
const char *format_args, va_list list)
|
||||
void _session(Parent &parent,
|
||||
Affinity const &affinity,
|
||||
const char *format_args, va_list list)
|
||||
{
|
||||
char buf[FORMAT_STRING_SIZE];
|
||||
|
||||
String_console sc(buf, FORMAT_STRING_SIZE);
|
||||
String_console sc(_session_args, FORMAT_STRING_SIZE);
|
||||
sc.vprintf(format_args, list);
|
||||
|
||||
va_end(list);
|
||||
|
||||
/* call parent interface with the resulting argument buffer */
|
||||
return parent.session<SESSION_TYPE>(buf, affinity);
|
||||
memcpy(_affinity_arg, &affinity, sizeof(Affinity));
|
||||
}
|
||||
|
||||
Capability<SESSION_TYPE> _request_cap()
|
||||
{
|
||||
Affinity affinity;
|
||||
memcpy(&affinity, _affinity_arg, sizeof(Affinity));
|
||||
|
||||
try {
|
||||
return env()->parent()->session<SESSION_TYPE>(_session_args, affinity); }
|
||||
catch (...) {
|
||||
error(SESSION_TYPE::service_name(), "-session creation failed "
|
||||
"(", Cstring(_session_args), ")");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
Capability<SESSION_TYPE> _cap = _request_cap();
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param cap session capability
|
||||
* \param od session policy applied when destructing the connection
|
||||
*
|
||||
* The 'op' argument defines whether the session should automatically
|
||||
@ -76,8 +87,8 @@ class Genode::Connection : public Noncopyable
|
||||
* session capability of the connection to another party but never
|
||||
* invokes any of the session's RPC functions.
|
||||
*/
|
||||
Connection(Env &env, Capability<SESSION_TYPE> cap, On_destruction od = CLOSE)
|
||||
: _cap(cap), _parent(env.parent()), _on_destruction(od) { }
|
||||
Connection(Env &env, Capability<SESSION_TYPE>, On_destruction od = CLOSE)
|
||||
: _parent(env.parent()), _on_destruction(od) { }
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@ -86,8 +97,8 @@ class Genode::Connection : public Noncopyable
|
||||
* \deprecated Use the constructor with 'Env &' as first
|
||||
* argument instead
|
||||
*/
|
||||
Connection(Capability<SESSION_TYPE> cap, On_destruction od = CLOSE)
|
||||
: _cap(cap), _parent(*env()->parent()), _on_destruction(od) { }
|
||||
Connection(Capability<SESSION_TYPE>, On_destruction od = CLOSE)
|
||||
: _parent(*env()->parent()), _on_destruction(od) { }
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
@ -116,7 +127,8 @@ class Genode::Connection : public Noncopyable
|
||||
va_list list;
|
||||
va_start(list, format_args);
|
||||
|
||||
return _session(parent, Affinity(), format_args, list);
|
||||
_session(parent, Affinity(), format_args, list);
|
||||
return Capability<SESSION_TYPE>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,7 +141,8 @@ class Genode::Connection : public Noncopyable
|
||||
va_list list;
|
||||
va_start(list, format_args);
|
||||
|
||||
return _session(parent, affinity, format_args, list);
|
||||
_session(parent, affinity, format_args, list);
|
||||
return Capability<SESSION_TYPE>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -143,7 +156,8 @@ class Genode::Connection : public Noncopyable
|
||||
va_list list;
|
||||
va_start(list, format_args);
|
||||
|
||||
return _session(*env()->parent(), Affinity(), format_args, list);
|
||||
_session(*env()->parent(), Affinity(), format_args, list);
|
||||
return Capability<SESSION_TYPE>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -158,7 +172,8 @@ class Genode::Connection : public Noncopyable
|
||||
va_list list;
|
||||
va_start(list, format_args);
|
||||
|
||||
return _session(affinity, format_args, list);
|
||||
_session(affinity, format_args, list);
|
||||
return Capability<SESSION_TYPE>();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -32,11 +32,7 @@ class Genode::Rom_connection : public Connection<Rom_session>,
|
||||
|
||||
Rom_session_capability _session(Parent &parent, char const *label)
|
||||
{
|
||||
try { return session("ram_quota=4K, label=\"%s\"", label); }
|
||||
catch (...) {
|
||||
error("Could not open ROM session for \"", label, "\"");
|
||||
throw Rom_connection_failed();
|
||||
}
|
||||
return session("ram_quota=4K, label=\"%s\"", label);
|
||||
}
|
||||
|
||||
public:
|
||||
@ -49,10 +45,14 @@ class Genode::Rom_connection : public Connection<Rom_session>,
|
||||
* \throw Rom_connection_failed
|
||||
*/
|
||||
Rom_connection(Env &env, const char *label)
|
||||
:
|
||||
try :
|
||||
Connection<Rom_session>(env, _session(env.parent(), label)),
|
||||
Rom_session_client(cap())
|
||||
{ }
|
||||
catch (...) {
|
||||
error("Could not open ROM session for \"", label, "\"");
|
||||
throw Rom_connection_failed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@ -62,10 +62,14 @@ class Genode::Rom_connection : public Connection<Rom_session>,
|
||||
* argument instead
|
||||
*/
|
||||
Rom_connection(const char *label)
|
||||
:
|
||||
try :
|
||||
Connection<Rom_session>(_session(*env()->parent(), label)),
|
||||
Rom_session_client(cap())
|
||||
{ }
|
||||
catch (...) {
|
||||
error("Could not open ROM session for \"", label, "\"");
|
||||
throw Rom_connection_failed();
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* _INCLUDE__ROM_SESSION__CONNECTION_H_ */
|
||||
|
@ -80,6 +80,7 @@ compare_output_to {
|
||||
[init -> test-ldso] Catch exceptions in program
|
||||
[init -> test-ldso] ---------------------------
|
||||
[init -> test-ldso] exception in remote procedure call:
|
||||
[init -> test-ldso] Error: ROM-session creation failed (ram_quota=4K, label="unknown_file")
|
||||
[init -> test-ldso] Error: Could not open ROM session for "unknown_file"
|
||||
[init -> test-ldso] caught
|
||||
[init -> test-ldso] exception in program: caught
|
||||
|
@ -68,6 +68,7 @@ compare_output_to {
|
||||
[init -> test-report_rom] Reporter: start reporting (while the ROM client still listens)
|
||||
[init -> test-report_rom] ROM client: wait for update notification
|
||||
[init -> test-report_rom] ROM client: try to open the same report again
|
||||
[init -> test-report_rom] Error: Report-session creation failed (label="brightness", ram_quota=12288, buffer_size=4096)
|
||||
[init -> test-report_rom] ROM client: catched Parent::Service_denied - OK
|
||||
[init -> test-report_rom] --- test-report_rom finished ---
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user