switched queue to pre-allocating all messages
diff --git a/aos/linux_code/ipc_lib/queue.cc b/aos/linux_code/ipc_lib/queue.cc
index cf2f262..b92ceb9 100644
--- a/aos/linux_code/ipc_lib/queue.cc
+++ b/aos/linux_code/ipc_lib/queue.cc
@@ -118,12 +118,16 @@
data_end_ = 0;
messages_ = 0;
- mem_length_ = queue_length + kExtraMessages;
- pool_length_ = 0;
+ pool_length_ = queue_length + kExtraMessages;
messages_used_ = 0;
msg_length_ = length + sizeof(MessageHeader);
pool_ = static_cast<MessageHeader **>(
- shm_malloc(sizeof(MessageHeader *) * mem_length_));
+ shm_malloc(sizeof(MessageHeader *) * pool_length_));
+ for (int i = 0; i < pool_length_; ++i) {
+ pool_[i] =
+ static_cast<MessageHeader *>(shm_malloc(msg_length_));
+ pool_[i]->index = i;
+ }
if (kFetchDebug) {
printf("made queue %s\n", name);
@@ -521,19 +525,11 @@
void *RawQueue::GetMessage() {
// TODO(brians): Test this function.
MutexLocker locker(&pool_lock_);
- MessageHeader *header;
- if (pool_length_ > messages_used_) {
- header = pool_[messages_used_];
- assert(header->index == messages_used_);
- } else {
- if (pool_length_ >= mem_length_) {
- LOG(FATAL, "overused pool of queue %p\n", this);
- }
- header = pool_[pool_length_] =
- static_cast<MessageHeader *>(shm_malloc(msg_length_));
- ++pool_length_;
- header->index = messages_used_;
+ MessageHeader *const header = pool_[messages_used_];
+ if (messages_used_ >= pool_length_) {
+ LOG(FATAL, "overused pool of queue %p\n", this);
}
+ assert(header->index == messages_used_);
void *msg = reinterpret_cast<uint8_t *>(header) + sizeof(MessageHeader);
header->ref_count = 1;
static_assert(