manage the exported buffer to the list at queue 30/64930/1
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 5 Apr 2016 04:06:45 +0000 (13:06 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 6 Apr 2016 08:48:48 +0000 (17:48 +0900)
Change-Id: I2a4be9c726d9c585c121fb108ee500033377c934

src/wayland-tbm-server.c

index e513f5e..5979fc3 100755 (executable)
@@ -74,6 +74,10 @@ struct wayland_tbm_buffer {
 \r
        wayland_tbm_server_surface_destroy_cb destroy_cb;\r
        void *user_data;\r
+\r
+       struct wayland_tbm_client_queue *cqueue;\r
+\r
+       struct wl_list link;\r
 };\r
 \r
 struct wayland_tbm_client_resource {\r
@@ -90,6 +94,8 @@ struct wayland_tbm_client_queue {
        struct wl_resource *wl_surface;\r
        pid_t pid;\r
 \r
+       struct wl_list tbm_buffer_list;\r
+\r
        struct wl_list link;\r
 };\r
 \r
@@ -108,7 +114,8 @@ _wayland_tbm_server_buffer_destory(struct wl_resource *wl_buffer)
 \r
 #ifdef DEBUG_TRACE\r
        pid_t pid = 0; uid_t uid = 0; gid_t gid = 0;\r
-       wl_client_get_credentials(tbm_buffer->client, &pid, &uid, &gid);\r
+       if (tbm_buffer && tbm_buffer->client)\r
+               wl_client_get_credentials(tbm_buffer->client, &pid, &uid, &gid);\r
        WL_TBM_TRACE("            pid:%d tbm_surface:%p\n", pid, tbm_buffer->surface);\r
 #endif\r
        _wayland_tbm_server_tbm_buffer_destroy(tbm_buffer);\r
@@ -133,13 +140,26 @@ static const struct wl_buffer_interface _wayland_tbm_buffer_impementation = {
 static void\r
 _wayland_tbm_server_tbm_buffer_destroy(struct wayland_tbm_buffer *tbm_buffer)\r
 {\r
-       if (tbm_buffer->destroy_cb)\r
-        tbm_buffer->destroy_cb(tbm_buffer->surface, tbm_buffer->user_data);\r
+       WL_TBM_RETURN_IF_FAIL(tbm_buffer != NULL);\r
 \r
-       tbm_surface_internal_delete_user_data(tbm_buffer->surface, KEY_TBM_BUFFER);\r
-       tbm_surface_internal_unref(tbm_buffer->surface);\r
+       struct wayland_tbm_buffer *tbm_buffer2 = NULL, *tmp_tbm_buffer = NULL;\r
+       struct wayland_tbm_client_queue *cqueue = tbm_buffer->cqueue;\r
+       WL_TBM_RETURN_IF_FAIL(cqueue != NULL);\r
 \r
-       free(tbm_buffer);\r
+       if (!wl_list_empty(&cqueue->tbm_buffer_list)) {\r
+               wl_list_for_each_safe(tbm_buffer2, tmp_tbm_buffer, &cqueue->tbm_buffer_list, link) {\r
+            if (tbm_buffer2 == tbm_buffer) {\r
+                               wl_list_remove(&tbm_buffer2->link);\r
+                               if (tbm_buffer->destroy_cb)\r
+                                       tbm_buffer->destroy_cb(tbm_buffer2->surface, tbm_buffer2->user_data);\r
+                               tbm_surface_internal_delete_user_data(tbm_buffer2->surface, KEY_TBM_BUFFER);\r
+                               tbm_surface_internal_unref(tbm_buffer2->surface);\r
+                               free(tbm_buffer2);\r
+                               tbm_buffer2 = NULL;\r
+                               break;\r
+            }\r
+               }\r
+       }\r
 }\r
 \r
 static struct wayland_tbm_buffer *\r
@@ -190,14 +210,26 @@ _wayland_tbm_server_tbm_buffer_create(struct wl_resource *wl_tbm,
 }\r
 \r
 static void\r
-_destroy_tbm_queue(struct wl_resource *wl_tbm_queue)\r
+_wayland_tbm_server_surface_queue_destroy(struct wl_resource *wl_tbm_queue)\r
 {\r
        struct wayland_tbm_client_queue *cqueue = wl_resource_get_user_data(wl_tbm_queue);\r
+       struct wayland_tbm_buffer *tbm_buffer = NULL, *tmp_tbm_buffer = NULL;\r
 \r
        if (cqueue) {\r
 #ifdef DEBUG_TRACE\r
                WL_TBM_TRACE("destory queue. pid:%d\n", cqueue->pid);\r
 #endif\r
+               if (!wl_list_empty(&cqueue->tbm_buffer_list)) {\r
+                       wl_list_for_each_safe(tbm_buffer, tmp_tbm_buffer, &cqueue->tbm_buffer_list, link) {\r
+                               wl_list_remove(&tbm_buffer->link);\r
+                               if (tbm_buffer->destroy_cb)\r
+                                       tbm_buffer->destroy_cb(tbm_buffer->surface, tbm_buffer->user_data);\r
+                               tbm_surface_internal_delete_user_data(tbm_buffer->surface, KEY_TBM_BUFFER);\r
+                               tbm_surface_internal_unref(tbm_buffer->surface);\r
+                               free(tbm_buffer);\r
+                               tbm_buffer = NULL;\r
+                       }\r
+               }\r
 \r
                wl_list_remove(&cqueue->link);\r
                free(cqueue);\r
@@ -536,9 +568,10 @@ _wayland_tbm_server_impl_create_surface_queue(struct wl_client *client,
 \r
        wl_resource_set_implementation(cqueue->wl_tbm_queue,\r
                                       (void (* *)(void)) &_wayland_tbm_queue_impementation,\r
-                                      cqueue, _destroy_tbm_queue);\r
+                                      cqueue, _wayland_tbm_server_surface_queue_destroy);\r
 \r
-       wl_list_init(&cqueue->link);\r
+       /* init tbm_buffer list */\r
+       wl_list_init(&cqueue->tbm_buffer_list);\r
 \r
        /* add a cqueue to the list */\r
        wl_list_insert(&tbm_srv->cqueue_list, &cqueue->link);\r
@@ -578,6 +611,9 @@ _wayland_tbm_server_destroy_resource(struct wl_resource *wl_tbm)
                        }\r
                }\r
        }\r
+\r
+       /* remove the queue resources */\r
+       // TODO:\r
 }\r
 \r
 static void\r
@@ -859,18 +895,25 @@ wayland_tbm_server_client_queue_export_buffer(struct wayland_tbm_client_queue *c
        struct wl_resource *wl_tbm = NULL;\r
        struct wayland_tbm_buffer *tbm_buffer = NULL;\r
        struct wl_client *client = NULL;\r
-       void *data = NULL;\r
 \r
        WL_TBM_RETURN_VAL_IF_FAIL(cqueue != NULL, 0);\r
        WL_TBM_RETURN_VAL_IF_FAIL(cqueue->wl_tbm_queue != NULL, 0);\r
        WL_TBM_RETURN_VAL_IF_FAIL(surface != NULL, 0);\r
 \r
+#if 0\r
+       void *data = NULL;\r
     /* return if the surface is already exported to the client on the cqueue */\r
-       tbm_surface_internal_get_user_data(surface, KEY_TBM_BUFFER, &data);\r
-       if (data != NULL) {\r
-               //WL_TBM_S_LOG("WARNING...surface(%p) is already export\n", surface);\r
-               return 0;\r
+       if (tbm_surface_internal_get_user_data(surface, KEY_TBM_BUFFER, &data)) {\r
+               if (data != NULL) {\r
+                       tbm_buffer = (struct wayland_tbm_buffer *)data;\r
+                       tbm_surface_internal_add_user_data(surface, tbm_buffer->wl_buffer, NULL);\r
+                       tbm_surface_internal_set_user_data(surface, tbm_buffer->wl_buffer, (void *)data);\r
+                       data = NULL;\r
+                       tbm_buffer = NULL;\r
+                       //return 0;\r
+               }\r
        }\r
+#endif\r
 \r
        wl_tbm = cqueue->wl_tbm;\r
        client = wl_resource_get_client(cqueue->wl_tbm_queue);\r
@@ -881,9 +924,12 @@ wayland_tbm_server_client_queue_export_buffer(struct wayland_tbm_client_queue *c
                tbm_surface_internal_unref(surface);\r
                return 0;\r
        }\r
-\r
        tbm_buffer->destroy_cb = destroy_cb;\r
        tbm_buffer->user_data = user_data;\r
+       tbm_buffer->cqueue = cqueue;\r
+\r
+       /* add the tbm_buffer to the buffer list */\r
+       wl_list_insert(&cqueue->tbm_buffer_list, &tbm_buffer->link);\r
 \r
        if(!_wayland_tbm_server_wl_tbm_queue_send_surface(cqueue,\r
                                tbm_buffer->wl_buffer, surface, flags)) {\r