cns.erase(cn);
}
-#warning shouldn't have more than one entry in complete_reqs per io_id
+ if (complete_reqs_set.find(io_id) != complete_reqs_set.end()) {
+ /* already have completion for this io_id, don't allow multiple completions for it */
+ return;
+ }
complete_reqs.push_back(io_completion{io_id, user_info});
cond.Signal();
}
cond.Wait(lock);
}
*io = complete_reqs.front();
+ complete_reqs_set.erase(io->io_id);
complete_reqs.pop_front();
return 0;
}
return false;
}
*io = complete_reqs.front();
+ complete_reqs_set.erase(io->io_id);
complete_reqs.pop_front();
return true;
}
bool intersects(const rgw_io_id& rhs) {
return (id == rhs.id && ((channels | rhs.channels) != 0));
}
+
+ bool operator<(const rgw_io_id& rhs) const {
+ if (id < rhs.id) {
+ return true;
+ }
+ return (id == rhs.id &&
+ channels < rhs.channels);
+ }
};
class RGWIOProvider