Since we're appending only strictly increasing integers, the lowest
socketId is always at the front of the list (if that exists).
hasSocketsBelowId also had a off-by-one error. This had no effect on the
code since a socketId equal to the current _socketId cannot be in the
_waiting list.
Reorder processWaiting's handling of requests:
- If the socketId is one the request might have been waiting for,
check responseAvailable.
- Otherwise, if there is at least one socket we need to wait for,
continue waiting.
- Otherwise, responseUnavailable.
The former order was:
- If there are no sockets left from before this request was made,
responseUnavailable.
- If the socketId is one the request might have been waiting for,
check responseAvailable.
- Otherwise, continue waiting.
The change was necessary as the lowestSocketId no longer includes the
socketId that was just removed. In addition, the new order also matches
the if-else chain in IdentServer::respond.
responseUnavailable(request);
} else if (responseAvailable(request)) {
// success
responseUnavailable(request);
} else if (responseAvailable(request)) {
// success
- } else if (hasSocketsBelowId(transactionId)) {
+ } else if (lowestSocketId() < transactionId) {
_requestQueue.emplace_back(request);
} else {
responseUnavailable(request);
_requestQueue.emplace_back(request);
} else {
responseUnavailable(request);
-bool IdentServer::hasSocketsBelowId(qint64 id) {
- return std::any_of(_waiting.begin(), _waiting.end(), [=](qint64 socketId) {
- return socketId <= id;
- });
+qint64 IdentServer::lowestSocketId() {
+ if (_waiting.empty()) {
+ return std::numeric_limits<qint64>::max();
+ }
+
+ return _waiting.front();
}
void IdentServer::removeWaitingSocket(qint64 socketId) {
}
void IdentServer::removeWaitingSocket(qint64 socketId) {
}
void IdentServer::processWaiting(qint64 socketId) {
}
void IdentServer::processWaiting(qint64 socketId) {
- qint64 lowestSocketId = std::numeric_limits<qint64 >::max();
- for (qint64 id : _waiting) {
- if (id < lowestSocketId) {
- lowestSocketId = id;
- }
- }
removeWaitingSocket(socketId);
_requestQueue.remove_if([=](Request request) {
removeWaitingSocket(socketId);
_requestQueue.remove_if([=](Request request) {
- if (request.transactionId < lowestSocketId) {
- responseUnavailable(request);
+ if (socketId < request.transactionId && responseAvailable(request)) {
- } else if (request.transactionId > socketId) {
- return responseAvailable(request);
- } else {
+ } else if (lowestSocketId() < request.transactionId) {
+ } else {
+ responseUnavailable(request);
+ return true;
QString sysIdentForIdentity(const CoreIdentity *identity) const;
QString sysIdentForIdentity(const CoreIdentity *identity) const;
- bool hasSocketsBelowId(qint64 socketId);
+ qint64 lowestSocketId();
void processWaiting(qint64 socketId);
void processWaiting(qint64 socketId);