headless-server: fix crash 71/207171/1
authorlsj119 <lsj119@samsung.com>
Mon, 29 Apr 2019 10:36:10 +0000 (19:36 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 May 2019 08:33:48 +0000 (17:33 +0900)
Change-Id: I79800b5fd97532cddbecfbad92698a434e17a3ec

src/bin/headless/headless_server.c
src/bin/headless/headless_server.h
src/bin/headless/output/output_led.c
src/bin/headless/shell/shell.c
src/samples/headless_client.c

index c2079b8..976ffac 100644 (file)
@@ -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;
index 3d12188..7a72496 100644 (file)
 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);
index aebad29..aa5f710 100644 (file)
@@ -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");
 }
index 3962327..d24ebb3 100644 (file)
@@ -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;
 }
index 5ee5a88..60e1206 100644 (file)
@@ -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)
 {