From: Joonbum Ko Date: Wed, 16 Apr 2025 07:55:06 +0000 (+0900) Subject: fix incorrect wayland API calls X-Git-Tag: accepted/tizen/9.0/unified/20250512.171558~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dc3f4eb0400f42c7b4894f66766796bbfbbd49fe;p=platform%2Fcore%2Fapi%2Fefl-util.git fix incorrect wayland API calls - Fixed potential memory leak in exception scenarios. - Removed unnecessary wl_display_dispatch_queue calls. - Removed unnecessary ecore_wl2_display_flush calls. Change-Id: I4e7ff09a697120b9606dd66a354579c962f84d94 Signed-off-by: Joonbum Ko --- diff --git a/src/efl_util.c b/src/efl_util.c index 693c060..b4586f6 100644 --- a/src/efl_util.c +++ b/src/efl_util.c @@ -346,10 +346,11 @@ _wl_init(void) { struct wl_display *display_wrapper = NULL; struct wl_registry *reg = NULL; + int ret = 0; if (_eflutil.wl.init) return EINA_TRUE; - ecore_wl2_init(); + if (ecore_wl2_init() <= 0) return EINA_FALSE; _eflutil.wl.wl2_display = ecore_wl2_display_connect(NULL); EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.wl2_display, fail); @@ -371,6 +372,11 @@ _wl_init(void) wl_registry_add_listener(reg, &_wl_reg_listener, NULL); + ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + EINA_SAFETY_ON_TRUE_GOTO(ret < 0, fail); + + wl_registry_destroy(reg); + _eflutil.wl.init = EINA_TRUE; return EINA_TRUE; @@ -384,6 +390,9 @@ fail: _eflutil.wl.queue = NULL; } + if (reg) + wl_registry_destroy(reg); + ecore_wl2_shutdown(); return EINA_FALSE; } @@ -393,6 +402,7 @@ _wl_init_default_queue(void) { struct wl_display *display_wrapper = NULL; struct wl_registry *reg = NULL; + int ret = 0; if (_eflutil_defaultqueue.wl.init) return EINA_TRUE; @@ -413,10 +423,17 @@ _wl_init_default_queue(void) wl_registry_add_listener(reg, &_wl_default_queue_reg_listener, NULL); + ret = wl_display_roundtrip(_eflutil.wl.dpy); + EINA_SAFETY_ON_TRUE_GOTO(ret < 0, fail); + + wl_registry_destroy(reg); + _eflutil_defaultqueue.wl.init = EINA_TRUE; return EINA_TRUE; fail: + if (reg) + wl_registry_destroy(reg); ecore_wl2_shutdown(); return EINA_FALSE; @@ -516,7 +533,7 @@ _cb_wl_reg_global(void *data, _eflutil.wl.policy.proto = proto; _eflutil.wl.policy.id = id; } - else if (strcmp(interface, "wl_output") == 0) + else if (!strcmp(interface, "wl_output")) { Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info)); EINA_SAFETY_ON_NULL_RETURN(output); @@ -784,8 +801,7 @@ efl_util_set_notification_window_level(Evas_Object *window, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); } - while (!_eflutil.wl.policy.proto && (ret_dispatch != -1)) - ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); surface = ecore_wl2_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, @@ -825,7 +841,6 @@ efl_util_set_notification_window_level(Evas_Object *window, ret_dispatch = 0; while (lv_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1)) { - ecore_wl2_display_flush(_eflutil.wl.wl2_display); ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); count++; } @@ -864,6 +879,7 @@ efl_util_get_notification_window_level(Evas_Object *window, res = _wl_init(); EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window); EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); @@ -876,9 +892,6 @@ efl_util_get_notification_window_level(Evas_Object *window, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); } - while (!_eflutil.wl.policy.proto && (ret_dispatch != -1)) - ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - surface = ecore_wl2_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE); @@ -892,7 +905,6 @@ efl_util_get_notification_window_level(Evas_Object *window, ret_dispatch = 0; while ((lv_info->wait_for_done) && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1)) { - ecore_wl2_display_flush(_eflutil.wl.wl2_display); ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); count++; } @@ -937,15 +949,9 @@ efl_util_set_window_opaque_state(Evas_Object *window, if (!_eflutil.wl.policy.proto) { - int ret = 0; - res = _wl_init(); EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); - - while (!_eflutil.wl.policy.proto && ret != -1) - ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - - EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); } wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window); @@ -978,13 +984,11 @@ efl_util_set_window_screen_mode(Evas_Object *window, res = _wl_init(); EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window); if (wlwin) { - while (!_eflutil.wl.policy.proto && (ret_dispatch != -1)) - ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - surface = ecore_wl2_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); @@ -1019,7 +1023,6 @@ efl_util_set_window_screen_mode(Evas_Object *window, ret_dispatch = 0; while (scr_mode_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1)) { - ecore_wl2_display_flush(_eflutil.wl.wl2_display); ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); count++; } @@ -1058,13 +1061,11 @@ efl_util_get_window_screen_mode(Evas_Object *window, res = _wl_init(); EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window); if (wlwin) { - while (!_eflutil.wl.policy.proto && (ret_dispatch != -1)) - ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - surface = ecore_wl2_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); @@ -1077,7 +1078,6 @@ efl_util_get_window_screen_mode(Evas_Object *window, ret_dispatch = 0; while (scr_mode_info->wait_for_done && (ret_dispatch != -1)) { - ecore_wl2_display_flush(_eflutil.wl.wl2_display); ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); } } @@ -1115,13 +1115,11 @@ efl_util_set_window_brightness(Evas_Object *window, int brightness) res = _wl_init(); EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window); if (wlwin) { - while (!_eflutil.wl.display_policy.proto && (ret_dispatch != -1)) - ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - surface = ecore_wl2_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); @@ -1156,7 +1154,6 @@ efl_util_set_window_brightness(Evas_Object *window, int brightness) ret_dispatch = 0; while (brightness_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1)) { - ecore_wl2_display_flush(_eflutil.wl.wl2_display); ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); count++; } @@ -1193,13 +1190,11 @@ efl_util_get_window_brightness(Evas_Object *window, int *brightness) res = _wl_init(); EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER); + EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.display_policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED); wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window); if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER; - while (!_eflutil.wl.display_policy.proto && (ret_dispatch != -1)) - ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - surface = ecore_wl2_window_surface_get(wlwin); EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EFL_UTIL_ERROR_INVALID_PARAMETER); @@ -1212,7 +1207,6 @@ efl_util_get_window_brightness(Evas_Object *window, int *brightness) ret_dispatch = 0; while (brightness_info->wait_for_done && (ret_dispatch != -1)) { - ecore_wl2_display_flush(_eflutil.wl.wl2_display); ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue); } } @@ -1317,8 +1311,6 @@ _efl_util_wl_inputgen_init() if (_wl_init() == EINA_FALSE) return EINA_FALSE; - wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy); EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE); @@ -1507,18 +1499,16 @@ _efl_util_wl_inputgen_deinit() { wl_seat_release(_eflutil.wl.devmgr.seat); _eflutil.wl.devmgr.seat = NULL; - - wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue); } if (_eflutil.wl.devmgr.devicemgr) { tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr); _eflutil.wl.devmgr.devicemgr = NULL; - - wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue); } + wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue); + if (_eflutil.wl.devmgr.queue) { wl_event_queue_destroy(_eflutil.wl.devmgr.queue); @@ -1932,8 +1922,6 @@ _efl_util_wl_screenshooter_init() if (_wl_init() == EINA_FALSE) return EINA_FALSE; - wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue); - display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy); EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE); @@ -1994,6 +1982,8 @@ _efl_util_wl_screenshooter_deinit() _eflutil.wl.shot.tz_screenshooter = NULL; } + wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue); + if (_eflutil.wl.shot.queue) { wl_event_queue_destroy(_eflutil.wl.shot.queue); @@ -2955,8 +2945,11 @@ efl_util_gesture_initialize(void) goto out; /* LCOV_EXCL_LINE */ } - while (!_eflutil_defaultqueue.wl.gesture.proto) - wl_display_dispatch(_eflutil_defaultqueue.wl.dpy); /* LCOV_EXCL_LINE */ + if (!_eflutil_defaultqueue.wl.gesture.proto) + { + set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */ + goto out; /* LCOV_EXCL_LINE */ + } if (_eflutil_defaultqueue.wl.gesture.event_init <= 0) { @@ -2978,6 +2971,13 @@ efl_util_gesture_initialize(void) out: /* LCOV_EXCL_START */ + if (_eflutil_defaultqueue.wl.gesture.proto) + { + tizen_gesture_destroy(_eflutil_defaultqueue.wl.gesture.proto); + _eflutil_defaultqueue.wl.gesture.proto = NULL; + _eflutil_defaultqueue.wl.init = EINA_FALSE; + } + if (gesture_h) { free(gesture_h); @@ -2994,6 +2994,13 @@ efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h) EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER); EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER); + if (_eflutil_defaultqueue.wl.gesture.proto) + { + tizen_gesture_destroy(_eflutil_defaultqueue.wl.gesture.proto); + _eflutil_defaultqueue.wl.gesture.proto = NULL; + _eflutil_defaultqueue.wl.init = EINA_FALSE; + } + free(gesture_h); gesture_h = NULL;