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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user