diff --git a/repos/base/include/util/register_set.h b/repos/base/include/util/register_set.h index bd0eda3ea..7c8f4629d 100644 --- a/repos/base/include/util/register_set.h +++ b/repos/base/include/util/register_set.h @@ -103,6 +103,10 @@ class Genode::Register_set : Noncopyable inline bool _conditions_met(CONDITION condition) { return condition.met(read()); } + template + inline bool _one_condition_met(CONDITION condition) { + return condition.met(read()); } + /** * Return wether a list of IO conditions is met * @@ -118,6 +122,14 @@ class Genode::Register_set : Noncopyable inline bool _conditions_met(CONDITION head, CONDITIONS... tail) { return _conditions_met(head) ? _conditions_met(tail...) : false; } + /** + * Same as '_conditions_met' but returns true if one condition in a list of + * IO conditions is met + */ + template + inline bool _one_condition_met(CONDITION head, CONDITIONS... tail) { + return _conditions_met(head) ? true : _one_condition_met(tail...); } + /** * This template equips registers/bitfields with conditions for polling * @@ -720,6 +732,35 @@ class Genode::Register_set : Noncopyable wait_for(Attempts(500), Microseconds(1000), delayer, conditions...); } + + /** + * Same as 'wait_for' but wait until one condition in a list of IO + * conditions is met + */ + template + inline void wait_for_any(Attempts attempts, + Microseconds us, + Delayer &delayer, + CONDITIONS... conditions) + { + for (unsigned i = 0; i < attempts.value; i++, + delayer.usleep(us.value)) + { + if (_one_condition_met(conditions...)) { + return; } + } + throw Polling_timeout(); + } + + /** + * Shortcut for 'wait_for' with 'attempts = 500' and 'us = 1000' + */ + template + inline void wait_for_any(Delayer &delayer, CONDITIONS... conditions) + { + wait_for_any(Attempts(500), Microseconds(1000), + delayer, conditions...); + } }; #endif /* _INCLUDE__UTIL__REGISTER_SET_H_ */ diff --git a/repos/os/src/drivers/ahci/atapi_driver.h b/repos/os/src/drivers/ahci/atapi_protocol.h similarity index 100% rename from repos/os/src/drivers/ahci/atapi_driver.h rename to repos/os/src/drivers/ahci/atapi_protocol.h