diff --git a/include/platform/messagepool.h b/include/platform/messagepool.h index 808ca370e..418018160 100644 --- a/include/platform/messagepool.h +++ b/include/platform/messagepool.h @@ -63,14 +63,13 @@ extern "C" { #endif /** - * Initialize the platform implemented message pool with the provided buffer list. + * Initialize the platform implemented message pool. * - * @param[in] aFreeBufferList A linked list of free buffers. - * @param[in] aNumFreeBuffers A pointer to an int containing the number of free buffers in aFreeBufferList. - * @param[in] aBufferSize The size in bytes of a Buffer object. + * @param[in] aMinNumFreeBuffers An int containing the minimum number of free buffers desired by OpenThread. + * @param[in] aBufferSize The size in bytes of a Buffer object. * */ -void otPlatMessagePoolInit(struct BufferHeader *aFreeBufferList, int *aNumFreeBuffers, size_t aBufferSize); +void otPlatMessagePoolInit(int aMinNumFreeBuffers, size_t aBufferSize); /** * Allocate a buffer from the platform managed buffer pool. @@ -88,6 +87,14 @@ struct BufferHeader *otPlatMessagePoolNew(void); */ void otPlatMessagePoolFree(struct BufferHeader *aBuffer); +/** + * Get the number of free buffers. + * + * @returns The number of buffers currently free and available to OpenThread. + * + */ +int otPlatMessagePoolNumFreeBuffers(void); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/core/common/message.cpp b/src/core/common/message.cpp index b067b07fc..f7a80d3b6 100644 --- a/src/core/common/message.cpp +++ b/src/core/common/message.cpp @@ -44,6 +44,10 @@ namespace Thread { MessagePool::MessagePool(void) : mAllQueue() { +#if OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT + // Initialize Platform buffer pool management. + otPlatMessagePoolInit(kNumBuffers, sizeof(Buffer)); +#else memset(mBuffers, 0, sizeof(mBuffers)); mFreeBuffers = mBuffers; @@ -55,11 +59,6 @@ MessagePool::MessagePool(void) : mBuffers[kNumBuffers - 1].SetNextBuffer(NULL); mNumFreeBuffers = kNumBuffers; - -#if OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT - // Pass the list of free buffers and a pointer to the count of free buffers - // to the platform for management. - otPlatMessagePoolInit(static_cast(mFreeBuffers), &mNumFreeBuffers, sizeof(Buffer)); #endif } @@ -109,7 +108,7 @@ Buffer *MessagePool::NewBuffer(void) otLogInfoMac("No available message buffer\n"); } -#else // OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT +#else if (mFreeBuffers == NULL) { @@ -121,7 +120,7 @@ Buffer *MessagePool::NewBuffer(void) mFreeBuffers = mFreeBuffers->GetNextBuffer(); buffer->SetNextBuffer(NULL); mNumFreeBuffers--; -#endif // OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT +#endif exit: return buffer; @@ -149,7 +148,15 @@ ThreadError MessagePool::FreeBuffers(Buffer *aBuffer) ThreadError MessagePool::ReclaimBuffers(int aNumBuffers) { - return (aNumBuffers <= mNumFreeBuffers) ? kThreadError_None : kThreadError_NoBufs; + int numFreeBuffers; + +#if OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT + numFreeBuffers = otPlatMessagePoolNumFreeBuffers(); +#else + numFreeBuffers = mNumFreeBuffers; +#endif + + return (aNumBuffers <= numFreeBuffers) ? kThreadError_None : kThreadError_NoBufs; } Message *MessagePool::Iterator::Next(void) const diff --git a/src/core/common/message.hpp b/src/core/common/message.hpp index 868295913..3af12b25d 100644 --- a/src/core/common/message.hpp +++ b/src/core/common/message.hpp @@ -1091,7 +1091,11 @@ public: * @returns The number of free buffers. * */ +#if OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT + uint16_t GetFreeBufferCount(void) const { return static_cast(otPlatMessagePoolNumFreeBuffers()); } +#else uint16_t GetFreeBufferCount(void) const { return static_cast(mNumFreeBuffers); } +#endif private: enum @@ -1104,9 +1108,11 @@ private: ThreadError ReclaimBuffers(int aNumBuffers); PriorityQueue *GetAllMessagesQueue(void) { return &mAllQueue; } +#if OPENTHREAD_CONFIG_PLATFORM_MESSAGE_MANAGEMENT == 0 int mNumFreeBuffers; Buffer mBuffers[kNumBuffers]; Buffer *mFreeBuffers; +#endif PriorityQueue mAllQueue; };