tbm_bo: check the bo which has the same bo_data
[platform/core/uifw/libtbm.git] / src / tbm_bo.c
index 0f2b138..5cc343d 100644 (file)
@@ -618,7 +618,7 @@ tbm_bo_alloc_with_surface(tbm_bufmgr bufmgr, int width, int height, int format,
 tbm_bo
 tbm_bo_alloc_with_bo_data(tbm_bufmgr bufmgr, tbm_backend_bo_data *bo_data, int flags)
 {
-       tbm_bo bo;
+       tbm_bo bo, bo2;
 
        _tbm_bufmgr_mutex_lock();
        _tbm_set_last_result(TBM_ERROR_NONE);
@@ -626,6 +626,19 @@ tbm_bo_alloc_with_bo_data(tbm_bufmgr bufmgr, tbm_backend_bo_data *bo_data, int f
        TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
        TBM_BO_RETURN_VAL_IF_FAIL(bo_data, NULL);
 
+       // return an existed bo if the bo is already created with the same bo_data.
+       if (!LIST_IS_EMPTY(&bufmgr->bo_list)) {
+               LIST_FOR_EACH_ENTRY(bo2, &bufmgr->bo_list, item_link) {
+                       if (bo2->bo_data == bo_data) {
+                               TBM_ERR("find bo(%p) ref(%d) flag(%s) in list\n",
+                                               bo2, bo2->ref_cnt, _tbm_flag_to_str(bo2->flags));
+                               bo2->ref_cnt++;
+                               _tbm_bufmgr_mutex_unlock();
+                               return bo2;
+                       }
+               }
+       }
+
        bo = calloc(1, sizeof(struct _tbm_bo));
        if (!bo) {
                /* LCOV_EXCL_START */