virtual: add voutput disconnect and destroy test to tdm_test 56/187256/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Tue, 21 Aug 2018 08:48:31 +0000 (17:48 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Tue, 21 Aug 2018 08:48:38 +0000 (17:48 +0900)
change function name to tdm_output_attach_buffer.
fix voutput buffer handling error of tdm_server.

Change-Id: I081e9a1e0c562df1b31513f2161240ba422cb4d1
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
client/tdm_client.c
src/tdm_output.c
src/tdm_private.h
src/tdm_server.c
tools/tdm_test_client.c
tools/tdm_test_server.c

index d94925a..a187cb6 100644 (file)
@@ -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);
index 66ad21b..902543e 100644 (file)
@@ -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);
index 3cfd101..a5c59e3 100644 (file)
@@ -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
index 09c6e3c..e51d868 100644 (file)
@@ -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;
 
index bb0ba22..cac60a8 100644 (file)
@@ -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);
        }
index b439540..98b10db 100644 (file)
@@ -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);
 }