core: explicitly throw Out_of_metadata

In case there is not enough quota left to create the trace buffer
or trace policy dataspace throw Out_of_metadata explicitly instead
of rethrowing the Ram_session::Quota_exceeded exception. Now one
can catch Trace::Out_of_metadata exception in a client application.

In addition fix Allocator_guard::withdraw() checks because this
method does not throw any exceptions and a failed withdrawal goes
unoticed.

Fixes #871.
This commit is contained in:
Josef Söntgen 2013-09-02 15:23:26 +02:00 committed by Norman Feske
parent ca0f677da9
commit 2501cb189e
1 changed files with 8 additions and 8 deletions

View File

@ -43,17 +43,17 @@ Policy_id Session_component::alloc_policy(size_t size)
Policy_id const id(_policy_cnt++);
try { _md_alloc.withdraw(size); }
catch (...) { throw Out_of_metadata(); }
if (!_md_alloc.withdraw(size))
throw Out_of_metadata();
try {
Ram_dataspace_capability ds = _ram.alloc(size);
_policies.insert(*this, id, _policies_slab, ds, size);
} catch (...) {
/* revert withdrawal or quota and re-throw exception */
/* revert withdrawal or quota */
_md_alloc.upgrade(size);
throw;
throw Out_of_metadata();
}
return id;
@ -82,17 +82,17 @@ void Session_component::trace(Subject_id subject_id, Policy_id policy_id,
* Account RAM needed for trace buffer and policy buffer to the trace
* session.
*/
try { _md_alloc.withdraw(required_ram); }
catch (...) { throw Out_of_metadata(); }
if (!_md_alloc.withdraw(required_ram))
throw Out_of_metadata();
try {
Trace::Subject *subject = _subjects.lookup_by_id(subject_id);
subject->trace(policy_id, _policies.dataspace(*this, policy_id),
policy_size, _ram, buffer_size);
} catch (...) {
/* revert withdrawal or quota and re-throw exception */
/* revert withdrawal or quota */
_md_alloc.upgrade(required_ram);
throw;
throw Out_of_metadata();
}
}