From: Sangjin Lee Date: Sat, 10 Dec 2016 07:33:30 +0000 (+0900) Subject: bufferqueue: Add destructor for bq_buffer X-Git-Tag: submit/tizen/20161212.024344~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c48655089e59b4df9784581a91fd067d25da13f0;p=platform%2Fupstream%2Fenlightenment.git bufferqueue: Add destructor for bq_buffer Add destructor to bufferqueue protocol and version up to 2. and do not destroy wl_resource without client's request Change-Id: Ie923b32efcbfe0b0198cf19f5dd603d293a5f74a --- diff --git a/src/modules/bufferqueue/bq_mgr.xml b/src/modules/bufferqueue/bq_mgr.xml index d86df2c610..2976dccfee 100644 --- a/src/modules/bufferqueue/bq_mgr.xml +++ b/src/modules/bufferqueue/bq_mgr.xml @@ -19,7 +19,7 @@ - + @@ -61,9 +61,14 @@ + + + + + - + @@ -115,9 +120,15 @@ + + + + + - + + diff --git a/src/modules/bufferqueue/bq_mgr_protocol.c b/src/modules/bufferqueue/bq_mgr_protocol.c index fe8b98c9bc..01e4689228 100644 --- a/src/modules/bufferqueue/bq_mgr_protocol.c +++ b/src/modules/bufferqueue/bq_mgr_protocol.c @@ -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, }; diff --git a/src/modules/bufferqueue/bq_mgr_protocol.h b/src/modules/bufferqueue/bq_mgr_protocol.h index b2d7bcc775..6e90c1d351 100644 --- a/src/modules/bufferqueue/bq_mgr_protocol.h +++ b/src/modules/bufferqueue/bq_mgr_protocol.h @@ -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 } diff --git a/src/modules/bufferqueue/e_mod_main.c b/src/modules/bufferqueue/e_mod_main.c index fe8f5deb0b..48e0b9059c 100644 --- a/src/modules/bufferqueue/e_mod_main.c +++ b/src/modules/bufferqueue/e_mod_main.c @@ -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)); @@ -402,52 +382,6 @@ _e_bq_mgr_buffer_consumer_free(E_Bq_Consumer *consumer) free(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) { @@ -491,6 +425,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) { @@ -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;