diff options
Diffstat (limited to 'core/java/android')
| -rwxr-xr-x | core/java/android/provider/Settings.java | 34 | ||||
| -rw-r--r-- | core/java/android/util/MemoryIntArray.java | 12 |
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; } } |
