fixed a queue message leak
diff --git a/aos/linux_code/ipc_lib/queue.cc b/aos/linux_code/ipc_lib/queue.cc
index 6c8b046..8ab7ced 100644
--- a/aos/linux_code/ipc_lib/queue.cc
+++ b/aos/linux_code/ipc_lib/queue.cc
@@ -251,6 +251,7 @@
if (kWriteDebug) {
printf("queue: not blocking on %p. returning false\n", this);
}
+ DecrementMessageReferenceCount(msg);
return false;
} else if (options & kOverride) {
if (kWriteDebug) {
diff --git a/aos/linux_code/ipc_lib/queue_test.cc b/aos/linux_code/ipc_lib/queue_test.cc
index 65527c8..d05b20a 100644
--- a/aos/linux_code/ipc_lib/queue_test.cc
+++ b/aos/linux_code/ipc_lib/queue_test.cc
@@ -449,5 +449,17 @@
EXPECT_RETURNS(ReadTestMessage, &recycle);
}
+// Makes sure that when a message doesn't get written with kNonBlock it does get
+// freed.
+TEST_F(QueueTest, NonBlockFailFree) {
+ RawQueue *const queue = RawQueue::Fetch("Queue", sizeof(TestMessage), 1, 1);
+
+ void *message1 = queue->GetMessage();
+ void *message2 = queue->GetMessage();
+ ASSERT_TRUE(queue->WriteMessage(message1, RawQueue::kNonBlock));
+ ASSERT_FALSE(queue->WriteMessage(message2, RawQueue::kNonBlock));
+ EXPECT_EQ(message2, queue->GetMessage());
+}
+
} // namespace testing
} // namespace aos