[mpp_mem_pool]: Add put_pool function

Change-Id: I8b0723c90969c781537f7ff1a7815c241c9f1481
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2021-05-06 09:56:40 +08:00
parent 03f94da031
commit ca0b9b8264
2 changed files with 46 additions and 20 deletions

View File

@@ -28,6 +28,8 @@ extern "C" {
#endif #endif
MppMemPool mpp_mem_pool_init(size_t size); MppMemPool mpp_mem_pool_init(size_t size);
void mpp_mem_pool_deinit(MppMemPool pool);
void *mpp_mem_pool_get(MppMemPool pool); void *mpp_mem_pool_get(MppMemPool pool);
void mpp_mem_pool_put(MppMemPool pool, void *p); void mpp_mem_pool_put(MppMemPool pool, void *p);

View File

@@ -53,6 +53,7 @@ public:
return &pool_service; return &pool_service;
} }
MppMemPoolImpl *get_pool(size_t size); MppMemPoolImpl *get_pool(size_t size);
void put_pool(MppMemPoolImpl *impl);
private: private:
MppMemPoolService(); MppMemPoolService();
@@ -72,28 +73,9 @@ MppMemPoolService::~MppMemPoolService()
{ {
if (!list_empty(&mLink)) { if (!list_empty(&mLink)) {
MppMemPoolImpl *pos, *n; MppMemPoolImpl *pos, *n;
MppMemPoolNode *node, *m;
list_for_each_entry_safe(pos, n, &mLink, MppMemPoolImpl, service_link) { list_for_each_entry_safe(pos, n, &mLink, MppMemPoolImpl, service_link) {
if (!list_empty(&pos->unused)) { put_pool(pos);
list_for_each_entry_safe(node, m, &pos->unused, MppMemPoolNode, list) {
MPP_FREE(node);
pos->unused_count--;
}
}
if (!list_empty(&pos->used)) {
mpp_err_f("found %d used buffer size %d\n",
pos->used_count, pos->size);
list_for_each_entry_safe(node, m, &pos->used, MppMemPoolNode, list) {
MPP_FREE(pos);
pos->used_count--;
}
}
mpp_assert(!pos->used_count);
mpp_assert(!pos->unused_count);
} }
} }
} }
@@ -124,11 +106,53 @@ MppMemPoolImpl *MppMemPoolService::get_pool(size_t size)
return pool; return pool;
} }
void MppMemPoolService::put_pool(MppMemPoolImpl *impl)
{
MppMemPoolNode *node, *m;
if (impl != impl->check) {
mpp_err_f("invalid mem impl %p check %p\n", impl, impl->check);
return ;
}
if (!list_empty(&impl->unused)) {
list_for_each_entry_safe(node, m, &impl->unused, MppMemPoolNode, list) {
MPP_FREE(node);
impl->unused_count--;
}
}
if (!list_empty(&impl->used)) {
mpp_err_f("found %d used buffer size %d\n",
impl->used_count, impl->size);
list_for_each_entry_safe(node, m, &impl->used, MppMemPoolNode, list) {
MPP_FREE(impl);
impl->used_count--;
}
}
mpp_assert(!impl->used_count);
mpp_assert(!impl->unused_count);
{
AutoMutex auto_lock(mLock);
list_del_init(&impl->service_link);
}
mpp_free(impl);
}
MppMemPool mpp_mem_pool_init(size_t size) MppMemPool mpp_mem_pool_init(size_t size)
{ {
return (MppMemPool)MppMemPoolService::getInstance()->get_pool(size); return (MppMemPool)MppMemPoolService::getInstance()->get_pool(size);
} }
void mpp_mem_pool_deinit(MppMemPool pool)
{
MppMemPoolService::getInstance()->put_pool((MppMemPoolImpl *)pool);
}
void *mpp_mem_pool_get(MppMemPool pool) void *mpp_mem_pool_get(MppMemPool pool)
{ {
MppMemPoolImpl *impl = (MppMemPoolImpl *)pool; MppMemPoolImpl *impl = (MppMemPoolImpl *)pool;