aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/ResearchLog.java
diff options
context:
space:
mode:
authorKurt Partridge <kep@google.com>2012-07-19 21:31:40 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-07-19 21:31:41 -0700
commit48ded4e3b1205628fc82874d92ac7ab1f1f7f79f (patch)
tree207093fd9b64ebc22b2c56fb66e798ebbb999a25 /java/src/com/android/inputmethod/latin/ResearchLog.java
parent19ac19e5fd89ae5c02b71323adabf83ef0ecea24 (diff)
parent0df487678eca58bd4732cfd2b6fd03b3c712eb48 (diff)
downloadlatinime-48ded4e3b1205628fc82874d92ac7ab1f1f7f79f.tar.gz
latinime-48ded4e3b1205628fc82874d92ac7ab1f1f7f79f.tar.xz
latinime-48ded4e3b1205628fc82874d92ac7ab1f1f7f79f.zip
Merge "ResearchLogger: make logging more reliable (esp on startup)"
Diffstat (limited to 'java/src/com/android/inputmethod/latin/ResearchLog.java')
-rw-r--r--java/src/com/android/inputmethod/latin/ResearchLog.java48
1 files changed, 31 insertions, 17 deletions
diff --git a/java/src/com/android/inputmethod/latin/ResearchLog.java b/java/src/com/android/inputmethod/latin/ResearchLog.java
index 1de5cb36a..917ee84a2 100644
--- a/java/src/com/android/inputmethod/latin/ResearchLog.java
+++ b/java/src/com/android/inputmethod/latin/ResearchLog.java
@@ -55,13 +55,14 @@ public class ResearchLog {
final ScheduledExecutorService mExecutor;
/* package */ final File mFile;
- private JsonWriter mJsonWriter = NULL_JSON_WRITER; // should never be null
+ private JsonWriter mJsonWriter = NULL_JSON_WRITER;
private int mLoggingState;
private static final int LOGGING_STATE_UNSTARTED = 0;
- private static final int LOGGING_STATE_RUNNING = 1;
- private static final int LOGGING_STATE_STOPPING = 2;
- private static final int LOGGING_STATE_STOPPED = 3;
+ private static final int LOGGING_STATE_READY = 1; // don't create file until necessary
+ private static final int LOGGING_STATE_RUNNING = 2;
+ private static final int LOGGING_STATE_STOPPING = 3;
+ private static final int LOGGING_STATE_STOPPED = 4;
private static final long FLUSH_DELAY_IN_MS = 1000 * 5;
private static class NullOutputStream extends OutputStream {
@@ -94,11 +95,9 @@ public class ResearchLog {
public synchronized void start() throws IOException {
switch (mLoggingState) {
case LOGGING_STATE_UNSTARTED:
- mJsonWriter = new JsonWriter(new BufferedWriter(new FileWriter(mFile)));
- mJsonWriter.setLenient(true);
- mJsonWriter.beginArray();
- mLoggingState = LOGGING_STATE_RUNNING;
+ mLoggingState = LOGGING_STATE_READY;
break;
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
case LOGGING_STATE_STOPPING:
case LOGGING_STATE_STOPPED:
@@ -111,6 +110,7 @@ public class ResearchLog {
case LOGGING_STATE_UNSTARTED:
mLoggingState = LOGGING_STATE_STOPPED;
break;
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
mExecutor.submit(new Callable<Object>() {
@Override
@@ -120,14 +120,13 @@ public class ResearchLog {
mJsonWriter.flush();
mJsonWriter.close();
} finally {
- // the contentprovider only exports data if the writable
- // bit is cleared.
boolean success = mFile.setWritable(false, false);
mLoggingState = LOGGING_STATE_STOPPED;
}
return null;
}
});
+ removeAnyScheduledFlush();
mExecutor.shutdown();
mLoggingState = LOGGING_STATE_STOPPING;
break;
@@ -139,27 +138,26 @@ public class ResearchLog {
public boolean isAlive() {
switch (mLoggingState) {
case LOGGING_STATE_UNSTARTED:
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
return true;
}
return false;
}
- public void waitUntilStopped(int timeoutInMs) throws InterruptedException {
+ public void waitUntilStopped(final int timeoutInMs) throws InterruptedException {
+ removeAnyScheduledFlush();
+ mExecutor.shutdown();
mExecutor.awaitTermination(timeoutInMs, TimeUnit.MILLISECONDS);
}
- private boolean isAbortSuccessful;
- public boolean isAbortSuccessful() {
- return isAbortSuccessful;
- }
-
public synchronized void abort() {
switch (mLoggingState) {
case LOGGING_STATE_UNSTARTED:
mLoggingState = LOGGING_STATE_STOPPED;
isAbortSuccessful = true;
break;
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
mExecutor.submit(new Callable<Object>() {
@Override
@@ -173,6 +171,7 @@ public class ResearchLog {
return null;
}
});
+ removeAnyScheduledFlush();
mExecutor.shutdown();
mLoggingState = LOGGING_STATE_STOPPING;
break;
@@ -181,10 +180,16 @@ public class ResearchLog {
}
}
+ private boolean isAbortSuccessful;
+ public boolean isAbortSuccessful() {
+ return isAbortSuccessful;
+ }
+
/* package */ synchronized void flush() {
switch (mLoggingState) {
case LOGGING_STATE_UNSTARTED:
break;
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
removeAnyScheduledFlush();
mExecutor.submit(mFlushCallable);
@@ -197,7 +202,9 @@ public class ResearchLog {
private Callable<Object> mFlushCallable = new Callable<Object>() {
@Override
public Object call() throws Exception {
- mJsonWriter.flush();
+ if (mLoggingState == LOGGING_STATE_RUNNING) {
+ mJsonWriter.flush();
+ }
return null;
}
};
@@ -220,6 +227,7 @@ public class ResearchLog {
switch (mLoggingState) {
case LOGGING_STATE_UNSTARTED:
break;
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
mExecutor.submit(new Callable<Object>() {
@Override
@@ -239,6 +247,7 @@ public class ResearchLog {
switch (mLoggingState) {
case LOGGING_STATE_UNSTARTED:
break;
+ case LOGGING_STATE_READY:
case LOGGING_STATE_RUNNING:
mExecutor.submit(new Callable<Object>() {
@Override
@@ -260,6 +269,11 @@ public class ResearchLog {
void outputEvent(final String[] keys, final Object[] values) {
// not thread safe.
try {
+ if (mJsonWriter == NULL_JSON_WRITER) {
+ mJsonWriter = new JsonWriter(new BufferedWriter(new FileWriter(mFile)));
+ mJsonWriter.setLenient(true);
+ mJsonWriter.beginArray();
+ }
mJsonWriter.beginObject();
mJsonWriter.name(CURRENT_TIME_KEY).value(System.currentTimeMillis());
mJsonWriter.name(UPTIME_KEY).value(SystemClock.uptimeMillis());