diff options
| author | Alan Conway <aconway@apache.org> | 2009-05-06 17:58:50 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2009-05-06 17:58:50 +0000 |
| commit | d37792b0cd112986236addbcde01ee55067c946b (patch) | |
| tree | be815e2111c6e7dfc629e2a8bd1742dceb9f6e81 /cpp/src/qpid/broker/SemanticState.cpp | |
| parent | f4a17848cf8a9129466369eb153511dfd6879380 (diff) | |
| download | qpid-python-d37792b0cd112986236addbcde01ee55067c946b.tar.gz | |
DeliveryRecord optimizations.
Replace linear search with binary search.
Collapse multi-pass mark-then-erase to a signle pass.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@772384 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/SemanticState.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/SemanticState.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/cpp/src/qpid/broker/SemanticState.cpp b/cpp/src/qpid/broker/SemanticState.cpp index 5e41fa3302..3ba76f656e 100644 --- a/cpp/src/qpid/broker/SemanticState.cpp +++ b/cpp/src/qpid/broker/SemanticState.cpp @@ -408,12 +408,13 @@ void SemanticState::requestDispatch(ConsumerImpl& c) outputTasks.activateOutput(); } -void SemanticState::complete(DeliveryRecord& delivery) +bool SemanticState::complete(DeliveryRecord& delivery) { ConsumerImplMap::iterator i = consumers.find(delivery.getTag()); if (i != consumers.end()) { i->second->complete(delivery); } + return delivery.isRedundant(); } void SemanticState::ConsumerImpl::complete(DeliveryRecord& delivery) @@ -440,7 +441,7 @@ void SemanticState::recover(bool requeue) //unconfirmed messages re redelivered and therefore have their //id adjusted, confirmed messages are not and so the ordering //w.r.t id is lost - unacked.sort(); + sort(unacked.begin(), unacked.end()); } } @@ -638,24 +639,23 @@ void SemanticState::accepted(DeliveryId first, DeliveryId last) dtxBuffer->enlist(txAck); //mark the relevant messages as 'ended' in unacked - for_each(range.start, range.end, mem_fun_ref(&DeliveryRecord::setEnded)); - //if the messages are already completed, they can be //removed from the record - unacked.remove_if(mem_fun_ref(&DeliveryRecord::isRedundant)); - + DeliveryRecords::iterator removed = remove_if(range.start, range.end, mem_fun_ref(&DeliveryRecord::setEnded)); + unacked.erase(removed, range.end); } } else { - for_each(range.start, range.end, boost::bind(&DeliveryRecord::accept, _1, (TransactionContext*) 0)); - unacked.remove_if(mem_fun_ref(&DeliveryRecord::isRedundant)); + DeliveryRecords::iterator removed = remove_if(range.start, range.end, boost::bind(&DeliveryRecord::accept, _1, (TransactionContext*) 0)); + unacked.erase(removed, range.end); } } void SemanticState::completed(DeliveryId first, DeliveryId last) { AckRange range = findRange(first, last); - for_each(range.start, range.end, boost::bind(&SemanticState::complete, this, _1)); - unacked.remove_if(mem_fun_ref(&DeliveryRecord::isRedundant)); + + DeliveryRecords::iterator removed = remove_if(range.start, range.end, boost::bind(&SemanticState::complete, this, _1)); + unacked.erase(removed, range.end); requestDispatch(); } |
