diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 4bc921ceb..924aa4fe0 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -1060,7 +1060,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } if (sCount) diff --git a/src/core/common/message.cpp b/src/core/common/message.cpp index b4e6dfdaa..eb3ac6ed3 100644 --- a/src/core/common/message.cpp +++ b/src/core/common/message.cpp @@ -38,88 +38,82 @@ namespace Thread { -static Buffer *NewBuffer(void); -static ThreadError FreeBuffers(Buffer *aBuffer); -static ThreadError ReclaimBuffers(int aNumBuffers); +MessagePool::MessagePool(void) +{ + mFreeBuffers = mBuffers; -static int sNumFreeBuffers; -static Buffer sBuffers[kNumBuffers]; -static Buffer *sFreeBuffers; -static MessageList sAll; + for (int i = 0; i < kNumBuffers - 1; i++) + { + mBuffers[i].SetNextBuffer(&mBuffers[i + 1]); + } -Buffer *NewBuffer(void) + mBuffers[kNumBuffers - 1].SetNextBuffer(NULL); + mNumFreeBuffers = kNumBuffers; +} + +Message *MessagePool::New(uint8_t aType, uint16_t aReserved) +{ + Message *message = NULL; + + VerifyOrExit((message = static_cast(NewBuffer())) != NULL, ;); + + memset(message, 0, sizeof(*message)); + message->SetMessagePool(this); + message->SetType(aType); + message->SetReserved(aReserved); + message->SetLinkSecurityEnabled(true); + + if (message->SetLength(0) != kThreadError_None) + { + Free(message); + message = NULL; + } + +exit: + return message; +} + +ThreadError MessagePool::Free(Message *aMessage) +{ + assert(aMessage->GetMessageList(MessageInfo::kListAll).mList == NULL && + aMessage->GetMessageList(MessageInfo::kListInterface).mList == NULL); + return FreeBuffers(static_cast(aMessage)); +} + +Buffer *MessagePool::NewBuffer(void) { Buffer *buffer = NULL; - VerifyOrExit(sFreeBuffers != NULL, ;); + VerifyOrExit(mFreeBuffers != NULL, ;); - buffer = sFreeBuffers; - sFreeBuffers = sFreeBuffers->GetNextBuffer(); + buffer = mFreeBuffers; + mFreeBuffers = mFreeBuffers->GetNextBuffer(); buffer->SetNextBuffer(NULL); - sNumFreeBuffers--; + mNumFreeBuffers--; exit: return buffer; } -ThreadError FreeBuffers(Buffer *aBuffer) +ThreadError MessagePool::FreeBuffers(Buffer *aBuffer) { Buffer *tmpBuffer; while (aBuffer != NULL) { tmpBuffer = aBuffer->GetNextBuffer(); - aBuffer->SetNextBuffer(sFreeBuffers); - sFreeBuffers = aBuffer; - sNumFreeBuffers++; + aBuffer->SetNextBuffer(mFreeBuffers); + mFreeBuffers = aBuffer; + mNumFreeBuffers++; aBuffer = tmpBuffer; } return kThreadError_None; } -ThreadError ReclaimBuffers(int aNumBuffers) +ThreadError MessagePool::ReclaimBuffers(int aNumBuffers) { - return (aNumBuffers <= sNumFreeBuffers) ? kThreadError_None : kThreadError_NoBufs; -} - -ThreadError Message::Init(void) -{ - sFreeBuffers = sBuffers; - - for (int i = 0; i < kNumBuffers - 1; i++) - { - sBuffers[i].SetNextBuffer(&sBuffers[i + 1]); - } - - sBuffers[kNumBuffers - 1].SetNextBuffer(NULL); - sNumFreeBuffers = kNumBuffers; - - return kThreadError_None; -} - -Message *Message::New(uint8_t aType, uint16_t aReserved) -{ - Message *message = NULL; - - VerifyOrExit((message = reinterpret_cast(NewBuffer())) != NULL, ;); - - memset(message, 0, sizeof(*message)); - message->SetType(aType); - message->SetReserved(aReserved); - message->SetLinkSecurityEnabled(true); - - VerifyOrExit(message->SetLength(0) == kThreadError_None, Message::Free(*message)); - -exit: - return message; -} - -ThreadError Message::Free(Message &aMessage) -{ - assert(aMessage.GetMessageList(MessageInfo::kListAll).mList == NULL && - aMessage.GetMessageList(MessageInfo::kListInterface).mList == NULL); - return FreeBuffers(reinterpret_cast(&aMessage)); + return (aNumBuffers <= mNumFreeBuffers) ? kThreadError_None : kThreadError_NoBufs; } ThreadError Message::ResizeMessage(uint16_t aLength) @@ -135,7 +129,7 @@ ThreadError Message::ResizeMessage(uint16_t aLength) { if (curBuffer->GetNextBuffer() == NULL) { - curBuffer->SetNextBuffer(NewBuffer()); + curBuffer->SetNextBuffer(GetMessagePool()->NewBuffer()); VerifyOrExit(curBuffer->GetNextBuffer() != NULL, error = kThreadError_NoBufs); } @@ -148,12 +142,17 @@ ThreadError Message::ResizeMessage(uint16_t aLength) curBuffer = curBuffer->GetNextBuffer(); lastBuffer->SetNextBuffer(NULL); - FreeBuffers(curBuffer); + GetMessagePool()->FreeBuffers(curBuffer); exit: return error; } +ThreadError Message::Free(void) +{ + return GetMessagePool()->Free(this); +} + Message *Message::GetNext(void) const { return GetMessageList(MessageInfo::kListInterface).mNext; @@ -181,7 +180,7 @@ ThreadError Message::SetLength(uint16_t aLength) bufs -= (((totalLengthCurrent - kHeadBufferDataSize) - 1) / kBufferDataSize) + 1; } - SuccessOrExit(error = ReclaimBuffers(bufs)); + SuccessOrExit(error = GetMessagePool()->ReclaimBuffers(bufs)); SuccessOrExit(error = ResizeMessage(totalLengthRequest)); mInfo.mLength = aLength; @@ -292,7 +291,7 @@ uint16_t Message::Read(uint16_t aOffset, uint16_t aLength, void *aBuf) const aLength -= bytesToCopy; bytesCopied += bytesToCopy; - aBuf = reinterpret_cast(aBuf) + bytesToCopy; + aBuf = static_cast(aBuf) + bytesToCopy; aOffset = 0; } @@ -328,7 +327,7 @@ uint16_t Message::Read(uint16_t aOffset, uint16_t aLength, void *aBuf) const aLength -= bytesToCopy; bytesCopied += bytesToCopy; - aBuf = reinterpret_cast(aBuf) + bytesToCopy; + aBuf = static_cast(aBuf) + bytesToCopy; curBuffer = curBuffer->GetNextBuffer(); aOffset = 0; @@ -367,7 +366,7 @@ int Message::Write(uint16_t aOffset, uint16_t aLength, const void *aBuf) aLength -= bytesToCopy; bytesCopied += bytesToCopy; - aBuf = reinterpret_cast(aBuf) + bytesToCopy; + aBuf = static_cast(aBuf) + bytesToCopy; aOffset = 0; } @@ -403,7 +402,7 @@ int Message::Write(uint16_t aOffset, uint16_t aLength, const void *aBuf) aLength -= bytesToCopy; bytesCopied += bytesToCopy; - aBuf = reinterpret_cast(aBuf) + bytesToCopy; + aBuf = static_cast(aBuf) + bytesToCopy; curBuffer = curBuffer->GetNextBuffer(); aOffset = 0; @@ -694,7 +693,7 @@ Message *MessageQueue::GetHead(void) const ThreadError MessageQueue::Enqueue(Message &aMessage) { - aMessage.GetMessageList(MessageInfo::kListAll).mList = &sAll; + aMessage.GetMessageList(MessageInfo::kListAll).mList = &aMessage.GetMessagePool()->mAll; aMessage.GetMessageList(MessageInfo::kListInterface).mList = &mInterface; AddToList(MessageInfo::kListAll, aMessage); AddToList(MessageInfo::kListInterface, aMessage); diff --git a/src/core/common/message.hpp b/src/core/common/message.hpp index 0c1b2fe02..94f29238a 100644 --- a/src/core/common/message.hpp +++ b/src/core/common/message.hpp @@ -61,6 +61,7 @@ enum }; class Message; +class MessagePool; /** * This structure contains pointers to the head and tail of a Message list. @@ -98,6 +99,7 @@ struct BufferHeader */ struct MessageInfo { + MessagePool *mMessagePool; ///< Identifies the message pool for this message. enum { kListAll = 0, ///< Identifies the all messages list. @@ -200,6 +202,7 @@ private: */ class Message: private Buffer { + friend class MessagePool; friend class MessageQueue; public: @@ -210,6 +213,12 @@ public: kTypeMacDataPoll = 2, ///< A MAC data poll message }; + /** + * This method frees this message buffer. + * + */ + ThreadError Free(void); + /** * This method returns a pointer to the next message in the same interface list. * @@ -508,35 +517,11 @@ public: */ uint16_t UpdateChecksum(uint16_t aChecksum, uint16_t aOffset, uint16_t aLength) const; - /** - * This static method is used to initialize the message buffer pool. - * - */ - static ThreadError Init(void); - - /** - * This static method is used to obtain a new message. - * - * @param[in] aType The message type. - * @param[in] aReserveHeader The number of header bytes to reserve. - * - * @returns A pointer to the message or NULL if no message buffers are available. - * - */ - static Message *New(uint8_t aType, uint16_t aReserveHeader); - - /** - * This static method is used to free a message and return all message buffers to the buffer pool. - * - * @param[in] aMessage The message to free. - * - * @retval kThreadError_None Successfully freed the message. - * @retval kThreadError_InvalidArgs The message is already freed. - * - */ - static ThreadError Free(Message &aMessage); - private: + MessagePool *GetMessagePool(void) { return mInfo.mMessagePool; } + + void SetMessagePool(MessagePool *aMessagePool) { mInfo.mMessagePool = aMessagePool; } + /** * This method returns a reference to a message list. * @@ -664,6 +649,51 @@ private: MessageList mInterface; ///< The instance-specific message list. }; +class MessagePool +{ + friend class Message; + friend class MessageQueue; + +public: + /** + * This constructor initializes the object. + * + */ + MessagePool(void); + + /** + * This method is used to obtain a new message. + * + * @param[in] aType The message type. + * @param[in] aReserveHeader The number of header bytes to reserve. + * + * @returns A pointer to the message or NULL if no message buffers are available. + * + */ + Message *New(uint8_t aType, uint16_t aReserveHeader); + + /** + * This method is used to free a message and return all message buffers to the buffer pool. + * + * @param[in] aMessage The message to free. + * + * @retval kThreadError_None Successfully freed the message. + * @retval kThreadError_InvalidArgs The message is already freed. + * + */ + ThreadError Free(Message *aMessage); + +private: + Buffer *NewBuffer(void); + ThreadError FreeBuffers(Buffer *aBuffer); + ThreadError ReclaimBuffers(int aNumBuffers); + + int mNumFreeBuffers; + Buffer mBuffers[kNumBuffers]; + Buffer *mFreeBuffers; + MessageList mAll; +}; + /** * @} * diff --git a/src/core/net/icmp6.cpp b/src/core/net/icmp6.cpp index 08dbe902a..5d283e9b4 100644 --- a/src/core/net/icmp6.cpp +++ b/src/core/net/icmp6.cpp @@ -137,7 +137,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -232,7 +232,7 @@ exit: if (error != kThreadError_None && replyMessage != NULL) { - Message::Free(*replyMessage); + replyMessage->Free(); } return error; diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index e8f2460ca..d2497ad01 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -63,7 +63,7 @@ Ip6::Ip6(void): Message *Ip6::NewMessage(uint16_t reserved) { - return Message::New(Message::kTypeIp6, sizeof(Header) + sizeof(HopByHopHeader) + sizeof(OptionMpl) + reserved); + return mMessagePool.New(Message::kTypeIp6, sizeof(Header) + sizeof(HopByHopHeader) + sizeof(OptionMpl) + reserved); } void Ip6::SetForwardingEnabled(bool aEnable) @@ -385,7 +385,7 @@ exit: if (error != kThreadError_None && messageCopy != NULL) { - Message::Free(*messageCopy); + messageCopy->Free(); } } @@ -505,7 +505,7 @@ exit: if (error != kThreadError_None || !forward) { - Message::Free(message); + message.Free(); } return error; diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index 69216e1da..305f716b2 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -327,6 +327,7 @@ public: Icmp mIcmp; Udp mUdp; + MessagePool mMessagePool; TaskletScheduler mTaskletScheduler; TimerScheduler mTimerScheduler; diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index a54dc50f1..1b6905024 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -872,7 +872,6 @@ ThreadError otEnable(void) VerifyOrExit(!mEnabled, error = kThreadError_InvalidState); otLogInfoApi("otEnable\n"); - Message::Init(); sIp6 = new(&sIp6Raw) Ip6::Ip6; sThreadNetif = new(&sThreadNetifRaw) ThreadNetif(*sIp6); mEnabled = true; @@ -1075,7 +1074,7 @@ otMessage otNewUdpMessage(void) ThreadError otFreeMessage(otMessage aMessage) { - return Message::Free(*static_cast(aMessage)); + return static_cast(aMessage)->Free(); } uint16_t otGetMessageLength(otMessage aMessage) diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index f6240e79b..46d805135 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -213,7 +213,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -338,7 +338,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } @@ -393,7 +393,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -428,7 +428,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } @@ -624,7 +624,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 69be3f478..ad823db8a 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -113,13 +113,13 @@ ThreadError MeshForwarder::Stop() while ((message = mSendQueue.GetHead()) != NULL) { mSendQueue.Dequeue(*message); - Message::Free(*message); + message->Free(); } while ((message = mReassemblyList.GetHead()) != NULL) { mReassemblyList.Dequeue(*message); - Message::Free(*message); + message->Free(); } mEnabled = false; @@ -157,7 +157,7 @@ void MeshForwarder::HandleResolved(const Ip6::Address &aEid, ThreadError aError) } else { - Message::Free(*cur); + cur->Free(); } } } @@ -347,7 +347,7 @@ Message *MeshForwarder::GetDirectTransmission() case kThreadError_Drop: case kThreadError_NoBufs: mSendQueue.Dequeue(*curMessage); - Message::Free(*curMessage); + curMessage->Free(); continue; default: @@ -620,7 +620,7 @@ void MeshForwarder::HandlePollTimer() { Message *message; - if ((message = Message::New(Message::kTypeMacDataPoll, 0)) != NULL) + if ((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeMacDataPoll, 0)) != NULL) { SendMessage(*message); otLogInfoMac("Sent poll\n"); @@ -1048,7 +1048,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame) if (mSendMessage->GetDirectTransmission() == false && mSendMessage->IsChildPending() == false) { mSendQueue.Dequeue(*mSendMessage); - Message::Free(*mSendMessage); + mSendMessage->Free(); } mScheduleTransmissionTask.Post(); @@ -1079,7 +1079,7 @@ void MeshForwarder::HandleDiscoverTimer(void) if (mScanChannel > kPhyMaxChannel) { mSendQueue.Dequeue(*mSendMessage); - Message::Free(*mSendMessage); + mSendMessage->Free(); mMac.SetChannel(mRestoreChannel); mScanning = false; mMle.HandleDiscoverComplete(); @@ -1235,7 +1235,8 @@ void MeshForwarder::HandleMesh(uint8_t *aFrame, uint8_t aFrameLength, const Thre meshHeader->SetHopsLeft(meshHeader->GetHopsLeft() - 1); - VerifyOrExit((message = Message::New(Message::kType6lowpan, 0)) != NULL, error = kThreadError_Drop); + VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kType6lowpan, 0)) != NULL, + error = kThreadError_Drop); SuccessOrExit(error = message->SetLength(aFrameLength)); message->Write(0, aFrameLength, aFrame); message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity); @@ -1248,7 +1249,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } @@ -1296,7 +1297,8 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, aFrame += fragmentHeader->GetHeaderLength(); aFrameLength -= fragmentHeader->GetHeaderLength(); - VerifyOrExit((message = Message::New(Message::kTypeIp6, 0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL, + error = kThreadError_NoBufs); message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity); message->SetPanId(aMessageInfo.mPanId); headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, datagramLength); @@ -1361,7 +1363,7 @@ exit: } else if (message != NULL) { - Message::Free(*message); + message->Free(); } } @@ -1388,7 +1390,7 @@ void MeshForwarder::HandleReassemblyTimer() else { mReassemblyList.Dequeue(*message); - Message::Free(*message); + message->Free(); } } @@ -1407,7 +1409,8 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength, int headerLength; uint16_t ip6PayloadLength; - VerifyOrExit((message = Message::New(Message::kTypeIp6, 0)) != NULL, error = kThreadError_NoBufs); + VerifyOrExit((message = mNetif.GetIp6().mMessagePool.New(Message::kTypeIp6, 0)) != NULL, + error = kThreadError_NoBufs); message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity); message->SetPanId(aMessageInfo.mPanId); @@ -1435,7 +1438,7 @@ exit: } else if (message != NULL) { - Message::Free(*message); + message->Free(); } } diff --git a/src/core/thread/meshcop_dataset_manager.cpp b/src/core/thread/meshcop_dataset_manager.cpp index 71da16edf..dab2a5094 100644 --- a/src/core/thread/meshcop_dataset_manager.cpp +++ b/src/core/thread/meshcop_dataset_manager.cpp @@ -198,7 +198,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -426,7 +426,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -479,7 +479,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -515,7 +515,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } @@ -562,7 +562,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 9ad7259af..ec60aa9d2 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -267,7 +267,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -1134,7 +1134,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return kThreadError_None; @@ -1182,7 +1182,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -1208,7 +1208,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -1292,7 +1292,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -2215,7 +2215,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 36b914a68..c3bcfc73f 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -497,7 +497,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -573,7 +573,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -758,7 +758,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -975,7 +975,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -1748,7 +1748,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return kThreadError_None; @@ -2158,7 +2158,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return kThreadError_None; @@ -2217,7 +2217,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return kThreadError_None; @@ -2266,7 +2266,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; @@ -3164,7 +3164,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } @@ -3231,7 +3231,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } diff --git a/src/core/thread/network_data.cpp b/src/core/thread/network_data.cpp index 085739822..256e46a61 100644 --- a/src/core/thread/network_data.cpp +++ b/src/core/thread/network_data.cpp @@ -640,7 +640,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } return error; diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index a9812be9c..27b309779 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -517,7 +517,7 @@ exit: if (error != kThreadError_None && message != NULL) { - Message::Free(*message); + message->Free(); } } diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 382c10b58..d31a75e05 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -478,7 +478,7 @@ exit: if (message != NULL) { - Message::Free(*message); + message->Free(); } if (errorCode != kThreadError_None) @@ -1076,7 +1076,7 @@ exit: if (message != NULL) { - Message::Free(*message); + message->Free(); } return errorCode; @@ -3103,7 +3103,7 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET_INSECURE(uint8_t header, spin unsigned int frame_len(0); const uint8_t *meta_ptr(NULL); unsigned int meta_len(0); - Message *message(Message::New(Message::kTypeIp6, 0)); + Message *message(sIp6->mMessagePool.New(Message::kTypeIp6, 0)); if (message == NULL) { @@ -3139,7 +3139,7 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET_INSECURE(uint8_t header, spin } else if (message) { - Message::Free(*message); + message->Free(); } if (errorCode == kThreadError_None) @@ -3174,7 +3174,7 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET(uint8_t header, spinel_prop_k unsigned int frame_len(0); const uint8_t *meta_ptr(NULL); unsigned int meta_len(0); - Message *message(Message::New(Message::kTypeIp6, 0)); + Message *message(sIp6->mMessagePool.New(Message::kTypeIp6, 0)); if (message == NULL) { @@ -3210,7 +3210,7 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET(uint8_t header, spinel_prop_k } else if (message) { - Message::Free(*message); + message->Free(); } if (errorCode == kThreadError_None) diff --git a/src/ncp/ncp_buffer.cpp b/src/ncp/ncp_buffer.cpp index 95913be01..84d480745 100644 --- a/src/ncp/ncp_buffer.cpp +++ b/src/ncp/ncp_buffer.cpp @@ -78,13 +78,13 @@ void NcpFrameBuffer::Clear(void) while ((message = mWriteFrameMessageQueue.GetHead()) != NULL) { mWriteFrameMessageQueue.Dequeue(*message); - Message::Free(*message); + message->Free(); } while ((message = mMessageQueue.GetHead()) != NULL) { mMessageQueue.Dequeue(*message); - Message::Free(*message); + message->Free(); } if (!wasEmpty) @@ -249,7 +249,7 @@ void NcpFrameBuffer::InFrameDiscard(void) while ((message = mWriteFrameMessageQueue.GetHead()) != NULL) { mWriteFrameMessageQueue.Dequeue(*message); - Message::Free(*message); + message->Free(); } } @@ -572,7 +572,7 @@ ThreadError NcpFrameBuffer::OutFrameRemove(void) if ((message = mMessageQueue.GetHead()) != NULL) { mMessageQueue.Dequeue(*message); - Message::Free(*message); + message->Free(); } } diff --git a/tests/unit/test_lowpan.cpp b/tests/unit/test_lowpan.cpp index fecc78107..29dea609e 100644 --- a/tests/unit/test_lowpan.cpp +++ b/tests/unit/test_lowpan.cpp @@ -117,7 +117,7 @@ void TestLowpanIphc(void) frame.GetSrcAddr(macSource); frame.GetDstAddr(macDest); - VerifyOrQuit((message = sIp6.NewMessage(0)) != NULL, + VerifyOrQuit((message = sIp6.mMessagePool.New(Message::kTypeIp6, 0)) != NULL, "6lo: Ip6::NewMessage failed"); // ===> Test Lowpan::Decompress @@ -154,7 +154,7 @@ void TestLowpanIphc(void) VerifyOrQuit(memcmp(frame.GetPayload(), result, static_cast(compressBytes)) == 0, "6lo: Lowpan::Compress failed"); - SuccessOrQuit(Message::Free(*message), "6lo: Message:Free failed"); + SuccessOrQuit(message->Free(), "6lo: Message:Free failed"); printf("PASS\n\n"); } @@ -165,8 +165,6 @@ void TestLowpanIphc(void) int main(void) { - Message::Init(); - TestLowpanIphc(); printf("All tests passed\n"); diff --git a/tests/unit/test_message.cpp b/tests/unit/test_message.cpp index 921822e8e..a828cfa7f 100644 --- a/tests/unit/test_message.cpp +++ b/tests/unit/test_message.cpp @@ -42,18 +42,17 @@ extern "C" void otPlatDiagAlarmFired(void) void TestMessage(void) { + Thread::MessagePool messagePool; Thread::Message *message; uint8_t writeBuffer[1024]; uint8_t readBuffer[1024]; - Thread::Message::Init(); - for (unsigned i = 0; i < sizeof(writeBuffer); i++) { writeBuffer[i] = static_cast(random()); } - VerifyOrQuit((message = Thread::Message::New(Thread::Message::kTypeIp6, 0)) != NULL, + VerifyOrQuit((message = messagePool.New(Thread::Message::kTypeIp6, 0)) != NULL, "Message::New failed\n"); SuccessOrQuit(message->SetLength(sizeof(writeBuffer)), "Message::SetLength failed\n"); @@ -65,7 +64,7 @@ void TestMessage(void) "Message compare failed\n"); VerifyOrQuit(message->GetLength() == 1024, "Message::GetLength failed\n"); - SuccessOrQuit(Thread::Message::Free(*message), + SuccessOrQuit(message->Free(), "Message::Free failed\n"); } diff --git a/tests/unit/test_ncp_buffer.cpp b/tests/unit/test_ncp_buffer.cpp index ef09246dd..6a216c7b4 100644 --- a/tests/unit/test_ncp_buffer.cpp +++ b/tests/unit/test_ncp_buffer.cpp @@ -56,6 +56,7 @@ static const uint8_t sHelloText[] = "Hello there!"; static const uint8_t sMottoText[] = "Think good thoughts, say good words, do good deeds!"; static const uint8_t sMysteryText[] = "4871(\\):|(3$}{4|/4/2%14(\\)"; +static MessagePool sMessagePool; struct CallbackContext { @@ -63,12 +64,6 @@ struct CallbackContext uint16_t mNonEmptyCount; // Number of times BufferNonEmptyCallback is invoked. }; -// Initialize the test -void InitTest(void) -{ - Message::Init(); -} - void BufferDidGetEmptyCallback(void *aContext, NcpFrameBuffer *aNcpBuffer) { CallbackContext *callbackContext = reinterpret_cast(aContext); @@ -147,7 +142,7 @@ void WriteTestFrame1(NcpFrameBuffer &aNcpBuffer) { Message *message; - message = Message::New(Message::kTypeIp6, 0); + message = sMessagePool.New(Message::kTypeIp6, 0); VerifyOrQuit(message != NULL, "Null Message"); SuccessOrQuit(message->SetLength(sizeof(sMottoText)), "Could not set the length of message."); message->Write(0, sizeof(sMottoText), sMottoText); @@ -182,12 +177,12 @@ void WriteTestFrame2(NcpFrameBuffer &aNcpBuffer) Message *message1; Message *message2; - message1 = Message::New(Message::kTypeIp6, 0); + message1 = sMessagePool.New(Message::kTypeIp6, 0); VerifyOrQuit(message1 != NULL, "Null Message"); SuccessOrQuit(message1->SetLength(sizeof(sMysteryText)), "Could not set the length of message."); message1->Write(0, sizeof(sMysteryText), sMysteryText); - message2 = Message::New(Message::kTypeIp6, 0); + message2 = sMessagePool.New(Message::kTypeIp6, 0); VerifyOrQuit(message2 != NULL, "Null Message"); SuccessOrQuit(message2->SetLength(sizeof(sHelloText)), "Could not set the length of message."); message2->Write(0, sizeof(sHelloText), sHelloText); @@ -219,7 +214,7 @@ void WriteTestFrame3(NcpFrameBuffer &aNcpBuffer) { Message *message1; - message1 = Message::New(Message::kTypeIp6, 0); + message1 = sMessagePool.New(Message::kTypeIp6, 0); VerifyOrQuit(message1 != NULL, "Null Message"); // An empty message with no content. @@ -344,7 +339,7 @@ void TestNcpFrameBuffer(void) ncpBuffer.InFrameBegin(); ncpBuffer.InFrameFeedData(sHelloText, sizeof(sHelloText)); - message = Message::New(Message::kTypeIp6, 0); + message = sMessagePool.New(Message::kTypeIp6, 0); VerifyOrQuit(message != NULL, "Null Message"); SuccessOrQuit(message->SetLength(sizeof(sMysteryText)), "Could not set the length of message."); message->Write(0, sizeof(sMysteryText), sMysteryText); @@ -475,7 +470,6 @@ void TestNcpFrameBuffer(void) int main(void) { - Thread::InitTest(); Thread::TestNcpFrameBuffer(); printf("\nAll tests passed.\n"); return 0;