class AsyncReserver {
Finisher *f;
unsigned max_allowed;
+ unsigned min_priority;
Mutex lock;
map<unsigned, list<pair<T, Context*> > > queues;
void do_queues() {
typename map<unsigned, list<pair<T, Context*> > >::reverse_iterator it;
for (it = queues.rbegin();
- it != queues.rend() && in_progress.size() < max_allowed;
+ it != queues.rend() &&
+ in_progress.size() < max_allowed &&
+ it->first >= min_priority;
++it) {
while (in_progress.size() < max_allowed &&
!it->second.empty()) {
public:
AsyncReserver(
Finisher *f,
- unsigned max_allowed)
- : f(f), max_allowed(max_allowed), lock("AsyncReserver::lock") {}
+ unsigned max_allowed,
+ unsigned min_priority = 0)
+ : f(f),
+ max_allowed(max_allowed),
+ min_priority(min_priority),
+ lock("AsyncReserver::lock") {}
void set_max(unsigned max) {
Mutex::Locker l(lock);
do_queues();
}
+ void set_min_priority(unsigned min) {
+ Mutex::Locker l(lock);
+ min_priority = min;
+ do_queues();
+ }
+
/**
* Requests a reservation
*