1 /**************************************************************************
5 Copyright 2012 Samsung Electronics co., Ltd. All Rights Reserved.
7 Contact: SooChan Lim <sc1.lim@samsung.com>, Sangjin Lee <lsj119@samsung.com>
8 Boram Park <boram1288.park@samsung.com>, Changyeon Lee <cyeon.lee@samsung.com>
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
33 #include "tbm_bufmgr.h"
34 #include "tbm_bufmgr_int.h"
38 #define TBM_BO_RETURN_IF_FAIL(cond) {\
40 TBM_ERR("'%s' failed.\n", #cond);\
41 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);\
42 _tbm_bufmgr_mutex_unlock();\
47 #define TBM_BO_RETURN_VAL_IF_FAIL(cond, val) {\
49 TBM_ERR("'%s' failed.\n", #cond);\
50 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);\
51 _tbm_bufmgr_mutex_unlock();\
57 _tbm_flag_to_str(int f)
61 if (f == TBM_BO_DEFAULT)
62 snprintf(str, 255, "DEFAULT");
66 if (f & TBM_BO_SCANOUT)
67 c += snprintf(&str[c], 255-c, "SCANOUT");
69 if (f & TBM_BO_NONCACHABLE) {
70 if (c >= 0 && c < 255)
71 c += snprintf(&str[c], 255-c, ", ");
73 if (c >= 0 && c < 255)
74 c += snprintf(&str[c], 255-c, "NONCACHABLE,");
78 if (c >= 0 && c < 255)
79 c += snprintf(&str[c], 255-c, ", ");
81 if (c >= 0 && c < 255)
82 c += snprintf(&str[c], 255-c, "WC");
92 user_data_lookup(struct list_head *user_data_list, unsigned long key)
94 tbm_user_data *old_data = NULL;
96 if (LIST_IS_EMPTY(user_data_list))
99 LIST_FOR_EACH_ENTRY(old_data, user_data_list, item_link) {
100 if (old_data->key == key)
108 user_data_create(unsigned long key, tbm_data_free data_free_func)
110 tbm_user_data *user_data;
112 user_data = calloc(1, sizeof(tbm_user_data));
114 /* LCOV_EXCL_START */
115 TBM_ERR("fail to allocate an user_date\n");
116 _tbm_set_last_result(TBM_ERROR_OUT_OF_MEMORY);
121 user_data->key = key;
122 user_data->free_func = data_free_func;
128 user_data_delete(tbm_user_data *user_data)
130 if (user_data->data && user_data->free_func)
131 user_data->free_func(user_data->data);
133 LIST_DEL(&user_data->item_link);
139 _bo_lock(tbm_bo bo, int device, int opt)
144 if (bo->bufmgr->use_hal_tbm) {
145 error = (tbm_error_e)hal_tbm_bo_lock((hal_tbm_bo *)bo->bo_data, device, opt);
146 if (error == TBM_ERROR_NOT_SUPPORTED) {
147 _tbm_set_last_result(TBM_ERROR_NONE);
149 if (error != TBM_ERROR_NONE) {
150 TBM_WRN("fail to lock");
151 _tbm_set_last_result(error);
155 } else if (bo->bufmgr->backend_module_data) {
156 if (bo->bufmgr->bo_func->bo_lock) {
157 error = bo->bufmgr->bo_func->bo_lock(bo->bo_data, device, opt);
158 if (error != TBM_ERROR_NONE) {
159 TBM_WRN("fail to lock");
160 _tbm_set_last_result(error);
165 if (bo->bufmgr->backend->bo_lock) {
166 ret = bo->bufmgr->backend->bo_lock(bo, device, opt);
168 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
176 _bo_unlock(tbm_bo bo)
180 if (bo->bufmgr->use_hal_tbm) {
181 error = (tbm_error_e)hal_tbm_bo_unlock((hal_tbm_bo *)bo->bo_data);
182 if (error == TBM_ERROR_NOT_SUPPORTED) {
183 _tbm_set_last_result(TBM_ERROR_NONE);
185 if (error != TBM_ERROR_NONE) {
186 TBM_WRN("fail to lock");
187 _tbm_set_last_result(error);
190 } else if (bo->bufmgr->backend_module_data) {
191 if (bo->bufmgr->bo_func->bo_unlock) {
192 error = bo->bufmgr->bo_func->bo_unlock(bo->bo_data);
193 if (error != TBM_ERROR_NONE) {
194 TBM_WRN("fail to unlock");
195 _tbm_set_last_result(error);
199 if (bo->bufmgr->backend->bo_unlock)
200 bo->bufmgr->backend->bo_unlock(bo);
205 _tbm_bo_lock(tbm_bo bo, int device, int opt)
212 /* do not try to lock the bo */
213 if (bo->bufmgr->bo_lock_type == TBM_BUFMGR_BO_LOCK_TYPE_NEVER)
216 if (bo->lock_cnt < 0) {
217 TBM_ERR("error bo:%p LOCK_CNT=%d\n",
224 switch (bo->bufmgr->bo_lock_type) {
225 case TBM_BUFMGR_BO_LOCK_TYPE_ONCE:
226 if (bo->lock_cnt == 0) {
227 _tbm_bufmgr_mutex_unlock();
228 ret = _bo_lock(bo, device, opt);
229 _tbm_bufmgr_mutex_lock();
235 case TBM_BUFMGR_BO_LOCK_TYPE_ALWAYS:
236 _tbm_bufmgr_mutex_unlock();
237 ret = _bo_lock(bo, device, opt);
238 _tbm_bufmgr_mutex_lock();
243 TBM_ERR("error bo:%p bo_lock_type[%d] is wrong.\n",
244 bo, bo->bufmgr->bo_lock_type);
249 TBM_DBG(">> LOCK bo:%p(%d->%d)\n", bo, old, bo->lock_cnt);
255 _tbm_bo_unlock(tbm_bo bo)
259 /* do not try to unlock the bo */
260 if (bo->bufmgr->bo_lock_type == TBM_BUFMGR_BO_LOCK_TYPE_NEVER)
265 switch (bo->bufmgr->bo_lock_type) {
266 case TBM_BUFMGR_BO_LOCK_TYPE_ONCE:
267 if (bo->lock_cnt > 0) {
269 if (bo->lock_cnt == 0)
273 case TBM_BUFMGR_BO_LOCK_TYPE_ALWAYS:
274 if (bo->lock_cnt > 0) {
280 TBM_ERR("error bo:%p bo_lock_type[%d] is wrong.\n",
281 bo, bo->bufmgr->bo_lock_type);
285 if (bo->lock_cnt < 0)
288 TBM_DBG(">> UNLOCK bo:%p(%d->%d)\n", bo, old, bo->lock_cnt);
292 _tbm_bo_magic_check(tbm_bo bo)
294 if (bo->magic != TBM_BO_MAGIC)
301 _tbm_bo_is_valid(tbm_bo bo)
304 TBM_ERR("error: bo is NULL.\n");
308 if (!_tbm_bo_magic_check(bo)) {
309 TBM_ERR("error: No valid bo(%p).\n", bo);
317 _tbm_bo_deinit(tbm_bo bo)
321 bo->bufmgr->bo_cnt--;
322 LIST_DEL(&bo->item_link);
326 tbm_bo_alloc(tbm_bufmgr bufmgr, int size, int flags)
331 _tbm_bufmgr_mutex_lock();
332 _tbm_set_last_result(TBM_ERROR_NONE);
334 TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
335 TBM_BO_RETURN_VAL_IF_FAIL(size > 0, NULL);
337 bo = tbm_bufmgr_internal_alloc_bo(bufmgr, size, flags, &error);
339 /* LCOV_EXCL_START */
340 TBM_ERR("tbm_bufmgr_internal_alloc_bo failed. error:%d", error);
341 _tbm_set_last_result(error);
342 _tbm_bufmgr_mutex_unlock();
347 TBM_TRACE_BO("bo(%p) size(%d) refcnt(%d), flag(%s)\n", bo, size, bo->ref_cnt,
348 _tbm_flag_to_str(bo->flags));
350 _tbm_bufmgr_mutex_unlock();
356 tbm_bo_ref(tbm_bo bo)
358 _tbm_bufmgr_mutex_lock();
359 _tbm_set_last_result(TBM_ERROR_NONE);
361 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), NULL);
365 TBM_TRACE_BO("bo(%p) ref_cnt(%d)\n", bo, bo->ref_cnt);
367 _tbm_bufmgr_mutex_unlock();
373 tbm_bo_unref(tbm_bo bo)
375 _tbm_bufmgr_mutex_lock();
376 _tbm_set_last_result(TBM_ERROR_NONE);
378 TBM_BO_RETURN_IF_FAIL(_tbm_bo_is_valid(bo));
380 TBM_TRACE_BO("bo(%p) ref_cnt(%d)\n", bo, bo->ref_cnt - 1);
382 if (bo->ref_cnt <= 0) {
383 _tbm_bufmgr_mutex_unlock();
388 if (bo->ref_cnt == 0)
391 _tbm_bufmgr_mutex_unlock();
395 tbm_bo_map(tbm_bo bo, int device, int opt)
397 tbm_bo_handle bo_handle;
400 _tbm_bufmgr_mutex_lock();
401 _tbm_set_last_result(TBM_ERROR_NONE);
403 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), (tbm_bo_handle) NULL);
405 if (!_tbm_bo_lock(bo, device, opt)) {
406 TBM_ERR("error: fail to lock bo:%p)\n", bo);
407 _tbm_bufmgr_mutex_unlock();
408 return (tbm_bo_handle) NULL;
411 bo_handle = tbm_module_bo_map(bo->bufmgr->module, bo, bo->bo_data, device, opt, &error);
412 if (bo_handle.ptr == NULL) {
413 /* LCOV_EXCL_START */
414 TBM_ERR("error: fail to map bo:%p error:%d\n", bo, error);
415 _tbm_set_last_result(error);
417 _tbm_bufmgr_mutex_unlock();
418 return (tbm_bo_handle) NULL;
422 /* increase the map_count */
425 TBM_TRACE_BO("bo(%p) map_cnt(%d)\n", bo, bo->map_cnt);
427 _tbm_bufmgr_mutex_unlock();
433 tbm_bo_unmap(tbm_bo bo)
437 _tbm_bufmgr_mutex_lock();
438 _tbm_set_last_result(TBM_ERROR_NONE);
440 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
441 TBM_BO_RETURN_VAL_IF_FAIL(bo->map_cnt > 0, 0);
443 error = tbm_module_bo_unmap(bo->bufmgr->module, bo, bo->bo_data);
444 if (error != TBM_ERROR_NONE) {
445 /* LCOV_EXCL_START */
446 TBM_ERR("error: bo(%p) map_cnt(%d) error(%d)\n", bo, bo->map_cnt, error);
447 _tbm_set_last_result(error);
448 _tbm_bufmgr_mutex_unlock();
453 /* decrease the map_count */
456 TBM_TRACE_BO("bo(%p) map_cnt(%d)\n", bo, bo->map_cnt);
460 _tbm_bufmgr_mutex_unlock();
466 tbm_bo_get_handle(tbm_bo bo, int device)
468 tbm_bo_handle bo_handle;
471 _tbm_bufmgr_mutex_lock();
472 _tbm_set_last_result(TBM_ERROR_NONE);
474 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), (tbm_bo_handle) NULL);
476 bo_handle = tbm_module_bo_get_handle(bo->bufmgr->module, bo, bo->bo_data, device, &error);
477 if (bo_handle.ptr == NULL) {
478 /* LCOV_EXCL_START */
479 TBM_ERR("error: bo(%p) bo_handle(%p) error(%d)\n", bo, bo_handle.ptr, error);
480 _tbm_set_last_result(error);
481 _tbm_bufmgr_mutex_unlock();
482 return (tbm_bo_handle)NULL;
486 TBM_TRACE_BO("bo(%p) bo_handle(%p)\n", bo, bo_handle.ptr);
488 _tbm_bufmgr_mutex_unlock();
494 tbm_bo_export(tbm_bo bo)
499 _tbm_bufmgr_mutex_lock();
500 _tbm_set_last_result(TBM_ERROR_NONE);
502 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
504 if (bo->bufmgr->use_hal_tbm) {
505 ret = (hal_tbm_key)hal_tbm_bo_export_key((hal_tbm_bo *)bo->bo_data, (hal_tbm_error *)&error);
507 /* LCOV_EXCL_START */
508 TBM_ERR("error: bo(%p) tbm_key(%d) error(%d)\n", bo, ret, error);
509 _tbm_set_last_result(error);
513 } else if (bo->bufmgr->backend_module_data) {
514 if (!bo->bufmgr->bo_func->bo_export_key) {
515 /* LCOV_EXCL_START */
516 _tbm_bufmgr_mutex_unlock();
517 _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED);
522 ret = bo->bufmgr->bo_func->bo_export_key(bo->bo_data, &error);
524 /* LCOV_EXCL_START */
525 TBM_ERR("error: bo(%p) tbm_key(%d) error(%d)\n", bo, ret, error);
526 _tbm_set_last_result(error);
531 if (!bo->bufmgr->backend->bo_export) {
532 /* LCOV_EXCL_START */
533 _tbm_bufmgr_mutex_unlock();
534 _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED);
539 ret = bo->bufmgr->backend->bo_export(bo);
541 /* LCOV_EXCL_START */
542 TBM_ERR("error: bo(%p) tbm_key(%d)\n", bo, ret);
543 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
549 TBM_TRACE_BO("bo(%p) tbm_key(%u)\n", bo, ret);
552 _tbm_bufmgr_mutex_unlock();
558 tbm_bo_export_fd(tbm_bo bo)
563 _tbm_bufmgr_mutex_lock();
564 _tbm_set_last_result(TBM_ERROR_NONE);
566 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), -1);
568 if (bo->bufmgr->use_hal_tbm) {
569 ret = (hal_tbm_fd)hal_tbm_bo_export_fd((hal_tbm_bo *)bo->bo_data, (hal_tbm_error *)&error);
571 /* LCOV_EXCL_START */
572 TBM_ERR("error: bo(%p) tbm_fd(%d) error(%d)\n", bo, ret, error);
573 _tbm_set_last_result(error);
577 } else if (bo->bufmgr->backend_module_data) {
578 if (!bo->bufmgr->bo_func->bo_export_fd) {
579 /* LCOV_EXCL_START */
580 _tbm_bufmgr_mutex_unlock();
581 _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED);
586 ret = bo->bufmgr->bo_func->bo_export_fd(bo->bo_data, &error);
588 /* LCOV_EXCL_START */
589 TBM_ERR("error: bo(%p) tbm_fd(%d) error(%d)\n", bo, ret, error);
590 _tbm_set_last_result(error);
595 if (!bo->bufmgr->backend->bo_export_fd) {
596 /* LCOV_EXCL_START */
597 _tbm_bufmgr_mutex_unlock();
598 _tbm_set_last_result(TBM_ERROR_NOT_SUPPORTED);
603 ret = bo->bufmgr->backend->bo_export_fd(bo);
605 /* LCOV_EXCL_START */
606 TBM_ERR("error: bo(%p) tbm_fd(%d)\n", bo, ret);
607 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
613 TBM_TRACE_BO("bo(%p) tbm_fd(%d)\n", bo, ret);
616 _tbm_bufmgr_mutex_unlock();
622 tbm_bo_import(tbm_bufmgr bufmgr, unsigned int key)
627 _tbm_bufmgr_mutex_lock();
628 _tbm_set_last_result(TBM_ERROR_NONE);
630 TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
632 bo = tbm_bufmgr_internal_import_bo_with_key(bufmgr, key, &error);
634 /* LCOV_EXCL_START */
635 TBM_ERR("tbm_bufmgr_internal_import_key failed. error:%d", error);
636 _tbm_set_last_result(error);
637 _tbm_bufmgr_mutex_unlock();
642 TBM_TRACE_BO("import new bo(%p) ref(%d) key(%d) flag(%s) in list\n",
643 bo, bo->ref_cnt, key, _tbm_flag_to_str(bo->flags));
645 _tbm_bufmgr_mutex_unlock();
651 tbm_bo_import_fd(tbm_bufmgr bufmgr, tbm_fd fd)
656 _tbm_bufmgr_mutex_lock();
657 _tbm_set_last_result(TBM_ERROR_NONE);
659 TBM_BO_RETURN_VAL_IF_FAIL(TBM_BUFMGR_IS_VALID(bufmgr), NULL);
661 bo = tbm_bufmgr_internal_import_bo_with_fd(bufmgr, fd, &error);
663 /* LCOV_EXCL_START */
664 TBM_ERR("tbm_bufmgr_internal_import_fd failed. error:%d", error);
665 _tbm_set_last_result(error);
666 _tbm_bufmgr_mutex_unlock();
671 LIST_INITHEAD(&bo->user_data_list); // TODO: remove this. build-break when it is removed.
673 TBM_TRACE_BO("import bo(%p) ref(%d) fd(%d) flag(%s)\n",
674 bo, bo->ref_cnt, fd, _tbm_flag_to_str(bo->flags));
676 _tbm_bufmgr_mutex_unlock();
682 tbm_bo_size(tbm_bo bo)
687 _tbm_bufmgr_mutex_lock();
688 _tbm_set_last_result(TBM_ERROR_NONE);
690 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
692 size = tbm_module_bo_get_size(bo->bufmgr->module, bo, bo->bo_data, &error);
693 _tbm_set_last_result(error);
695 TBM_TRACE_BO("bo(%p) size(%d)\n", bo, size);
697 _tbm_bufmgr_mutex_unlock();
703 tbm_bo_locked(tbm_bo bo)
705 _tbm_bufmgr_mutex_lock();
706 _tbm_set_last_result(TBM_ERROR_NONE);
708 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
710 if (bo->bufmgr->bo_lock_type == TBM_BUFMGR_BO_LOCK_TYPE_NEVER) {
711 TBM_ERR("bo(%p) lock_cnt(%d)\n", bo, bo->lock_cnt);
712 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
713 _tbm_bufmgr_mutex_unlock();
717 if (bo->lock_cnt > 0) {
718 TBM_TRACE_BO("error: bo(%p) lock_cnt(%d)\n", bo, bo->lock_cnt);
719 _tbm_bufmgr_mutex_unlock();
723 TBM_TRACE_BO("bo(%p) lock_cnt(%d)\n", bo, bo->lock_cnt);
724 _tbm_bufmgr_mutex_unlock();
730 tbm_bo_swap(tbm_bo bo1, tbm_bo bo2)
732 tbm_error_e error1, error2;
733 int size1 = -1, size2 = -2;
736 _tbm_bufmgr_mutex_lock();
737 _tbm_set_last_result(TBM_ERROR_NONE);
739 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo1), 0);
740 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo2), 0);
742 TBM_TRACE_BO("before: bo1(%p) bo2(%p)\n", bo1, bo2);
744 size1 = tbm_module_bo_get_size(bo1->bufmgr->module, bo1, bo1->bo_data, &error1);
745 _tbm_set_last_result(error1);
746 size2 = tbm_module_bo_get_size(bo2->bufmgr->module, bo2, bo2->bo_data, &error2);
747 _tbm_set_last_result(error2);
749 if (size1 != size2) {
750 TBM_ERR("error: bo1 size(%d) and bo2 size(%d) is different.", size1, size2);
751 _tbm_set_last_result(TBM_ERROR_INVALID_OPERATION);
755 TBM_TRACE_BO("after: bo1(%p) bo2(%p)\n", bo1, bo2);
758 bo1->priv = bo2->priv;
761 _tbm_bufmgr_mutex_unlock();
766 TBM_ERR("error: bo1(%p) bo2(%p)\n", bo1, bo2);
767 _tbm_bufmgr_mutex_unlock();
773 tbm_bo_add_user_data(tbm_bo bo, unsigned long key,
774 tbm_data_free data_free_func)
778 _tbm_bufmgr_mutex_lock();
779 _tbm_set_last_result(TBM_ERROR_NONE);
781 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
783 /* check if the data according to the key exist if so, return false. */
784 data = user_data_lookup(&bo->user_data_list, key);
786 TBM_TRACE_BO("warning: user data already exist key(%ld)\n", key);
787 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
788 _tbm_bufmgr_mutex_unlock();
792 data = user_data_create(key, data_free_func);
794 TBM_ERR("error: bo(%p) key(%lu)\n", bo, key);
795 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
796 _tbm_bufmgr_mutex_unlock();
800 TBM_TRACE_BO("bo(%p) key(%lu) data(%p)\n", bo, key, data->data);
802 LIST_ADD(&data->item_link, &bo->user_data_list);
804 _tbm_bufmgr_mutex_unlock();
810 tbm_bo_delete_user_data(tbm_bo bo, unsigned long key)
812 tbm_user_data *old_data;
814 _tbm_bufmgr_mutex_lock();
815 _tbm_set_last_result(TBM_ERROR_NONE);
817 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
819 if (LIST_IS_EMPTY(&bo->user_data_list)) {
820 TBM_TRACE_BO("bo(%p) key(%lu)\n", bo, key);
821 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
822 _tbm_bufmgr_mutex_unlock();
826 old_data = user_data_lookup(&bo->user_data_list, key);
828 TBM_TRACE_BO("bo(%p) key(%lu)\n", bo, key);
829 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
830 _tbm_bufmgr_mutex_unlock();
834 TBM_TRACE_BO("bo(%p) key(%lu) data(%p)\n", bo, key, old_data->data);
836 user_data_delete(old_data);
838 _tbm_bufmgr_mutex_unlock();
844 tbm_bo_set_user_data(tbm_bo bo, unsigned long key, void *data)
846 tbm_user_data *old_data;
848 _tbm_bufmgr_mutex_lock();
849 _tbm_set_last_result(TBM_ERROR_NONE);
851 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
853 if (LIST_IS_EMPTY(&bo->user_data_list)) {
854 TBM_TRACE_BO("error: bo(%p) key(%lu)\n", bo, key);
855 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
856 _tbm_bufmgr_mutex_unlock();
860 old_data = user_data_lookup(&bo->user_data_list, key);
862 TBM_TRACE_BO("error: bo(%p) key(%lu)\n", bo, key);
863 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
864 _tbm_bufmgr_mutex_unlock();
868 if (old_data->data && old_data->free_func)
869 old_data->free_func(old_data->data);
870 old_data->data = data;
872 TBM_TRACE_BO("bo(%p) key(%lu) data(%p)\n", bo, key, old_data->data);
874 _tbm_bufmgr_mutex_unlock();
880 tbm_bo_get_user_data(tbm_bo bo, unsigned long key, void **data)
882 tbm_user_data *old_data;
884 _tbm_bufmgr_mutex_lock();
885 _tbm_set_last_result(TBM_ERROR_NONE);
887 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
889 if (!data || LIST_IS_EMPTY(&bo->user_data_list)) {
890 TBM_TRACE_BO("error: bo(%p) key(%lu)\n", bo, key);
891 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
892 _tbm_bufmgr_mutex_unlock();
896 old_data = user_data_lookup(&bo->user_data_list, key);
899 TBM_TRACE_BO("error: bo(%p) key(%lu)\n", bo, key);
900 _tbm_set_last_result(TBM_ERROR_INVALID_PARAMETER);
901 _tbm_bufmgr_mutex_unlock();
905 *data = old_data->data;
907 TBM_TRACE_BO("bo(%p) key(%lu) data(%p)\n", bo, key, old_data->data);
909 _tbm_bufmgr_mutex_unlock();
915 tbm_bo_get_flags(tbm_bo bo)
919 _tbm_bufmgr_mutex_lock();
921 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
925 TBM_TRACE_BO("bo(%p)\n", bo);
927 _tbm_bufmgr_mutex_unlock();
932 /* LCOV_EXCL_START */
933 /* internal function */
935 _tbm_bo_set_surface(tbm_bo bo, tbm_surface_h surface)
937 _tbm_bufmgr_mutex_lock();
939 TBM_BO_RETURN_VAL_IF_FAIL(_tbm_bo_is_valid(bo), 0);
941 bo->surface = surface;
943 _tbm_bufmgr_mutex_unlock();
949 _tbm_bo_free(tbm_bo bo)
951 /* destory the user_data_list */
952 if (!LIST_IS_EMPTY(&bo->user_data_list)) {
953 tbm_user_data *old_data = NULL, *tmp;
955 LIST_FOR_EACH_ENTRY_SAFE(old_data, tmp,
956 &bo->user_data_list, item_link) {
957 TBM_DBG("free user_data\n");
958 user_data_delete(old_data);
962 while (bo->lock_cnt > 0) {
963 TBM_ERR("error lock_cnt:%d\n", bo->lock_cnt);
968 tbm_module_bo_free(bo->bufmgr->module, bo, bo->bo_data, bo->get_from_hal_surface);