X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_buffer.c;h=81716b5eb69bb29da20784a5b16367b6ae7c36ab;hb=04ab8db6936dfb9a5d1f91a7ab3ccf78f13d0af0;hp=e6915079e35e209218d3b9f7f1db1d557fb1482a;hpb=e6c4934378f41098058ba2ab862f46aa4bf84dc0;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_buffer.c b/src/tdm_buffer.c index e691507..81716b5 100644 --- a/src/tdm_buffer.c +++ b/src/tdm_buffer.c @@ -9,7 +9,7 @@ * Taeheon Kim , * YoungJun Cho , * SooChan Lim , - * Boram Park + * Boram Park * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the @@ -37,9 +37,7 @@ #include "config.h" #endif -#include "tdm.h" #include "tdm_private.h" -#include "tdm_list.h" static int tdm_buffer_key; #define TDM_BUFFER_KEY ((unsigned long)&tdm_buffer_key) @@ -122,7 +120,7 @@ tdm_buffer_add_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data) { tdm_buffer_info *buf_info; - tdm_buffer_func_info *func_info; + tdm_buffer_func_info *func_info = NULL; TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); @@ -130,13 +128,20 @@ tdm_buffer_add_release_handler(tbm_surface_h buffer, buf_info = tdm_buffer_get_info(buffer); TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, TDM_ERROR_OUT_OF_MEMORY); + LIST_FOR_EACH_ENTRY(func_info, &buf_info->release_funcs, link) { + if (func_info->release_func == func && func_info->user_data == user_data) { + TDM_ERR("can't add twice"); + return TDM_ERROR_BAD_REQUEST; + } + } + func_info = calloc(1, sizeof(tdm_buffer_func_info)); TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY); func_info->release_func = func; func_info->user_data = user_data; - LIST_ADD(&func_info->link, &buf_info->release_funcs); + LIST_ADDTAIL(&func_info->link, &buf_info->release_funcs); return TDM_ERROR_NONE; } @@ -198,6 +203,9 @@ tdm_buffer_ref_backend(tbm_surface_h buffer) buf_info->backend_ref_count++; tbm_surface_internal_ref(buffer); + if (tdm_debug_module & TDM_DEBUG_BUFFER) + TDM_INFO("buffer(%p) backend_ref_count(%d)", buffer, buf_info->backend_ref_count); + return buffer; } @@ -213,17 +221,21 @@ tdm_buffer_unref_backend(tbm_surface_h buffer) TDM_RETURN_IF_FAIL(buf_info != NULL); buf_info->backend_ref_count--; + + if (tdm_debug_module & TDM_DEBUG_BUFFER) + TDM_INFO("buffer(%p) backend_ref_count(%d)", buffer, buf_info->backend_ref_count); + if (buf_info->backend_ref_count > 0) { tbm_surface_internal_unref(buffer); return; } -// if (!tdm_thread_in_display_thread(syscall(SYS_gettid))) -// TDM_NEVER_GET_HERE(); + if (tdm_debug_module & TDM_DEBUG_BUFFER) + TDM_INFO("buffer(%p) released", buffer); tbm_surface_internal_ref(buffer); LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link) - func_info->release_func(buffer, func_info->user_data); + func_info->release_func(buffer, func_info->user_data); tbm_surface_internal_unref(buffer); tbm_surface_internal_unref(buffer); @@ -234,7 +246,7 @@ tdm_buffer_add_destroy_handler(tbm_surface_h buffer, tdm_buffer_destroy_handler func, void *user_data) { tdm_buffer_info *buf_info; - tdm_buffer_func_info *func_info; + tdm_buffer_func_info *func_info = NULL; TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); @@ -242,13 +254,20 @@ tdm_buffer_add_destroy_handler(tbm_surface_h buffer, buf_info = tdm_buffer_get_info(buffer); TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, TDM_ERROR_OUT_OF_MEMORY); + LIST_FOR_EACH_ENTRY(func_info, &buf_info->destroy_funcs, link) { + if (func_info->destroy_func == func && func_info->user_data == user_data) { + TDM_ERR("can't add twice"); + return TDM_ERROR_BAD_REQUEST; + } + } + func_info = calloc(1, sizeof(tdm_buffer_func_info)); TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY); func_info->destroy_func = func; func_info->user_data = user_data; - LIST_ADD(&func_info->link, &buf_info->destroy_funcs); + LIST_ADDTAIL(&func_info->link, &buf_info->destroy_funcs); return TDM_ERROR_NONE; } @@ -277,39 +296,3 @@ tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, } } -INTERN tbm_surface_h -tdm_buffer_list_get_first_entry(struct list_head *list) -{ - tdm_buffer_info *buf_info = NULL; - - TDM_RETURN_VAL_IF_FAIL(list != NULL, NULL); - - if (LIST_IS_EMPTY(list)) - return NULL; - - buf_info = container_of((list)->next, buf_info, link); - - return buf_info->buffer; -} - -INTERN void -tdm_buffer_list_dump(struct list_head *list) -{ - tdm_buffer_info *buf_info = NULL; - char str[256], *p; - int len = sizeof(str); - - TDM_RETURN_IF_FAIL(list != NULL); - - p = str; - LIST_FOR_EACH_ENTRY(buf_info, list, link) { - if (len > 0) { - int l = snprintf(p, len, " %p", buf_info->buffer); - p += l; - len -= l; - } else - break; - } - - TDM_INFO("\t %s", str); -}