From 7a73695132cffbca3953d44f42ad8987b69e468a Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 21 Aug 2018 17:48:31 +0900 Subject: [PATCH] virtual: add voutput disconnect and destroy test to tdm_test change function name to tdm_output_attach_buffer. fix voutput buffer handling error of tdm_server. Change-Id: I081e9a1e0c562df1b31513f2161240ba422cb4d1 Signed-off-by: Junkyeong Kim --- client/tdm_client.c | 6 ++++-- src/tdm_output.c | 2 +- src/tdm_private.h | 2 +- src/tdm_server.c | 25 +++++++++++++++++++------ tools/tdm_test_client.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- tools/tdm_test_server.c | 6 +++++- 6 files changed, 75 insertions(+), 13 deletions(-) diff --git a/client/tdm_client.c b/client/tdm_client.c index d94925a..a187cb6 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -2364,7 +2364,8 @@ tdm_client_output_connect(tdm_client_output *output) TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_CONNECTED, TDM_ERROR_BAD_REQUEST); - private_output->connection = TDM_OUTPUT_CONN_STATUS_CONNECTED; + if (!private_output->watch_output_changes) + private_output->connection = TDM_OUTPUT_CONN_STATUS_CONNECTED; _tdm_client_voutput_send_available_modes(private_voutput); @@ -2391,7 +2392,8 @@ tdm_client_output_disconnect(tdm_client_output *output) TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_DISCONNECTED, TDM_ERROR_BAD_REQUEST); - private_output->connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; + if (!private_output->watch_output_changes) + private_output->connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; /* To Do : change voutput to output */ wl_tdm_voutput_disconnect(private_voutput->wl_voutput); diff --git a/src/tdm_output.c b/src/tdm_output.c index 66ad21b..902543e 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1259,7 +1259,7 @@ _tdm_output_commit_virtual(tdm_output *output, int sync, tdm_output_commit_handl TDM_GOTO_IF_FAIL(buffer != NULL, commit_failed); _pthread_mutex_unlock(&private_display->lock); - ret = tdm_output_send_buffer(private_output, buffer); + ret = tdm_output_attach_buffer(private_output, buffer); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed); ret = tdm_output_commit_buffer(private_output); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed); diff --git a/src/tdm_private.h b/src/tdm_private.h index 3cfd101..a5c59e3 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -269,7 +269,7 @@ tdm_output_set_connect(tdm_output *output); tdm_error tdm_output_set_disconnect(tdm_output *output); tdm_error -tdm_output_send_buffer(tdm_output *output, tbm_surface_h buffer); +tdm_output_attach_buffer(tdm_output *output, tbm_surface_h buffer); tdm_error tdm_output_commit_buffer(tdm_output *output); tdm_error diff --git a/src/tdm_server.c b/src/tdm_server.c index 09c6e3c..e51d868 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -214,7 +214,7 @@ _tdm_server_cb_output_change(tdm_output *output, tdm_output_change_type type, return; } - TDM_DBG("send the output changes: %d", (unsigned int)pid); + TDM_DBG("send the output changes: %d, type:%d, value:%d", (unsigned int)pid, type, value.u32); switch (type) { case TDM_OUTPUT_CHANGE_DPMS: @@ -784,6 +784,13 @@ _tdm_voutput_cb_disconnect(struct wl_client *client, struct wl_resource *resourc voutput_info->mmwidth = 0; voutput_info->mmheight = 0; + if (voutput_info->attach_buffer) { + tbm_surface_h buffer = voutput_info->attach_buffer->buffer; + tbm_surface_internal_unref(buffer); + voutput_info->committing = 0; + voutput_info->attach_buffer = NULL; + } + tdm_output_set_disconnect(voutput_info->output); } @@ -794,15 +801,13 @@ _tdm_voutput_cb_commit_done(struct wl_client *client, struct wl_resource *resour tbm_surface_h buffer; voutput_info = wl_resource_get_user_data(resource); - if (voutput_info->status != TDM_OUTPUT_CONN_STATUS_CONNECTED) - { - // handle error + if (voutput_info->status != TDM_OUTPUT_CONN_STATUS_CONNECTED) { + TDM_DBG("not connected."); return; } buffer = voutput_info->attach_buffer->buffer; tbm_surface_internal_unref(buffer); - voutput_info->committing = 0; voutput_info->attach_buffer = NULL; @@ -1028,7 +1033,7 @@ _tdm_output_get_voutput_buffer(tdm_server_voutput_info *voutput_info, tbm_surfac } INTERN tdm_error -tdm_output_send_buffer(tdm_output *output, tbm_surface_h buffer) +tdm_output_attach_buffer(tdm_output *output, tbm_surface_h buffer) { tdm_private_server *private_server = keep_private_server; tdm_server_voutput_info *voutput_info = NULL, *vo = NULL; @@ -1073,6 +1078,7 @@ tdm_output_commit_buffer(tdm_output *output) TDM_RETURN_VAL_IF_FAIL(voutput_info->attach_buffer != NULL, TDM_ERROR_OPERATION_FAILED); TDM_RETURN_VAL_IF_FAIL(voutput_info->committing == 0, TDM_ERROR_OPERATION_FAILED); + tbm_surface_internal_ref(voutput_info->attach_buffer->buffer); voutput_info->committing = 1; wl_tdm_voutput_send_commit(voutput_info->resource); @@ -1099,6 +1105,13 @@ tdm_voutput_cb_resource_destroy(struct wl_resource *resource) if (ret != TDM_ERROR_NONE) TDM_ERR("_tdm_voutput_cb_destroy fail"); + if (voutput_info->attach_buffer) { + tbm_surface_h buffer = voutput_info->attach_buffer->buffer; + tbm_surface_internal_unref(buffer); + voutput_info->committing = 0; + voutput_info->attach_buffer = NULL; + } + LIST_FOR_EACH_ENTRY(vb, &voutput_info->buffer_list, link) { if (!vb) continue; diff --git a/tools/tdm_test_client.c b/tools/tdm_test_client.c index bb0ba22..cac60a8 100644 --- a/tools/tdm_test_client.c +++ b/tools/tdm_test_client.c @@ -66,6 +66,8 @@ typedef struct _tdm_test_client { int waiting; tdm_client *client; + tdm_client_voutput *voutput; + tdm_client_output *output; } tdm_test_client; struct typestrings { @@ -564,14 +566,49 @@ _voutput_commit(tdm_client_voutput *voutput, tbm_surface_h buffer, void *user_da TDM_EXIT_IF_FAIL(data != NULL); TDM_EXIT_IF_FAIL(buffer != NULL); - if (count < 11) + if (count < 10) _dump_buffer(buffer, count); count++; - printf("client: %d commited(%p)\n", count, buffer); + if (count == 70) { + printf("client: %d commited(%p), disconnect\n", count, buffer); + tdm_client_output_disconnect(data->output); + } else { + printf("client: %d commited(%p)\n", count, buffer); + } + tdm_client_voutput_commit_done(voutput); } +static void +_voutput_output_handler(tdm_client_output *output, tdm_output_change_type type, + tdm_value value, void *user_data) +{ + tdm_client_voutput *voutput = NULL; + tdm_output_conn_status status; + tdm_test_client *data; + + data = (tdm_test_client *) user_data; + TDM_RETURN_IF_FAIL(data != NULL); + voutput = data->voutput; + TDM_RETURN_IF_FAIL(voutput != NULL); + + if (type == TDM_OUTPUT_CHANGE_CONNECTION) { + status = (tdm_output_conn_status)value.u32; + printf("output %s.\n", conn_str[value.u32]); + + if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) { + printf("client: disconnected, destroy voutput\n"); + tdm_client_output_remove_change_handler(output, _voutput_output_handler, data); + tdm_client_voutput_destroy(voutput); + } else if (status == TDM_OUTPUT_CONN_STATUS_CONNECTED) { + printf("client: connected\n"); + } + } else if (type == TDM_OUTPUT_CHANGE_DPMS) { + printf("output %s.\n", dpms_str[value.u32]); + } +} + static void _voutput_make_available_mode(tdm_client_output_mode *modes, int count) { @@ -614,6 +651,9 @@ do_voutput(tdm_test_client *data) output = tdm_client_voutput_get_client_output(voutput, &ret); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done); + ret = tdm_client_output_add_change_handler(output, _voutput_output_handler, data); + TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done); + ret = tdm_client_voutput_set_physical_size(voutput, 300, 200); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done); @@ -624,6 +664,9 @@ do_voutput(tdm_test_client *data) ret = tdm_client_output_connect(output); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, done); + data->voutput = voutput; + data->output = output; + while (1) { tdm_client_handle_events_timeout(data->client, 1000); } diff --git a/tools/tdm_test_server.c b/tools/tdm_test_server.c index b439540..98b10db 100644 --- a/tools/tdm_test_server.c +++ b/tools/tdm_test_server.c @@ -961,6 +961,8 @@ _voutput_disconnect(tdm_test_server_voutput *voutput) output = voutput->output; + printf("output: %p disconnect\n", voutput); + ret = tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF); TDM_EXIT_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -1008,6 +1010,8 @@ _tdm_output_cb_destroy_handler(tdm_output *output, void *user_data) tbm_surface_destroy(voutput->bufs[i]); } + printf("voutput: %p destroy\n", voutput); + free(voutput); } @@ -1035,7 +1039,7 @@ _tdm_output_cb_create_handler(tdm_display *dpy, tdm_output *output, void *user_d voutput->output = output; voutput->data = data; - printf("voutput create done\n"); + printf("voutput %p create done\n", voutput); LIST_ADDTAIL(&voutput->link, &data->voutput_list); } -- 2.7.4