From 2204012fb3de02bc08cc13bd2e79b03e6f250ec9 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Wed, 12 May 2021 20:17:04 +0800 Subject: [PATCH] [mpp_buffer]: Fix error on buffer group reset At buffer create stage and ref_count is still zero if buffer group reset happens the just created buffer will be marked discard and cause error. Change-Id: Idc163f81edd055d8cc33ce6d80ca041adc973878 Signed-off-by: Jeffy Chen Signed-off-by: Herman Chen --- mpp/base/mpp_buffer_impl.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/mpp/base/mpp_buffer_impl.cpp b/mpp/base/mpp_buffer_impl.cpp index f03163a2..acdcc21c 100644 --- a/mpp/base/mpp_buffer_impl.cpp +++ b/mpp/base/mpp_buffer_impl.cpp @@ -385,11 +385,20 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller, pthread_mutex_lock(&group->buf_lock); p->buffer_id = group->buffer_id++; INIT_LIST_HEAD(&p->list_status); - list_add_tail(&p->list_status, &group->list_unused); + + if (buffer) { + p->ref_count++; + p->used = 1; + list_add_tail(&p->list_status, &group->list_used); + group->count_used++; + *buffer = p; + } else { + list_add_tail(&p->list_status, &group->list_unused); + group->count_unused++; + } group->usage += info->size; group->buffer_count++; - group->count_unused++; pthread_mutex_unlock(&group->buf_lock); buf_add_log(p, (group->mode == MPP_BUFFER_INTERNAL) ? (BUF_CREATE) : (BUF_COMMIT), caller); @@ -397,11 +406,6 @@ MPP_RET mpp_buffer_create(const char *tag, const char *caller, if (group->mode == MPP_BUFFER_INTERNAL) MppBufferService::get_instance()->inc_total(info->size); - if (buffer) { - inc_buffer_ref(p, caller); - *buffer = p; - } - if (group->callback) group->callback(group->arg, group); RET: @@ -498,7 +502,15 @@ MppBufferImpl *mpp_buffer_get_unused(MppBufferGroupImpl *p, size_t size) size, pos->buffer_id, pos->info.size); if (pos->info.size >= size) { buffer = pos; - inc_buffer_ref(buffer, __FUNCTION__); + pthread_mutex_lock(&buffer->lock); + buf_add_log(buffer, BUF_REF_INC, __FUNCTION__); + buffer->ref_count++; + buffer->used = 1; + list_del_init(&buffer->list_status); + list_add_tail(&buffer->list_status, &p->list_used); + p->count_used++; + p->count_unused--; + pthread_mutex_unlock(&buffer->lock); found = 1; break; } else {