summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/ContentResolver.java3
-rw-r--r--core/java/android/os/ParcelFileDescriptor.java55
2 files changed, 37 insertions, 21 deletions
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index f250029..5618cab 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -2316,8 +2316,7 @@ public abstract class ContentResolver {
}
@Override
- public void close() throws IOException {
- super.close();
+ public void releaseResources() {
if (!mProviderReleased) {
ContentResolver.this.releaseProvider(mContentProvider);
mProviderReleased = true;
diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java
index 579971d..5a49b98 100644
--- a/core/java/android/os/ParcelFileDescriptor.java
+++ b/core/java/android/os/ParcelFileDescriptor.java
@@ -564,7 +564,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
@Override
public void close() throws IOException {
if (mWrapped != null) {
- mWrapped.close();
+ try {
+ mWrapped.close();
+ } finally {
+ releaseResources();
+ }
} else {
closeWithStatus(Status.OK, null);
}
@@ -579,7 +583,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
*/
public void closeWithError(String msg) throws IOException {
if (mWrapped != null) {
- mWrapped.closeWithError(msg);
+ try {
+ mWrapped.closeWithError(msg);
+ } finally {
+ releaseResources();
+ }
} else {
if (msg == null) {
throw new IllegalArgumentException("Message must not be null");
@@ -588,17 +596,22 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
}
}
- private void closeWithStatus(int status, String msg) throws IOException {
- if (mWrapped != null) {
- mWrapped.closeWithStatus(status, msg);
- } else {
- if (mClosed) return;
- mClosed = true;
- mGuard.close();
- // Status MUST be sent before closing actual descriptor
- writeCommStatusAndClose(status, msg);
- IoUtils.closeQuietly(mFd);
- }
+ private void closeWithStatus(int status, String msg) {
+ if (mClosed) return;
+ mClosed = true;
+ mGuard.close();
+ // Status MUST be sent before closing actual descriptor
+ writeCommStatusAndClose(status, msg);
+ IoUtils.closeQuietly(mFd);
+ releaseResources();
+ }
+
+ /**
+ * Called when the fd is being closed, for subclasses to release any other resources
+ * associated with it, such as acquired providers.
+ * @hide
+ */
+ public void releaseResources() {
}
private byte[] getOrCreateStatusBuffer() {
@@ -793,6 +806,9 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
@Override
protected void finalize() throws Throwable {
+ if (mWrapped != null) {
+ releaseResources();
+ }
if (mGuard != null) {
mGuard.warnIfOpen();
}
@@ -822,7 +838,11 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
@Override
public void writeToParcel(Parcel out, int flags) {
if (mWrapped != null) {
- mWrapped.writeToParcel(out, flags);
+ try {
+ mWrapped.writeToParcel(out, flags);
+ } finally {
+ releaseResources();
+ }
} else {
out.writeFileDescriptor(mFd);
if (mCommFd != null) {
@@ -832,11 +852,8 @@ public class ParcelFileDescriptor implements Parcelable, Closeable {
out.writeInt(0);
}
if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) {
- try {
- // Not a real close, so emit no status
- closeWithStatus(Status.SILENCE, null);
- } catch (IOException e) {
- }
+ // Not a real close, so emit no status
+ closeWithStatus(Status.SILENCE, null);
}
}
}