RemoteServer code cleanup and logcat cleanup.

This fixes two different logcat messages that would occur when scrubbing
a slider in the UI:

- "Discarding message, message queue overflow."
- "Downloading model..." would repeat itself needlessly
This commit is contained in:
Philip Rideout
2021-03-10 11:42:15 -08:00
parent 8065d18f54
commit 52abe75cfd
4 changed files with 97 additions and 24 deletions

View File

@@ -81,26 +81,36 @@ char const * RemoteServer::peekIncomingLabel() const {
ReceivedMessage const * RemoteServer::peekReceivedMessage() const {
std::lock_guard lock(mReceivedMessagesMutex);
const size_t oldest = mOldestMessageUid;
for (auto msg : mReceivedMessages) { if (msg && msg->messageUid == oldest) return msg; }
return nullptr;
// Find the oldest message in the queue by looking for the lowest id.
// Note that this queue is not a ring buffer, it's just a tiny sparse array.
ReceivedMessage const* oldest = nullptr;
for (auto msg : mReceivedMessages) {
if (msg && (!oldest || msg->messageUid < oldest->messageUid)) oldest = msg;
}
return oldest;
}
ReceivedMessage const * RemoteServer::acquireReceivedMessage() {
std::lock_guard lock(mReceivedMessagesMutex);
const size_t oldest = mOldestMessageUid;
// Find the oldest message in the queue by looking for the lowest id.
ReceivedMessage** oldest = nullptr;
for (auto& msg : mReceivedMessages) {
if (msg && msg->messageUid == oldest) {
if (msg == mIncomingMessage) {
mIncomingMessage = nullptr;
}
auto result = msg;
msg = nullptr;
++mOldestMessageUid;
return result;
}
if (msg && (!oldest || msg->messageUid < (*oldest)->messageUid)) oldest = &msg;
}
return nullptr;
if (!oldest) return nullptr;
// If this message is the most recent download, then mark the download as completed.
ReceivedMessage const * result = *oldest;
if (result == mIncomingMessage) {
mIncomingMessage = nullptr;
}
// Replace the message slot with null and return the message to the caller.
*oldest = nullptr;
return result;
}
void RemoteServer::setIncomingMessage(ReceivedMessage* message) {
@@ -110,13 +120,31 @@ void RemoteServer::setIncomingMessage(ReceivedMessage* message) {
void RemoteServer::enqueueReceivedMessage(ReceivedMessage* message) {
std::lock_guard lock(mReceivedMessagesMutex);
for (auto& msg : mReceivedMessages) {
if (!msg) {
// Check if any unread messages have the same label as the incoming message. If so, it is safe
// to discard the old message and snarf its slot.
ReceivedMessage** empty_slot = nullptr;
for (auto& old_message : mReceivedMessages) {
if (old_message == nullptr) {
empty_slot = &old_message;
continue;
}
if (!strcmp(old_message->label, message->label)) {
releaseReceivedMessage(old_message);
message->messageUid = mNextMessageUid++;
msg = message;
old_message = message;
return;
}
}
// Otherwise use any empty slot in the queue.
if (empty_slot) {
message->messageUid = mNextMessageUid++;
*empty_slot = message;
return;
}
// If there are no empty slots, then discard the message. This basically never happens.
slog.e << "Discarding message, message queue overflow." << io::endl;
}