mirror of
https://github.com/espressif/openthread.git
synced 2026-08-21 18:09:52 +00:00
Improve Platform MessagePool support. (#1171)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<BufferHeader *>(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
|
||||
|
||||
@@ -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<uint16_t>(otPlatMessagePoolNumFreeBuffers()); }
|
||||
#else
|
||||
uint16_t GetFreeBufferCount(void) const { return static_cast<uint16_t>(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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user