diff --git a/include/nuttx/mm/mempool.h b/include/nuttx/mm/mempool.h index acfeca8e3ce..8fdac0358fc 100644 --- a/include/nuttx/mm/mempool.h +++ b/include/nuttx/mm/mempool.h @@ -79,6 +79,17 @@ struct mempool_multiple_s { FAR struct mempool_s *pools; /* The memory pool array */ size_t npools; /* The number of memory pool array elements */ + + /* Private data for multiple memory pool */ + + /* This delta describes the relationship between the block size of each + * mempool in multiple mempool by user initialized. It is automatically + * detected by the mempool_multiple_init function. If the delta is not + * equal to 0, the block size of the pool in the multiple mempool is an + * arithmetic progressions, otherwise it is an increasing progressions. + */ + + size_t delta; }; struct mempoolinfo_s @@ -225,6 +236,9 @@ void mempool_procfs_unregister(FAR struct mempool_procfs_entry_s *entry); * interruptsize, wait. These mempool will be initialized by mempool_init. * The name of all mempool are "name". * + * This function will initialize the member delta by detecting the + * relationship between the each block size of mempool in multiple mempool. + * * Input Parameters: * name - The name of memory pool. * mpool - The handle of the multiple memory pool to be used. diff --git a/mm/mempool/mempool_multiple.c b/mm/mempool/mempool_multiple.c index 220149ea0b4..34a95417963 100644 --- a/mm/mempool/mempool_multiple.c +++ b/mm/mempool/mempool_multiple.c @@ -44,6 +44,13 @@ mempool_multiple_find(FAR struct mempool_multiple_s *mpool, size_t size) size_t left = 0; size_t mid; + if (mpool->delta != 0) + { + left = mpool->pools[0].blocksize; + mid = (size - left + mpool->delta - 1) / mpool->delta; + return mid < right ? &mpool->pools[mid] : NULL; + } + while (left < right) { mid = (left + right) >> 1; @@ -79,6 +86,9 @@ mempool_multiple_find(FAR struct mempool_multiple_s *mpool, size_t size) * interruptsize, wait. These mempool will be initialized by mempool_init. * The name of all mempool are "name". * + * This function will initialize the member delta by detecting the + * relationship between the each block size of mempool in multiple mempool. + * * Input Parameters: * name - The name of memory pool. * mpool - The handle of the multiple memory pool to be used. @@ -95,6 +105,20 @@ int mempool_multiple_init(FAR struct mempool_multiple_s *mpool, DEBUGASSERT(mpool != NULL && mpool->pools != NULL); + mpool->delta = 0; + for (i = 1; i < mpool->npools; i++) + { + size_t delta = mpool->pools[i].blocksize - + mpool->pools[i - 1].blocksize; + if (mpool->delta != 0 && delta != mpool->delta) + { + mpool->delta = 0; + break; + } + + mpool->delta = delta; + } + for (i = 0; i < mpool->npools; i++) { int ret = mempool_init(mpool->pools + i, name);