Merge "llkd: default enabled for userdebug"
diff --git a/llkd/README.md b/llkd/README.md
index 146a998..71319c8 100644
--- a/llkd/README.md
+++ b/llkd/README.md
@@ -66,9 +66,15 @@
 #### ro.llk.enable
 default false, allow live-lock daemon to be enabled.
 
+#### llk.enable
+default ro.llk.enable, and evaluated for eng.
+
 #### ro.khungtask.enable
 default false, allow [khungtask] daemon to be enabled.
 
+#### khungtask.enable
+default ro.khungtask.enable and evaluated for eng.
+
 #### ro.llk.mlockall
 default false, enable call to mlockall().
 
diff --git a/llkd/include/llkd.h b/llkd/include/llkd.h
index 2ae28ed..bd0739b 100644
--- a/llkd/include/llkd.h
+++ b/llkd/include/llkd.h
@@ -30,9 +30,11 @@
 unsigned llkCheckMilliseconds(void);
 
 /* clang-format off */
-#define LLK_ENABLE_PROPERTY            "ro.llk.enable"
-#define LLK_ENABLE_DEFAULT             false
-#define KHT_ENABLE_PROPERTY            "ro.khungtask.enable"
+#define LLK_ENABLE_WRITEABLE_PROPERTY  "llk.enable"
+#define LLK_ENABLE_PROPERTY            "ro." LLK_ENABLE_WRITEABLE_PROPERTY
+#define LLK_ENABLE_DEFAULT             false /* "eng" and userdebug true */
+#define KHT_ENABLE_WRITEABLE_PROPERTY  "khungtask.enable"
+#define KHT_ENABLE_PROPERTY            "ro." KHT_ENABLE_WRITEABLE_PROPERTY
 #define LLK_MLOCKALL_PROPERTY          "ro.llk.mlockall"
 #define LLK_MLOCKALL_DEFAULT           true
 #define LLK_TIMEOUT_MS_PROPERTY        "ro.llk.timeout_ms"
diff --git a/llkd/libllkd.cpp b/llkd/libllkd.cpp
index b25eb06..d828105 100644
--- a/llkd/libllkd.cpp
+++ b/llkd/libllkd.cpp
@@ -1032,6 +1032,10 @@
 
 bool llkInit(const char* threadname) {
     llkLowRam = android::base::GetBoolProperty("ro.config.low_ram", false);
+    if (!LLK_ENABLE_DEFAULT && android::base::GetBoolProperty("ro.debuggable", false)) {
+        llkEnable = android::base::GetProperty(LLK_ENABLE_PROPERTY, "eng") == "eng";
+        khtEnable = android::base::GetProperty(KHT_ENABLE_PROPERTY, "eng") == "eng";
+    }
     llkEnable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, llkEnable);
     if (llkEnable && !llkTopDirectory.reset(procdir)) {
         // Most likely reason we could be here is llkd was started
diff --git a/llkd/llkd.rc b/llkd/llkd.rc
index a257e76..f762a5c 100644
--- a/llkd/llkd.rc
+++ b/llkd/llkd.rc
@@ -1,11 +1,41 @@
+# eng default for ro.llk.enable and ro.khungtask.enable
+on property:ro.debuggable=*
+    setprop llk.enable ${ro.llk.enable:-0}
+    setprop khungtask.enable ${ro.khungtask.enable:-0}
+
+on property:ro.debuggable=1
+    setprop llk.enable ${ro.llk.enable:-1}
+    setprop khungtask.enable ${ro.khungtask.enable:-1}
+
+on property:ro.llk.enable=eng
+    setprop llk.enable ${ro.debuggable:-0}
+
+on property:ro.khungtask.enable=eng
+    setprop khungtask.enable ${ro.debuggable:-0}
+
+on property:llk.enable=1
+    setprop llk.enable true
+
+on property:llk.enable=0
+    setprop llk.enable false
+
+on property:khungtask.enable=1
+    setprop khungtask.enable true
+
+on property:khungtask.enable=0
+    setprop khungtask.enable false
+
 # Configure [khungtaskd]
-on property:ro.khungtask.enable=true
+on property:khungtask.enable=true
     write /proc/sys/kernel/hung_task_timeout_secs ${ro.khungtask.timeout:-720}
     write /proc/sys/kernel/hung_task_warnings 65535
     write /proc/sys/kernel/hung_task_check_count 65535
     write /proc/sys/kernel/hung_task_panic 1
 
-on property:ro.llk.enable=true
+on property:khungtask.enable=false
+    write /proc/sys/kernel/hung_task_panic 0
+
+on property:llk.enable=true
     start llkd
 
 service llkd /system/bin/llkd
diff --git a/llkd/tests/llkd_test.cpp b/llkd/tests/llkd_test.cpp
index e3c95eb..2de1820 100644
--- a/llkd/tests/llkd_test.cpp
+++ b/llkd/tests/llkd_test.cpp
@@ -64,10 +64,16 @@
 }
 
 seconds llkdSleepPeriod(char state) {
-    auto default_enable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, LLK_ENABLE_DEFAULT);
-    if (android::base::GetProperty(LLK_ENABLE_PROPERTY, "nothing") == "nothing") {
-        GTEST_LOG_INFO << LLK_ENABLE_PROPERTY " defaults to " << (default_enable ? "true" : "false")
-                       << "\n";
+    auto default_eng = android::base::GetProperty(LLK_ENABLE_PROPERTY, "eng") == "eng";
+    auto default_enable = LLK_ENABLE_DEFAULT;
+    if (!LLK_ENABLE_DEFAULT && default_eng &&
+        android::base::GetBoolProperty("ro.debuggable", false)) {
+        default_enable = true;
+    }
+    default_enable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, default_enable);
+    if (default_eng) {
+        GTEST_LOG_INFO << LLK_ENABLE_PROPERTY " defaults to \"eng\" thus "
+                       << (default_enable ? "true" : "false") << "\n";
     }
     // Hail Mary hope is unconfigured.
     if ((GetUintProperty(LLK_TIMEOUT_MS_PROPERTY, LLK_TIMEOUT_MS_DEFAULT) !=
@@ -78,6 +84,8 @@
         execute("stop llkd");
         rest();
         std::string setprop("setprop ");
+        execute((setprop + LLK_ENABLE_WRITEABLE_PROPERTY + " false").c_str());
+        rest();
         execute((setprop + LLK_TIMEOUT_MS_PROPERTY + " 120000").c_str());
         rest();
         execute((setprop + KHT_TIMEOUT_PROPERTY + " 130").c_str());
@@ -86,8 +94,15 @@
         rest();
         execute((setprop + LLK_ENABLE_PROPERTY + " true").c_str());
         rest();
+        execute((setprop + LLK_ENABLE_WRITEABLE_PROPERTY + " true").c_str());
+        rest();
     }
-    default_enable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, false);
+    default_enable = LLK_ENABLE_DEFAULT;
+    if (!LLK_ENABLE_DEFAULT && (android::base::GetProperty(LLK_ENABLE_PROPERTY, "eng") == "eng") &&
+        android::base::GetBoolProperty("ro.debuggable", false)) {
+        default_enable = true;
+    }
+    default_enable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, default_enable);
     if (default_enable) {
         execute("start llkd");
         rest();