From 120c39938d9e714f6a1de33d611790a899c85133 Mon Sep 17 00:00:00 2001 From: lsj119 Date: Mon, 29 Apr 2019 19:36:10 +0900 Subject: [PATCH] headless-server: fix crash Change-Id: I79800b5fd97532cddbecfbad92698a434e17a3ec --- src/bin/headless/headless_server.c | 7 ++++--- src/bin/headless/headless_server.h | 7 +++++-- src/bin/headless/output/output_led.c | 30 +++++++++++++++++++--------- src/bin/headless/shell/shell.c | 27 ++++++++++++++++++++----- src/samples/headless_client.c | 28 +++++++++++++------------- 5 files changed, 66 insertions(+), 33 deletions(-) diff --git a/src/bin/headless/headless_server.c b/src/bin/headless/headless_server.c index c2079b8..976ffac 100644 --- a/src/bin/headless/headless_server.c +++ b/src/bin/headless/headless_server.c @@ -53,8 +53,8 @@ int main(int argc, char *argv[]) PEPPER_CHECK(ret, goto end, "headless_input_init() failed\n"); /* Init Output */ - ret = pepper_output_led_init(compositor); - PEPPER_CHECK(ret, goto end, "pepper_output_led_init() failed.\n"); + ret = headless_output_init(compositor); + PEPPER_CHECK(ret, goto end, "headless_output_init() failed.\n"); /* Init Shell */ ret = headless_shell_init(compositor); @@ -68,8 +68,9 @@ int main(int argc, char *argv[]) end: /* Deinit Process */ + headless_shell_deinit(compositor); headless_input_deinit(compositor); - pepper_output_led_deinit(compositor); + headless_output_deinit(compositor); pepper_compositor_destroy(compositor); return EXIT_SUCCESS; diff --git a/src/bin/headless/headless_server.h b/src/bin/headless/headless_server.h index 3d12188..7a72496 100644 --- a/src/bin/headless/headless_server.h +++ b/src/bin/headless/headless_server.h @@ -30,10 +30,13 @@ extern "C" { #endif -PEPPER_API pepper_bool_t pepper_output_led_init(pepper_compositor_t *compositor); -PEPPER_API void pepper_output_led_deinit(pepper_compositor_t *compositor); +/* APIs for headless_output */ +PEPPER_API pepper_bool_t headless_output_init(pepper_compositor_t *compositor); +PEPPER_API void headless_output_deinit(pepper_compositor_t *compositor); +/* APIs for headless_shell */ PEPPER_API pepper_bool_t headless_shell_init(pepper_compositor_t *compositor); +PEPPER_API void headless_shell_deinit(pepper_compositor_t *compositor); /* APIs for headless_input */ PEPPER_API pepper_bool_t headless_input_init(pepper_compositor_t *compositor); diff --git a/src/bin/headless/output/output_led.c b/src/bin/headless/output/output_led.c index aebad29..aa5f710 100644 --- a/src/bin/headless/output/output_led.c +++ b/src/bin/headless/output/output_led.c @@ -51,18 +51,20 @@ static void led_output_add_frame_done(led_output_t *output); static void led_output_update(led_output_t *output); static void -led_output_destroy(void *o) +led_output_destroy(void *data) { - led_output_t *output = (led_output_t *)o; + led_output_t *output = (led_output_t *)data; PEPPER_TRACE("Output Destroy %p base %p\n", output, output->output); - if (output->ui_led) + if (output->ui_led) { HL_UI_LED_Close(output->ui_led); + output->ui_led = NULL; + } - if (output->tbm_server) + if (output->tbm_server) { wayland_tbm_server_deinit(output->tbm_server); - - free(output); + output->tbm_server = NULL; + } } static int32_t @@ -288,7 +290,7 @@ pepper_output_bind_display(led_output_t *output) } pepper_bool_t -pepper_output_led_init(pepper_compositor_t *compositor) +headless_output_init(pepper_compositor_t *compositor) { led_output_t *output = (led_output_t*)calloc(sizeof(led_output_t), 1); @@ -319,7 +321,7 @@ pepper_output_led_init(pepper_compositor_t *compositor) PEPPER_CHECK(output->plane, goto error, "pepper_output_add_plane() failed.\n"); pepper_object_set_user_data((pepper_object_t *)compositor, - &KEY_OUTPUT, output, led_output_destroy); + &KEY_OUTPUT, output, NULL); PEPPER_TRACE("\t Add Output %p, base %p\n", output, output->output); PEPPER_TRACE("\t Add Output %p, plane %p\n", output, output->plane); PEPPER_TRACE("\t Userdata %p\n", pepper_object_get_user_data((pepper_object_t *)compositor,&KEY_OUTPUT)); @@ -341,7 +343,17 @@ error: } void -pepper_output_led_deinit(pepper_compositor_t *compositor) +headless_output_deinit(pepper_compositor_t *compositor) { + led_output_t *output; + + output = pepper_object_get_user_data((pepper_object_t *)compositor, &KEY_OUTPUT); + + pepper_output_destroy(output->output); + led_output_destroy(output); + + pepper_object_set_user_data((pepper_object_t *)compositor, &KEY_OUTPUT, NULL, NULL); + free(output); + PEPPER_TRACE("Output Deinit ... DONE\n"); } diff --git a/src/bin/headless/shell/shell.c b/src/bin/headless/shell/shell.c index 3962327..d24ebb3 100644 --- a/src/bin/headless/shell/shell.c +++ b/src/bin/headless/shell/shell.c @@ -1120,10 +1120,10 @@ headless_shell_deinit_listeners(headless_shell_t *shell) } static void -headless_shell_deinit(void *data) +headless_shell_destroy(headless_shell_t *shell) { - headless_shell_t *shell = (headless_shell_t*)data; - if (!shell) return; + if (!shell) + return; if (shell->cb_idle) wl_event_source_remove(shell->cb_idle); @@ -1131,6 +1131,19 @@ headless_shell_deinit(void *data) headless_shell_deinit_listeners(shell); zxdg_deinit(shell); tizen_policy_deinit(shell); +} + +void +headless_shell_deinit(pepper_compositor_t *compositor) +{ + headless_shell_t *shell; + + PEPPER_CHECK(compositor, return, "compositor is NULL\n"); + + shell = (headless_shell_t *)pepper_object_get_user_data((pepper_object_t *)compositor, &KEY_SHELL); + PEPPER_CHECK(shell, return, "shell is NULL\n"); + + headless_shell_destroy(shell); pepper_object_set_user_data((pepper_object_t *)shell->compositor, &KEY_SHELL, NULL, NULL); free(shell); @@ -1149,10 +1162,14 @@ headless_shell_init(pepper_compositor_t *compositor) PEPPER_CHECK(zxdg_init(shell), goto error, "zxdg_init() failed\n"); PEPPER_CHECK(tizen_policy_init(shell), goto error, "tizen_policy_init() failed\n"); - pepper_object_set_user_data((pepper_object_t *)compositor, &KEY_SHELL, NULL, headless_shell_deinit); + pepper_object_set_user_data((pepper_object_t *)compositor, &KEY_SHELL, shell, NULL); return PEPPER_TRUE; + error: - headless_shell_deinit(shell); + if (shell) { + headless_shell_destroy(shell); + free(shell); + } return PEPPER_FALSE; } diff --git a/src/samples/headless_client.c b/src/samples/headless_client.c index 5ee5a88..60e1206 100644 --- a/src/samples/headless_client.c +++ b/src/samples/headless_client.c @@ -58,6 +58,20 @@ static Eina_Array *_ecore_event_hdls; static int KEY_WL_BUFFER = 0; static int KEY_CLIENT = 0; +static uint32_t _getpid() +{ + static pid_t pid = 0; + + if (pid) + { + return pid; + } + + pid = getpid(); + + return (uint32_t)pid; +} + static void buffer_release(void *data, struct wl_buffer *buffer) { @@ -122,20 +136,6 @@ _update_window(app_data_t *client) //TRACE("[UPDATE] commit wl_buffer:%p, surface:%p\n", wl_buffer, surface); } -static uint32_t _getpid() -{ - static pid_t pid = 0; - - if (pid) - { - return pid; - } - - pid = getpid(); - - return (uint32_t)pid; -} - static void do_action(app_data_t *client, const char *keyname) { -- 2.34.1