- if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
- LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) {
- if (bo2->bo_data == bo_data) {
- TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n",
- bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags));
- bo2->ref_cnt++;
- free(bo);
- _tbm_bufmgr_mutex_unlock();
- return bo2;
- }
- }
- }
- bo->bo_data = bo_data;
- } else if (bufmgr->backend_module_data) {
- bo_data = bufmgr->bufmgr_func->bufmgr_import_fd(bufmgr->bufmgr_data, fd, &error);
- if (!bo_data) {
- /* LCOV_EXCL_START */
- TBM_ERR("error: fail to import tbm_bo by tbm_fd(%d). error(%d)\n", fd, error);
- _tbm_set_last_result(error);
- goto import_fail;
- /* LCOV_EXCL_STOP */
- }
-
- if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
- LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) {
- if (bo2->bo_data == bo_data) {
- TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n",
- bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags));
- bo2->ref_cnt++;
- free(bo);
- _tbm_bufmgr_mutex_unlock();
- return bo2;
- }
- }
- }
- bo->bo_data = bo_data;
- } else {
- bo_priv = bufmgr->backend->bo_import_fd(bo, fd);
- if (!bo_priv) {
- /* LCOV_EXCL_START */
- TBM_ERR("error: fail to import tbm_bo by tbm_fd(%d)\n", fd);
- _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
- goto import_fail;
- /* LCOV_EXCL_STOP */
- }
-
- if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
- LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) {
- if (bo2->priv == bo_priv) {
- TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list\n",
- bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags));
- bo2->ref_cnt++;
- free(bo);
- _tbm_bufmgr_mutex_unlock();
- return bo2;
- }
- }
- }
- bo->priv = bo_priv;
+ // return the existed bo2 if bo->bo_data and bo2->bo_data is the same
+ bo2 = tbm_bufmgr_internal_find_bo(bufmgr, bo);
+ if (bo2) {
+ TBM_TRACE_BO("find bo(%p) ref(%d) fd(%d) flag(%s) in list",
+ bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags));
+ bo2->ref_cnt++;
+ free(bo);
+ _tbm_bufmgr_mutex_unlock();
+ return bo2;