tbm_bo: check the bo which has the same bo_data 75/258175/1
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 11 May 2021 23:42:01 +0000 (08:42 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 11 May 2021 23:42:01 +0000 (08:42 +0900)
There is just one bo with a bo_data, so increase the
reference count when it has the same bo_data.

Change-Id: I6258a6a8bf1f8a268619c70278f7b0d57a20b9ac

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 */