fix incorrect wayland API calls 48/323748/2
authorJoonbum Ko <joonbum.ko@samsung.com>
Wed, 16 Apr 2025 07:55:06 +0000 (16:55 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Thu, 8 May 2025 04:43:14 +0000 (13:43 +0900)
 - 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 <joonbum.ko@samsung.com>
src/efl_util.c

index 693c0605a90d712a9f82eb423f43f7a90c6311dd..b4586f69adf54f9e9d89b0912c7a8f07a87b840e 100644 (file)
@@ -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;