summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rwxr-xr-xcore/java/android/provider/Settings.java34
-rw-r--r--core/java/android/util/MemoryIntArray.java12
2 files changed, 40 insertions, 6 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index a8fb7a280de9..36c0f390b30a 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1462,12 +1462,15 @@ public final class Settings {
private static final class GenerationTracker {
private final MemoryIntArray mArray;
+ private final Runnable mErrorHandler;
private final int mIndex;
private int mCurrentGeneration;
- public GenerationTracker(@NonNull MemoryIntArray array, int index) {
+ public GenerationTracker(@NonNull MemoryIntArray array, int index,
+ Runnable errorHandler) {
mArray = array;
mIndex = index;
+ mErrorHandler = errorHandler;
mCurrentGeneration = readCurrentGeneration();
}
@@ -1487,9 +1490,23 @@ public final class Settings {
return mArray.get(mIndex);
} catch (IOException e) {
Log.e(TAG, "Error getting current generation", e);
+ if (mErrorHandler != null) {
+ mErrorHandler.run();
+ }
}
return -1;
}
+
+ public void destroy() {
+ try {
+ mArray.close();
+ } catch (IOException e) {
+ Log.e(TAG, "Error closing backing array", e);
+ if (mErrorHandler != null) {
+ mErrorHandler.run();
+ }
+ }
+ }
}
// Thread-safe.
@@ -1616,7 +1633,20 @@ public final class Settings {
+ cr.getPackageName() + " and user:"
+ userHandle + " with index:" + index);
}
- mGenerationTracker = new GenerationTracker(array, index);
+ mGenerationTracker = new GenerationTracker(array, index,
+ () -> {
+ synchronized (this) {
+ Log.e(TAG, "Error accessing generation"
+ + " tracker - removing");
+ if (mGenerationTracker != null) {
+ GenerationTracker generationTracker =
+ mGenerationTracker;
+ mGenerationTracker = null;
+ generationTracker.destroy();
+ mValues.clear();
+ }
+ }
+ });
}
}
mValues.put(name, value);
diff --git a/core/java/android/util/MemoryIntArray.java b/core/java/android/util/MemoryIntArray.java
index c3bd963708d7..8f9b36e84ca2 100644
--- a/core/java/android/util/MemoryIntArray.java
+++ b/core/java/android/util/MemoryIntArray.java
@@ -20,6 +20,7 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.Process;
+import libcore.io.IoUtils;
import java.io.Closeable;
import java.io.IOException;
@@ -46,6 +47,8 @@ import java.util.UUID;
* @hide
*/
public final class MemoryIntArray implements Parcelable, Closeable {
+ private static final String TAG = "MemoryIntArray";
+
private static final int MAX_SIZE = 1024;
private final int mOwnerPid;
@@ -142,8 +145,9 @@ public final class MemoryIntArray implements Parcelable, Closeable {
@Override
public void close() throws IOException {
if (!isClosed()) {
- nativeClose(mFd.getFd(), mMemoryAddr, isOwner());
+ ParcelFileDescriptor pfd = mFd;
mFd = null;
+ nativeClose(pfd.getFd(), mMemoryAddr, isOwner());
}
}
@@ -156,7 +160,7 @@ public final class MemoryIntArray implements Parcelable, Closeable {
@Override
protected void finalize() throws Throwable {
- close();
+ IoUtils.closeQuietly(this);
super.finalize();
}
@@ -230,7 +234,6 @@ public final class MemoryIntArray implements Parcelable, Closeable {
private native int nativeGet(int fd, long memoryAddr, int index, boolean owner);
private native void nativeSet(int fd, long memoryAddr, int index, int value, boolean owner);
private native int nativeSize(int fd);
- private native static int nativeGetMemoryPageSize();
/**
* @return The max array size.
@@ -246,7 +249,8 @@ public final class MemoryIntArray implements Parcelable, Closeable {
try {
return new MemoryIntArray(parcel);
} catch (IOException ioe) {
- throw new RuntimeException(ioe);
+ Log.e(TAG, "Error unparceling MemoryIntArray");
+ return null;
}
}