diff --git a/repos/base/src/core/include/trace/control_area.h b/repos/base/src/core/include/trace/control_area.h index beb50b3b29..afdf1841d8 100644 --- a/repos/base/src/core/include/trace/control_area.h +++ b/repos/base/src/core/include/trace/control_area.h @@ -16,6 +16,7 @@ #include #include +#include /* base-internal includes */ #include @@ -31,27 +32,12 @@ class Genode::Trace::Control_area private: - Ram_allocator &_ram; - Region_map &_rm; - Ram_dataspace_capability _ds; - Trace::Control *_local_base; + Ram_allocator &_ram; + Region_map &_rm; + Attached_ram_dataspace const _area; - static Ram_dataspace_capability _try_alloc(Ram_allocator &ram, size_t size) - { - try { return ram.alloc(size); } - catch (...) { return Ram_dataspace_capability(); } - } - - static Trace::Control *_try_attach(Region_map &rm, Dataspace_capability ds) - { - try { return rm.attach(ds); } - catch (...) { return nullptr; } - } - - bool _index_valid(int index) const - { - return (index + 1)*sizeof(Trace::Control) < SIZE; - } + bool _index_valid(unsigned const index) const { + return index < SIZE / sizeof(Trace::Control); } /* * Noncopyable @@ -59,48 +45,45 @@ class Genode::Trace::Control_area Control_area(Control_area const &); Control_area &operator = (Control_area const &); + Trace::Control * _local_base() const { + return _area.local_addr(); } + public: Control_area(Ram_allocator &ram, Region_map &rm) : - _ram(ram), _rm(rm), - _ds(_try_alloc(ram, SIZE)), - _local_base(_try_attach(rm, _ds)) + _ram(ram), _rm(rm), _area(ram, rm, SIZE) { } - ~Control_area() - { - if (_local_base) _rm.detach(_local_base); - if (_ds.valid()) _ram.free(_ds); - } + ~Control_area() { } - Dataspace_capability dataspace() const { return _ds; } + Dataspace_capability dataspace() const { return _area.cap(); } bool alloc(unsigned &index_out) { for (unsigned index = 0; _index_valid(index); index++) { - if (!_local_base[index].is_free()) { + if (!_local_base()[index].is_free()) { continue; } - _local_base[index].alloc(); + _local_base()[index].alloc(); index_out = index; return true; } - error("trace-control allocaton failed"); + error("trace-control allocation failed"); return false; } void free(unsigned index) { if (_index_valid(index)) - _local_base[index].reset(); + _local_base()[index].reset(); } Trace::Control *at(unsigned index) { - return _index_valid(index) ? &_local_base[index] : nullptr; + return _index_valid(index) ? &(_local_base()[index]) : nullptr; } };