vblank: remove the vblank handler when wait_info freed 42/117742/1
authorBoram Park <boram1288.park@samsung.com>
Tue, 7 Mar 2017 08:36:43 +0000 (17:36 +0900)
committerBoram Park <boram1288.park@samsung.com>
Tue, 7 Mar 2017 08:48:32 +0000 (17:48 +0900)
If not removed, it makes the crash when the vblank handler is called
for the freed wait_info.

Change-Id: I07b168da39d1ff9f4e5effe69b99dd249d976027

src/tdm_vblank.c

index d92e902..662204f 100644 (file)
@@ -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;
        }