deal with the memory free when it operates to be failed.
Change-Id: Ifdf99fca1f1b056139ff3c63e72fb08ab15faed2
break;
case TBM_MODULE_TYPE_BUFMGR_BACKEND:
TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
- TBM_ERR("error: not supported tbm_bufmgr_internal_alloc_bo_with_format.");
+ TBM_ERR("error: not supported tbm_module_alloc_bo_data_with_format.");
*error = TBM_ERROR_NOT_SUPPORTED;
goto failed;
}
tbm_bo_data **
-tbm_surface_data_get_bo_data_array(tbm_surface_data *surface_data, int *num_bos, tbm_error_e *error)
+tbm_surface_data_get_bo_data_array(tbm_surface_data *surface_data, int *num_bos, int *memory_types, tbm_error_e *error)
{
tbm_bo_data **bo_data_array = NULL;
hal_tbm_bo **hal_bos = NULL;
hal_bos = hal_tbm_surface_get_bos(surface_data->hal_surface, num_bos, (hal_tbm_error *)error);
TBM_RETURN_VAL_IF_FAIL(hal_bos, NULL);
- bo_data_array = calloc(*num_bos, sizeof(struct _tbm_bo_data));
- if (bo_data_array) {
- TBM_ERR("memory allocation failed.");
- *error = TBM_ERROR_OUT_OF_MEMORY;
- return NULL;
+ bo_data_array = calloc(*num_bos, sizeof(tbm_bo_data *));
+ TBM_RETURN_VAL_IF_FAIL(bo_data_array, NULL);
+
+ for (i = 0; i < *num_bos; i++) {
+ bo_data_array[i] = calloc(*num_bos, sizeof(struct _tbm_bo_data));
+ TBM_GOTO_VAL_SET_ERR_IF_FAIL(bo_data_array[i], failed, *error, TBM_ERROR_OUT_OF_MEMORY);
}
for (i = 0; i < *num_bos; i++) {
bo_data_array[i]->module = surface_data->module;
}
+ // get memory_types(bo flags)
+ *memory_types = tbm_bo_data_get_memory_types(bo_data_array[0], error);
+ TBM_GOTO_VAL_IF_FAIL(*error == TBM_ERROR_NONE, failed);
+
return bo_data_array;
+
+/* LCOV_EXCL_START */
+failed:
+ for (i = 0; i < *num_bos; i++) {
+ if (bo_data_array[i])
+ free(bo_data_array[i]);
+ }
+ free(bo_data_array);
+
+ return NULL;
+/* LCOV_EXCL_STOP */
}
tbm_surface_buffer_data *
void tbm_surface_data_free(tbm_surface_data *surface_data);
tbm_error_e tbm_surface_data_get_plane_data(tbm_surface_data *surface_data, int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx);
-tbm_bo_data **tbm_surface_data_get_bo_data_array(tbm_surface_data *surface_data, int *num_bos, tbm_error_e *error);
+tbm_bo_data **tbm_surface_data_get_bo_data_array(tbm_surface_data *surface_data, int *num_bos, int *memory_types, tbm_error_e *error);
tbm_surface_buffer_data *tbm_surface_data_export(tbm_surface_data *surface_data, tbm_error_e *error);
void tbm_bo_data_free(tbm_bo_data *bo_data, int get_from_surface_data);
surf->planes_bo_idx[i] = bo_idx;
}
+ // calculate the size of a surface
+ for (i = 0; i < surf->info.num_planes; i++)
+ surf->info.size += surf->info.planes[i].size;
+
// get the bo_data_array
- bo_data_array = tbm_surface_data_get_bo_data_array(surf->surface_data, &num_bos, &error);
+ bo_data_array = tbm_surface_data_get_bo_data_array(surf->surface_data, &num_bos, &memory_types, &error);
if (!bo_data_array) {
TBM_ERR("tbm_surface_data_get_bo_data_array failed. error:%s", tbm_error_str(error));
return error;
}
- surf->num_bos = num_bos;
- // calculate the size of a surface
- for (i = 0; i < surf->info.num_planes; i++)
- surf->info.size += surf->info.planes[i].size;
+ // set num_bos
+ surf->num_bos = num_bos;
- // get memory_types(bo flags)
- memory_types = tbm_bo_data_get_memory_types(bo_data_array[0], &error);
- if (error != TBM_ERROR_NONE) {
- TBM_ERR("tbm_bo_data_get_memory_types failed. error:%s", tbm_error_str(error));
- return error;
- }
// set flags
surf->flags = memory_types;
_tbm_bo_set_surface(surf->bos[i], surf);
}
+
+ // only free the pointers of the arrary, not the item(tbm_bo_data).
+ // the item(tbm_bo_data) is set to the tbm_bo. tbm_bo handles the life cycle of the tbm_bo_data.
+ free(bo_data_array);
} else {
// set infomation of planes
for (i = 0; i < surf->info.num_planes; i++) {
return TBM_ERROR_NONE;
failed:
+ if (is_surface_data) {
+ for (j = 0; j < num_bos; j++) {
+ if (bo_data_array[j]) {
+ free(bo_data_array[j]);
+ surf->bos[j] = NULL;
+ }
+ }
+ free(bo_data_array);
+ }
+
for (j = 0; j < i; j++) {
if (surf->bos[j])
tbm_bo_unref(surf->bos[j]);