bufferqueue: Add destructor for bq_buffer
authorSangjin Lee <lsj119@samsung.com>
Sat, 10 Dec 2016 07:33:30 +0000 (16:33 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Mon, 12 Dec 2016 02:33:39 +0000 (11:33 +0900)
Add destructor to bufferqueue protocol and version up to 2.
and do not destroy wl_resource without client's request

Change-Id: Ie923b32efcbfe0b0198cf19f5dd603d293a5f74a

src/modules/bufferqueue/bq_mgr.xml
src/modules/bufferqueue/bq_mgr_protocol.c
src/modules/bufferqueue/bq_mgr_protocol.h
src/modules/bufferqueue/e_mod_main.c

index d86df2c..2976dcc 100644 (file)
@@ -19,7 +19,7 @@
     </request>
   </interface>
 
-  <interface name="bq_consumer" version="1">
+  <interface name="bq_consumer" version="2">
     <request name="release_buffer">
       <arg name="buffer" type="object" interface="bq_buffer"/>
     </request>
       <arg name="buffer" type="object" interface="bq_buffer"/>
       <arg name="serial" type="uint"/>
     </event>
+
+    <!-- Version 2 additions -->
+    <request name="destroy" type="destructor" since="2">
+      <description summary="destroy the bq_consumer object"/>
+    </request>
   </interface>
 
-  <interface name="bq_provider" version="1">
+  <interface name="bq_provider" version="2">
     <enum name="error">
       <entry name="overflow_queue_size" value="0"/>
       <entry name="connection" value="1"/>
       <arg name="buffer" type="object" interface="bq_buffer"/>
       <arg name="serial" type="uint"/>
     </event>
+
+    <!-- Version 2 additions -->
+    <request name="destroy" type="destructor" since="2">
+      <description summary="release the bq_provider object"/>
+    </request>
   </interface>
 
-  <interface name="bq_buffer" version="1">
+  <interface name="bq_buffer" version="2">
+    <request name="destroy" type="destructor" since="2"/>
   </interface>
 </protocol>
 
index fe8b98c..01e4689 100644 (file)
@@ -85,6 +85,7 @@ WL_EXPORT const struct wl_interface bq_mgr_interface = {
 
 static const struct wl_message bq_consumer_requests[] = {
        { "release_buffer", "o", types + 10 },
+       { "destroy", "2", types + 0 },
 };
 
 static const struct wl_message bq_consumer_events[] = {
@@ -98,8 +99,8 @@ static const struct wl_message bq_consumer_events[] = {
 };
 
 WL_EXPORT const struct wl_interface bq_consumer_interface = {
-       "bq_consumer", 1,
-       1, bq_consumer_requests,
+       "bq_consumer", 2,
+       2, bq_consumer_requests,
        7, bq_consumer_events,
 };
 
@@ -109,6 +110,7 @@ static const struct wl_message bq_provider_requests[] = {
        { "set_buffer_fd", "ohiiiiii", types + 50 },
        { "detach_buffer", "o", types + 58 },
        { "enqueue_buffer", "ou", types + 59 },
+       { "destroy", "2", types + 0 },
 };
 
 static const struct wl_message bq_provider_events[] = {
@@ -118,14 +120,18 @@ static const struct wl_message bq_provider_events[] = {
 };
 
 WL_EXPORT const struct wl_interface bq_provider_interface = {
-       "bq_provider", 1,
-       5, bq_provider_requests,
+       "bq_provider", 2,
+       6, bq_provider_requests,
        3, bq_provider_events,
 };
 
+static const struct wl_message bq_buffer_requests[] = {
+       { "destroy", "2", types + 0 },
+};
+
 WL_EXPORT const struct wl_interface bq_buffer_interface = {
-       "bq_buffer", 1,
-       0, NULL,
+       "bq_buffer", 2,
+       1, bq_buffer_requests,
        0, NULL,
 };
 
index b2d7bcc..6e90c1d 100644 (file)
@@ -12,10 +12,10 @@ extern "C" {
 struct wl_client;
 struct wl_resource;
 
-struct bq_mgr;
+struct bq_buffer;
 struct bq_consumer;
+struct bq_mgr;
 struct bq_provider;
-struct bq_buffer;
 
 extern const struct wl_interface bq_mgr_interface;
 extern const struct wl_interface bq_consumer_interface;
@@ -67,6 +67,14 @@ struct bq_consumer_interface {
        void (*release_buffer)(struct wl_client *client,
                               struct wl_resource *resource,
                               struct wl_resource *buffer);
+       /**
+        * destroy - destroy the bq_consumer object
+        *
+        * 
+        * @since: 2
+        */
+       void (*destroy)(struct wl_client *client,
+                       struct wl_resource *resource);
 };
 
 #define BQ_CONSUMER_CONNECTED  0
@@ -211,6 +219,14 @@ struct bq_provider_interface {
                               struct wl_resource *resource,
                               struct wl_resource *buffer,
                               uint32_t serial);
+       /**
+        * destroy - release the bq_provider object
+        *
+        * 
+        * @since: 2
+        */
+       void (*destroy)(struct wl_client *client,
+                       struct wl_resource *resource);
 };
 
 #define BQ_PROVIDER_CONNECTED  0
@@ -239,6 +255,15 @@ bq_provider_send_add_buffer(struct wl_resource *resource_, struct wl_resource *b
        wl_resource_post_event(resource_, BQ_PROVIDER_ADD_BUFFER, buffer, serial);
 }
 
+struct bq_buffer_interface {
+       /**
+        * destroy - (none)
+        * @since: 2
+        */
+       void (*destroy)(struct wl_client *client,
+                       struct wl_resource *resource);
+};
+
 
 #ifdef  __cplusplus
 }
index fe8f5de..48e0b90 100644 (file)
@@ -248,22 +248,10 @@ _e_bq_mgr_bq_free(E_Bq_Queue *bq)
 
    DBG("destroy buffer queue : %s\n", bq->name);
 
-   if (bq->consumer)
-     {
-        wl_resource_destroy(e_object_data_get(E_OBJECT(bq->consumer)));
-        bq->consumer = NULL;
-     }
-
-   if (bq->provider)
-     {
-        wl_resource_destroy(e_object_data_get(E_OBJECT(bq->provider)));
-        bq->provider = NULL;
-     }
-
    while (bq->buffers)
      {
         bq_buf = EINA_INLIST_CONTAINER_GET(bq->buffers, E_Bq_Buffer);
-        bq->buffers = eina_inlist_remove(bq->buffers, bq->buffers);
+        bq->buffers = eina_inlist_remove(bq->buffers, EINA_INLIST_GET(bq_buf));
 
         if (bq_buf->consumer)
           {
@@ -344,8 +332,15 @@ _e_bq_mgr_buffer_consumer_release_buffer(struct wl_client *client, struct wl_res
      }
 }
 
+static void
+_e_bq_mgr_consumer_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
 static const struct bq_consumer_interface _bq_consumer_interface = {
-     _e_bq_mgr_buffer_consumer_release_buffer
+     _e_bq_mgr_buffer_consumer_release_buffer,
+     _e_bq_mgr_consumer_cb_destroy
 };
 
 static void
@@ -373,23 +368,8 @@ _e_bq_mgr_buffer_consumer_destroy(struct wl_resource *resource)
    while (bq->buffers)
      {
         bq_buf = EINA_INLIST_CONTAINER_GET(bq->buffers, E_Bq_Buffer);
-        bq->buffers = eina_inlist_remove(bq->buffers, bq->buffers);
-
+        bq->buffers = eina_inlist_remove(bq->buffers, EINA_INLIST_GET(bq_buf));
         DBG("destroy BUFFER : %d\n", bq_buf->type);
-
-        if (bq_buf->consumer)
-          {
-             wl_resource_destroy(bq_buf->consumer);
-             bq_buf->consumer = NULL;
-             e_object_unref(E_OBJECT(bq_buf));
-          }
-
-        if (bq_buf->provider)
-          {
-             wl_resource_destroy(bq_buf->provider);
-             bq_buf->provider = NULL;
-             e_object_del(E_OBJECT(bq_buf));
-          }
      }
 
    e_object_unref(E_OBJECT(bq));
@@ -403,52 +383,6 @@ _e_bq_mgr_buffer_consumer_free(E_Bq_Consumer *consumer)
 }
 
 static void
-_e_bq_mgr_buffer_destroy(struct wl_resource *resource)
-{
-   E_Bq_Buffer *bq_buf = wl_resource_get_user_data(resource);
-
-   if (!bq_buf)
-     return;
-
-   if (bq_buf->consumer == resource)
-     {
-        DBG("destroy buffer : consumer");
-     }
-   else if (bq_buf->provider == resource)
-     {
-        DBG("destroy buffer : provider");
-     }
-}
-
-static void
-_e_bq_mgr_consumer_side_buffer_create(E_Bq_Consumer *consumer, E_Bq_Buffer *buffer)
-{
-   struct wl_resource *resource;
-
-   if (!consumer)
-     return;
-
-   resource = e_object_data_get(E_OBJECT(consumer));
-   if (!resource)
-     return;
-
-   buffer->consumer = wl_resource_create(wl_resource_get_client(resource),
-                                        &bq_buffer_interface, 1, 0);
-   EINA_SAFETY_ON_NULL_RETURN(buffer->consumer);
-
-   wl_resource_set_implementation(buffer->consumer, NULL, buffer, _e_bq_mgr_buffer_destroy);
-   e_object_ref(E_OBJECT(buffer));
-
-   bq_consumer_send_buffer_attached(resource,
-                                    buffer->consumer,
-                                    buffer->engine,
-                                    buffer->width,
-                                    buffer->height,
-                                    buffer->format,
-                                    buffer->flags);
-}
-
-static void
 _e_bq_mgr_consumer_side_buffer_set(E_Bq_Consumer *consumer, E_Bq_Buffer *buffer)
 {
    struct wl_resource *resource;
@@ -492,6 +426,61 @@ _e_bq_mgr_consumer_side_buffer_set(E_Bq_Consumer *consumer, E_Bq_Buffer *buffer)
 }
 
 static void
+_e_bq_mgr_buffer_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   E_Bq_Buffer *bq_buf;
+
+   bq_buf = wl_resource_get_user_data(resource);
+   if (!bq_buf)
+     return;
+
+   if (bq_buf->consumer == resource)
+     {
+        e_object_unref(E_OBJECT(bq_buf));
+        bq_buf->consumer = NULL;
+     }
+   if (bq_buf->provider == resource)
+     {
+        e_object_del(E_OBJECT(bq_buf));
+        bq_buf->provider = NULL;
+     }
+
+   wl_resource_destroy(resource);
+}
+
+static const struct bq_buffer_interface _bq_buffer_interface = {
+   _e_bq_mgr_buffer_cb_destroy
+};
+
+static void
+_e_bq_mgr_consumer_side_buffer_create(E_Bq_Consumer *consumer, E_Bq_Buffer *buffer)
+{
+   struct wl_resource *resource;
+
+   if (!consumer)
+     return;
+
+   resource = e_object_data_get(E_OBJECT(consumer));
+   buffer->consumer = wl_resource_create(wl_resource_get_client(resource),
+                                         &bq_buffer_interface, 2, 0);
+
+   if(!buffer->consumer)
+     return;
+
+   wl_resource_set_implementation(buffer->consumer, &_bq_buffer_interface,
+                                  buffer, NULL);
+   e_object_ref(E_OBJECT(buffer));
+
+   bq_consumer_send_buffer_attached(resource,
+                                    buffer->consumer,
+                                    buffer->engine,
+                                    buffer->width,
+                                    buffer->height,
+                                    buffer->format,
+                                    buffer->flags);
+}
+
+static void
 _e_bq_mgr_bq_create_consumer(struct wl_client *client, struct wl_resource *resource, uint32_t id, const char *name, int32_t queue_size, int32_t width, int32_t height)
 {
    E_Bq_Mgr *bq_mgr = wl_resource_get_user_data(resource);
@@ -523,7 +512,7 @@ _e_bq_mgr_bq_create_consumer(struct wl_client *client, struct wl_resource *resou
 
    new_resource = wl_resource_create(client,
                                      &bq_consumer_interface,
-                                     1, id);
+                                     2, id);
    if (!new_resource)
      {
         free(consumer);
@@ -583,7 +572,7 @@ _e_bq_mgr_provider_buffer_attach(struct wl_client *client, struct wl_resource *r
    if (!bq_buf)
      return;
 
-   bq_buf->provider = wl_resource_create(client, &bq_buffer_interface, 1, buffer);
+   bq_buf->provider = wl_resource_create(client, &bq_buffer_interface, 2, buffer);
    if (!bq_buf->provider)
      {
         free(bq_buf);
@@ -591,7 +580,7 @@ _e_bq_mgr_provider_buffer_attach(struct wl_client *client, struct wl_resource *r
         return;
      }
 
-   wl_resource_set_implementation(bq_buf->provider, NULL, bq_buf, _e_bq_mgr_buffer_destroy);
+   wl_resource_set_implementation(bq_buf->provider, &_bq_buffer_interface, bq_buf, NULL);
 
    bq_buf->engine = strdup(engine);
    bq_buf->width = width;
@@ -678,16 +667,10 @@ _e_bq_mgr_provider_buffer_detach(struct wl_client *client, struct wl_resource *r
    bq_buf= wl_resource_get_user_data(buffer);
 
    if (consumer)
-     {
-        bq_consumer_send_buffer_detached(e_object_data_get(E_OBJECT(consumer)),
-                                         bq_buf->consumer);
-        wl_resource_destroy(bq_buf->consumer);
-        e_object_unref(E_OBJECT(bq_buf));
-     }
+     bq_consumer_send_buffer_detached(e_object_data_get(E_OBJECT(consumer)),
+                                       bq_buf->consumer);
 
-   wl_resource_destroy(bq_buf->provider);
    bq->buffers = eina_inlist_remove(bq->buffers, EINA_INLIST_GET(bq_buf));
-   e_object_del(E_OBJECT(bq_buf));
 }
 
 static void
@@ -718,12 +701,19 @@ _e_bq_mgr_provider_buffer_enqueue(struct wl_client *client, struct wl_resource *
                                bq_buf->serial);
 }
 
+static void
+_e_bq_mgr_provider_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
 static const struct bq_provider_interface _bq_provider_interface = {
    _e_bq_mgr_provider_buffer_attach,
    _e_bq_mgr_provider_buffer_id_set,
    _e_bq_mgr_provider_buffer_fd_set,
    _e_bq_mgr_provider_buffer_detach,
-   _e_bq_mgr_provider_buffer_enqueue
+   _e_bq_mgr_provider_buffer_enqueue,
+   _e_bq_mgr_provider_cb_destroy
 };
 
 static void
@@ -749,23 +739,11 @@ _e_bq_mgr_provider_destroy(struct wl_resource *resource)
    while (bq->buffers)
      {
         bq_buf = EINA_INLIST_CONTAINER_GET(bq->buffers, E_Bq_Buffer);
-        bq->buffers = eina_inlist_remove(bq->buffers, bq->buffers);
+        bq->buffers = eina_inlist_remove(bq->buffers, EINA_INLIST_GET(bq_buf));
 
         if (bq_buf->consumer)
-          {
-             bq_consumer_send_buffer_detached(e_object_data_get(E_OBJECT(consumer)),
-                                              bq_buf->consumer);
-             wl_resource_destroy(bq_buf->consumer);
-             bq_buf->consumer = NULL;
-             e_object_unref(E_OBJECT(bq_buf));
-          }
-
-        if (bq_buf->provider)
-          {
-             wl_resource_destroy(bq_buf->provider);
-             bq_buf->provider = NULL;
-             e_object_del(E_OBJECT(bq_buf));
-          }
+          bq_consumer_send_buffer_detached(e_object_data_get(E_OBJECT(consumer)),
+                                           bq_buf->consumer);
      }
 
    if (consumer)
@@ -816,7 +794,7 @@ _e_bq_mgr_provider_create(struct wl_client *client, struct wl_resource *resource
 
    new_resource = wl_resource_create(client,
                                      &bq_provider_interface,
-                                     1, id);
+                                     2, id);
    if (!new_resource)
      goto on_error;