tbm_bufmgr: lock the gLock before locking tbm_bufmgr_mutex
[platform/core/uifw/libtbm.git] / src / tbm_bufmgr.c
index a57980f..55f9243 100644 (file)
@@ -364,22 +364,22 @@ tbm_bufmgr_deinit(tbm_bufmgr bufmgr)
 {
        TBM_RETURN_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr));
 
-       _tbm_bufmgr_mutex_lock();
        pthread_mutex_lock(&gLock);
+       _tbm_bufmgr_mutex_lock();
        _tbm_set_last_result(TBM_ERROR_NONE);
 
        if (!gBufMgr) {
                TBM_ERR("gBufmgr already destroy: bufmgr:%p\n", bufmgr);
-               pthread_mutex_unlock(&gLock);
                _tbm_bufmgr_mutex_unlock();
+               pthread_mutex_unlock(&gLock);
                return;
        }
 
        bufmgr->ref_count--;
        if (bufmgr->ref_count > 0) {
                TBM_DBG("reduce a ref_count(%d) of tbm_bufmgr(%p)\n", bufmgr->ref_count, bufmgr);
-               pthread_mutex_unlock(&gLock);
                _tbm_bufmgr_mutex_unlock();
+               pthread_mutex_unlock(&gLock);
                return;
        }
 
@@ -415,8 +415,8 @@ tbm_bufmgr_deinit(tbm_bufmgr bufmgr)
        free(bufmgr);
        gBufMgr = NULL;
 
-       pthread_mutex_unlock(&gLock);
        _tbm_bufmgr_mutex_unlock();
+       pthread_mutex_unlock(&gLock);
 }
 
 unsigned int
@@ -863,10 +863,15 @@ tbm_bufmgr_internal_find_bo(tbm_bufmgr bufmgr, tbm_bo bo)
 }
 
 tbm_bo
