add screen-reader dead tracker to at-spi-bus-launcher 78/129778/1 accepted/tizen/unified/20170519.200903 submit/tizen/20170519.132143 tizen_4.0.m1_release
authorPaweł Stawicki <p.stawicki@partner.samsung.com>
Thu, 16 Mar 2017 13:09:32 +0000 (14:09 +0100)
committerShinwoo Kim <cinoo.kim@samsung.com>
Thu, 18 May 2017 05:36:32 +0000 (14:36 +0900)
Commit adds _screen_reader_dead_tracker method to track if screen-reader
gets killed.
Commit needs: https://review.tizen.org/gerrit/#/c/117565/
replaces:     https://review.tizen.org/gerrit/#/c/117557/
invalidates:  https://review.tizen.org/gerrit/#/c/117556/

Change-Id: I8ea33c75f4e2fa4c0d868deec52a574c993a21b0

bus/at-spi-bus-launcher.c

index 89860b6..87b2da7 100644 (file)
@@ -64,6 +64,7 @@ FILE *log_file;
 #define LOGD(arg...) do {if (log_file) {fprintf(log_file, ##arg);fprintf(log_file, "\n"); fflush(log_file);}} while(0)
 #endif
 
+static gboolean _launch_screen_reader_repeat_until_success(gpointer user_data);
 
 typedef enum {
   A11Y_BUS_STATE_IDLE = 0,
@@ -329,6 +330,8 @@ handle_a11y_enabled_change (A11yBusLauncher *app, gboolean enabled,
                                                 &builder,
                                                 &invalidated_builder),
                                  NULL);
+  g_variant_builder_clear (&builder);
+  g_variant_builder_clear (&invalidated_builder);
 }
 
 static void
@@ -367,6 +370,8 @@ handle_screen_reader_enabled_change (A11yBusLauncher *app, gboolean enabled,
                                                 &builder,
                                                 &invalidated_builder),
                                  NULL);
+  g_variant_builder_clear (&builder);
+  g_variant_builder_clear (&invalidated_builder);
 }
 
 static gboolean
@@ -603,6 +608,20 @@ gsettings_key_changed (GSettings *gsettings, const gchar *key, void *user_data)
     handle_screen_reader_enabled_change (_global_app, new_val, FALSE);
 }
 
+static int
+_screen_reader_dead_tracker (int pid, void *data)
+{
+  A11yBusLauncher *app = data;
+
+  if (app->pid > 0 && pid == app->pid)
+    {
+      LOGE("screen reader is dead, pid: %d, restarting", pid);
+      app->pid = 0;
+      g_timeout_add_seconds (2, _launch_screen_reader_repeat_until_success, app);
+    }
+  return 0;
+}
+
 static gboolean
 _launch_screen_reader(gpointer user_data, gboolean by_vconf_change)
 {
@@ -636,6 +655,8 @@ _launch_screen_reader(gpointer user_data, gboolean by_vconf_change)
    if (bl->pid > 0)
      {
         LOGD("Screen reader launched with pid: %i", bl->pid);
+        LOGD("registering screen reader dead tracker");
+        aul_listen_app_dead_signal(_screen_reader_dead_tracker, bl);
         ret = TRUE;
      }
    else
@@ -680,6 +701,9 @@ _terminate_screen_reader(A11yBusLauncher *bl)
      return FALSE;
 
 
+   LOGD("unregistering screen reader dead tracker");
+   aul_listen_app_dead_signal(NULL, NULL);
+
    int status = aul_app_get_status_bypid(bl->pid);
 
    if (status < 0)