From: Boram Park Date: Tue, 7 Mar 2017 08:36:43 +0000 (+0900) Subject: vblank: remove the vblank handler when wait_info freed X-Git-Tag: accepted/tizen/3.0/common/20170308.133916~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F42%2F117742%2F1;p=platform%2Fcore%2Fuifw%2Flibtdm.git vblank: remove the vblank handler when wait_info freed If not removed, it makes the crash when the vblank handler is called for the freed wait_info. Change-Id: I07b168da39d1ff9f4e5effe69b99dd249d976027 --- diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index d92e902..662204f 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -146,6 +146,9 @@ static double stamp = 0; static tdm_error _tdm_vblank_cb_vblank_SW(void *user_data); static tdm_error _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info); +static void _tdm_vblank_cb_vblank_HW(tdm_output *output, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, + void *user_data); #if 0 static void @@ -206,7 +209,7 @@ _tdm_vblank_check_valid_wait(tdm_vblank_wait_info *wait_info) pthread_mutex_lock(&valid_list_lock); LIST_FOR_EACH_ENTRY(w, &valid_wait_list, valid_link) { - if (w->stamp == wait_info->stamp) { + if (w == wait_info) { pthread_mutex_unlock(&valid_list_lock); return 1; } @@ -272,6 +275,7 @@ _tdm_vblank_change_to_SW(tdm_private_vblank *private_vblank) LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { LIST_DEL(&w->link); + tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); w->type = VBLANK_TYPE_SW_FAKE; _tdm_vblank_wait_SW(w); } @@ -285,6 +289,7 @@ _tdm_vblank_free_HW_wait(tdm_private_vblank *private_vblank, tdm_error error, un LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); + tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); if (call_cb && w->func) w->func(private_vblank, error, 0, 0, 0, w->user_data); @@ -1015,6 +1020,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, if (ret != TDM_ERROR_NONE) { LIST_DEL(&wait_info->link); _tdm_vblank_valid_list_del(&wait_info->valid_link); + tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, wait_info); free(wait_info); return ret; }