-tbm_bufmgr_internal_alloc_bo(tbm_bufmgr bufmgr, int size, int flags, tbm_error_e *error)
+tbm_bufmgr_internal_alloc_bo(tbm_bufmgr bufmgr, int size, int flags)
 {
+       tbm_error_e error = TBM_ERROR_NONE;
        tbm_bo bo;
-       tbm_bo_data *bo_data;
+
+       _tbm_bufmgr_mutex_lock();
+
+       TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
+       TBM_BUFMGR_RETURN_VAL_IF_FAIL(size > 0, NULL);
 
        _tbm_bufmgr_check_bo_cnt(bufmgr);
 
@@ -874,24 +879,38 @@ tbm_bufmgr_internal_alloc_bo(tbm_bufmgr bufmgr, int size, int flags, tbm_error_e
        if (!bo) {
                /* LCOV_EXCL_START */
                TBM_ERR("memory allocationc failed.");
-               *error = TBM_ERROR_OUT_OF_MEMORY;
-               return NULL;
+               error = TBM_ERROR_OUT_OF_MEMORY;
+               goto failed;
                /* LCOV_EXCL_STOP */
        }
 
-       bo_data = tbm_module_alloc_bo_data(bufmgr->module, bo, size, flags, error);
-       if (!bo_data) {
+       bo->bo_data = tbm_module_alloc_bo_data(bufmgr->module, bo, size, flags, &error);
+       if (!bo->bo_data) {
                /* LCOV_EXCL_START */
-               TBM_ERR("tbm_module_alloc_bo_data failed. size:%d flags:%s error:%d", size, _tbm_flag_to_str(flags), *error);
+               TBM_ERR("tbm_module_alloc_bo_data failed. size:%d flags:%s error:%d", size, _tbm_flag_to_str(flags), error);
                free(bo);
-               return NULL;
+               _tbm_set_last_result(error);
+               _tbm_bufmgr_mutex_unlock();
+               goto failed;
                /* LCOV_EXCL_STOP */
        }
-       bo->bo_data = bo_data;
 
        _tbm_bufmgr_initialize_bo(bufmgr, bo, flags);
 
+       TBM_TRACE_BO("bo(%p) size(%d) refcnt(%d), flag(%s)", bo, size, bo->ref_cnt, _tbm_flag_to_str(bo->flags));
+
+       _tbm_set_last_result(TBM_ERROR_NONE);
+       _tbm_bufmgr_mutex_unlock();
+
        return bo;
+
+/* LCOV_EXCL_START */
+failed:
+       _tbm_set_last_result(error);
+       _tbm_bufmgr_mutex_unlock();
+
+       return NULL;
+/* LCOV_EXCL_STOP */
 }
 
 
@@ -904,7 +923,6 @@ tbm_bufmgr_internal_alloc_bo_with_format(tbm_bufmgr bufmgr, int format, int bo_i
        tbm_bo bo = NULL;
 
        _tbm_bufmgr_mutex_lock();
-       _tbm_set_last_result(TBM_ERROR_NONE);
 
        TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
 
@@ -914,17 +932,17 @@ tbm_bufmgr_internal_alloc_bo_with_format(tbm_bufmgr bufmgr, int format, int bo_i
        if (!bo) {
                /* LCOV_EXCL_START */
                TBM_ERR("memory allocationc failed.");
-               _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY);
+               *error = TBM_ERROR_OUT_OF_MEMORY;
+               goto failed;
                /* LCOV_EXCL_STOP */
-               goto fail;
        }
 
        bo->bo_data = tbm_module_alloc_bo_data_with_format(bufmgr->module, format, bo_idx, width, height, bpp, flags, error);
        if (!bo->bo_data) {
                /* LCOV_EXCL_START */
-               _tbm_set_last_result(*error);
+               free(bo);
+               goto failed;
                /* LCOV_EXCL_STOP */
-               goto fail;
        }
 
        _tbm_bufmgr_initialize_bo(bufmgr, bo, flags);
@@ -933,12 +951,12 @@ tbm_bufmgr_internal_alloc_bo_with_format(tbm_bufmgr bufmgr, int format, int bo_i
 
        return bo;
 
-fail:
-       if (bo)
-               free(bo);
+/* LCOV_EXCL_START */
+failed:
        _tbm_bufmgr_mutex_unlock();
 
        return NULL;
+/* LCOV_EXCL_STOP */
 }
 
 tbm_bo
@@ -986,28 +1004,32 @@ tbm_bufmgr_internal_alloc_bo_with_bo_data(tbm_bufmgr bufmgr, tbm_bo_data *bo_dat
 }
 
 tbm_bo
-tbm_bufmgr_internal_import_bo_with_key(tbm_bufmgr bufmgr, unsigned int key, tbm_error_e *error)
+tbm_bufmgr_internal_import_bo_with_key(tbm_bufmgr bufmgr, unsigned int key)
 {
+       tbm_error_e error = TBM_ERROR_NONE;
        tbm_bo bo, bo2;
        int flags;
 
+       _tbm_bufmgr_mutex_lock();
+
+       TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
+
        _tbm_bufmgr_check_bo_cnt(bufmgr);
 
        bo = calloc(1, sizeof(struct _tbm_bo));
        if (!bo) {
                /* LCOV_EXCL_START */
                TBM_ERR("memory allocationc failed.");
-               *error = TBM_ERROR_OUT_OF_MEMORY;
-               return NULL;
+               goto failed;
                /* LCOV_EXCL_STOP */
        }
 
-       bo->bo_data = tbm_module_import_bo_data_with_key(bufmgr->module, bo, key, error);
+       bo->bo_data = tbm_module_import_bo_data_with_key(bufmgr->module, bo, key, &error);
        if (!bo->bo_data) {
                /* LCOV_EXCL_START */
                TBM_ERR("tbm_module_import_bo_data_with_key failed. tbm_key:%d", key);
                free(bo);
-               return NULL;
+               goto failed;
                /* LCOV_EXCL_STOP */
        }
 
@@ -1018,43 +1040,62 @@ tbm_bufmgr_internal_import_bo_with_key(tbm_bufmgr bufmgr, unsigned int key, tbm_
                                        bo2, bo2->ref_cnt, key, _tbm_flag_to_str(bo2->flags));
                bo2->ref_cnt++;
                free(bo);
+               _tbm_set_last_result(TBM_ERROR_NONE);
+               _tbm_bufmgr_mutex_unlock();
                return bo2;
        }
 
-       flags = tbm_bo_data_get_memory_types(bo->bo_data, error);
-       if (*error != TBM_ERROR_NONE) {
-               TBM_ERR("fail to get the bo flags(memory_types)");
+       flags = tbm_bo_data_get_memory_types(bo->bo_data, &error);
+       if (error != TBM_ERROR_NONE) {
+               TBM_WRN("tbm_bo_data_get_memory_types filed. use the default flags:TBM_BO_DEFAULT.");
                flags = TBM_BO_DEFAULT;
+               error = TBM_ERROR_NONE;
        }
 
        _tbm_bufmgr_initialize_bo(bufmgr, bo, flags);
 
+       TBM_TRACE_BO("import new bo(%p) ref(%d) key(%d) flag(%s) in list",
+                               bo, bo->ref_cnt, key, _tbm_flag_to_str(bo->flags));
+
+       _tbm_set_last_result(TBM_ERROR_NONE);
+       _tbm_bufmgr_mutex_unlock();
+
        return bo;
+
+failed:
+       _tbm_set_last_result(error);
+       _tbm_bufmgr_mutex_unlock();
+
+       return NULL;
 }
 
 tbm_bo
-tbm_bufmgr_internal_import_bo_with_fd(tbm_bufmgr bufmgr, tbm_fd fd, tbm_error_e *error)
+tbm_bufmgr_internal_import_bo_with_fd(tbm_bufmgr bufmgr, tbm_fd fd)
 {
+       tbm_error_e error = TBM_ERROR_NONE;
        tbm_bo bo, bo2;
        int flags;
 
+       _tbm_bufmgr_mutex_lock();
+
+       TBM_BUFMGR_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
+
        _tbm_bufmgr_check_bo_cnt(bufmgr);
 
        bo = calloc(1, sizeof(struct _tbm_bo));
        if (!bo) {
                /* LCOV_EXCL_START */
                TBM_ERR("memory allocationc failed.");
-               *error = TBM_ERROR_OUT_OF_MEMORY;
-               return NULL;
+               goto failed;
                /* LCOV_EXCL_STOP */
        }
 
-       bo->bo_data = tbm_module_import_bo_data_with_fd(bufmgr->module, bo, fd, error);
+       bo->bo_data = tbm_module_import_bo_data_with_fd(bufmgr->module, bo, fd, &error);
        if (!bo->bo_data) {
                /* LCOV_EXCL_START */
                TBM_ERR("tbm_module_import_bo_data_with_fd failed. tbm_fd:%d", fd);
                free(bo);
-               return NULL;
+               goto failed;
                /* LCOV_EXCL_STOP */
        }
 
@@ -1065,18 +1106,33 @@ tbm_bufmgr_internal_import_bo_with_fd(tbm_bufmgr bufmgr, tbm_fd fd, tbm_error_e
                                        bo2, bo2->ref_cnt, fd, _tbm_flag_to_str(bo2->flags));
                bo2->ref_cnt++;
                free(bo);
+               _tbm_set_last_result(TBM_ERROR_NONE);
+               _tbm_bufmgr_mutex_unlock();
                return bo2;
        }
 
-       flags = tbm_bo_data_get_memory_types(bo->bo_data, error);
-       if (*error != TBM_ERROR_NONE) {
-               TBM_ERR("fail to get the bo flags(memory_types)");
+       flags = tbm_bo_data_get_memory_types(bo->bo_data, &error);
+       if (error != TBM_ERROR_NONE) {
+               TBM_WRN("tbm_bo_data_get_memory_types filed. use the default flags:TBM_BO_DEFAULT.");
                flags = TBM_BO_DEFAULT;
+               error = TBM_ERROR_NONE;
        }
 
+       TBM_TRACE_BO("import bo(%p) ref(%d) fd(%d) flag(%s)",
+                               bo, bo->ref_cnt, fd, _tbm_flag_to_str(bo->flags));
+
        _tbm_bufmgr_initialize_bo(bufmgr, bo, flags);
 
+       _tbm_set_last_result(TBM_ERROR_NONE);
+       _tbm_bufmgr_mutex_unlock();
+
        return bo;
+
+failed:
+       _tbm_set_last_result(error);
+       _tbm_bufmgr_mutex_unlock();
+
+       return NULL;
 }
 
 /* LCOV_EXCL_STOP */