Replace wl_display_roundtrip with wl_display_roundtrip_queue 83/132583/6
authorHyunho Kang <hhstark.kang@samsung.com>
Wed, 7 Jun 2017 04:33:54 +0000 (13:33 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Thu, 8 Jun 2017 11:39:07 +0000 (20:39 +0900)
wl_display_roundtrip API depend on ecore main loop.
To support multi-thread senario we should use wl_display_roundtrip_queue

Change-Id: I35e1e141f9a2304e94dba479f2b2352ec3896c06
Signed-off-by: Hyunho Kang <hhstark.kang@samsung.com>
screen_connector_provider/src/screen_connector_provider.c

index 70575e4..403c975 100644 (file)
@@ -88,29 +88,40 @@ static const struct tizen_remote_surface_provider_listener __rsp_listener = {
 
 EXPORT_API screen_connector_provider_h screen_connector_provider_create(const char *id, struct wl_surface *surface)
 {
-       struct screen_connector_provider_s *remote;
+       struct screen_connector_provider_s *remote = NULL;
        struct wl_display *display;
+       struct wl_event_queue *queue = NULL;
+       struct wl_display *rsm_wrapper = NULL;
 
        if (!__rsm) {
                LOGE("__rsm is not ready");
-               return NULL;
+               goto out;
+       }
+
+       rsm_wrapper = wl_proxy_create_wrapper(__rsm);
+       if (!rsm_wrapper) {
+               LOGE("failed to create wl display wrapper");
+               goto out;
        }
 
        if (!surface || !id) {
                LOGE("invalid parameter");
-               return NULL;
+               goto out;
        }
 
        display = ecore_wl_display_get();
        if (!display) {
                LOGE("Fail to get");
-               return NULL;
+               goto out;
        }
 
+       queue = wl_display_create_queue(display);
+       wl_proxy_set_queue((struct wl_proxy *)rsm_wrapper, queue);
+
        remote = (struct screen_connector_provider_s *)malloc(sizeof(struct screen_connector_provider_s));
        if (!remote) {
                LOGE("out of memory");
-               return NULL;
+               goto out;
        }
 
        remote->surface = surface;
@@ -118,28 +129,38 @@ EXPORT_API screen_connector_provider_h screen_connector_provider_create(const ch
        if (!remote->win) {
                LOGE("failed to find win");
                free(remote);
-               return NULL;
+               remote = NULL;
+               goto out;
        }
 
-       remote->rsp = tizen_remote_surface_manager_create_provider(__rsm, surface);
+       remote->rsp = tizen_remote_surface_manager_create_provider((struct tizen_remote_surface_manager *)rsm_wrapper, surface);
        if (!remote->rsp) {
                LOGE("failed to create provider");
                free(remote);
-               return NULL;
+               remote = NULL;
+               goto out;
        }
 
        remote->id = strdup(id);
        if (!remote->id) {
-               free(remote);
                LOGE("out of memory");
-               return NULL;
+               free(remote);
+               remote = NULL;
+               goto out;
        }
 
        tizen_remote_surface_provider_add_listener(remote->rsp, &__rsp_listener, remote);
-
-       wl_display_roundtrip(display);
+       wl_display_roundtrip_queue(display, queue);
+       wl_proxy_set_queue((struct wl_proxy *)remote->rsp, NULL);
        LOGD("surface remote enabled");
 
+out:
+       if (queue)
+               wl_event_queue_destroy(queue);
+
+       if (rsm_wrapper)
+               wl_proxy_wrapper_destroy(rsm_wrapper);
+
        return remote;
 }