Merge "Add new activity dumpsys command to persist all data." into lmp-dev
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 190c16c..4d689f9 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12230,6 +12230,7 @@
                 pw.println("    package [PACKAGE_NAME]: all state related to given package");
                 pw.println("    all: dump all activities");
                 pw.println("    top: dump the top activity");
+                pw.println("    write: write all pending state to storage");
                 pw.println("  cmd may also be a COMP_SPEC to dump activities.");
                 pw.println("  COMP_SPEC may be a component name (com.foo/.myApp),");
                 pw.println("    a partial substring in a component name, a");
@@ -12364,6 +12365,10 @@
                 synchronized (this) {
                     mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, null);
                 }
+            } else if ("write".equals(cmd)) {
+                mTaskPersister.flush();
+                pw.println("All tasks persisted.");
+                return;
             } else {
                 // Dumping a single activity?
                 if (!dumpActivity(fd, pw, cmd, args, opti, dumpAll)) {
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index 1c0564f..afc781f 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -187,6 +187,19 @@
         yieldIfQueueTooDeep();
     }
 
+    void flush() {
+        synchronized (this) {
+            mNextWriteTime = FLUSH_QUEUE;
+            notifyAll();
+            do {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                }
+            } while (mNextWriteTime == FLUSH_QUEUE);
+        }
+    }
+
     void saveImage(Bitmap image, String filename) {
         synchronized (this) {
             int queueNdx;
@@ -483,8 +496,12 @@
                                 INTER_WRITE_DELAY_MS + " msec. (" + mNextWriteTime + ")");
                     }
 
+
                     while (mWriteQueue.isEmpty()) {
-                        mNextWriteTime = 0; // idle.
+                        if (mNextWriteTime != 0) {
+                            mNextWriteTime = 0; // idle.
+                            TaskPersister.this.notifyAll(); // wake up flush() if needed.
+                        }
                         try {
                             if (DEBUG) Slog.d(TAG, "LazyTaskWriter: waiting indefinitely.");
                             TaskPersister.this.wait();