Loading core/java/android/os/ParcelFileDescriptor.java +39 −22 Original line number Original line Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ */ package android.os; package android.os; import dalvik.system.CloseGuard; import java.io.Closeable; import java.io.Closeable; import java.io.File; import java.io.File; import java.io.FileDescriptor; import java.io.FileDescriptor; Loading @@ -31,12 +34,16 @@ import java.net.Socket; */ */ public class ParcelFileDescriptor implements Parcelable, Closeable { public class ParcelFileDescriptor implements Parcelable, Closeable { private final FileDescriptor mFileDescriptor; private final FileDescriptor mFileDescriptor; private boolean mClosed; //this field is to create wrapper for ParcelFileDescriptor using another /** //PartialFileDescriptor but avoid invoking close twice * Wrapped {@link ParcelFileDescriptor}, if any. Used to avoid //consider ParcelFileDescriptor A(fileDescriptor fd), ParcelFileDescriptor B(A) * double-closing {@link #mFileDescriptor}. //in this particular case fd.close might be invoked twice. */ private final ParcelFileDescriptor mParcelDescriptor; private final ParcelFileDescriptor mWrapped; private volatile boolean mClosed; private final CloseGuard mGuard = CloseGuard.get(); /** /** * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied Loading Loading @@ -289,13 +296,15 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { if (mClosed) { if (mClosed) { throw new IllegalStateException("Already closed"); throw new IllegalStateException("Already closed"); } } if (mParcelDescriptor != null) { if (mWrapped != null) { int fd = mParcelDescriptor.detachFd(); int fd = mWrapped.detachFd(); mClosed = true; mClosed = true; mGuard.close(); return fd; return fd; } } int fd = getFd(); int fd = getFd(); mClosed = true; mClosed = true; mGuard.close(); Parcel.clearFileDescriptor(mFileDescriptor); Parcel.clearFileDescriptor(mFileDescriptor); return fd; return fd; } } Loading @@ -307,15 +316,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * @throws IOException * @throws IOException * If an error occurs attempting to close this ParcelFileDescriptor. * If an error occurs attempting to close this ParcelFileDescriptor. */ */ @Override public void close() throws IOException { public void close() throws IOException { synchronized (this) { if (mClosed) return; if (mClosed) return; mClosed = true; mClosed = true; } mGuard.close(); if (mParcelDescriptor != null) { if (mWrapped != null) { // If this is a proxy to another file descriptor, just call through to its // If this is a proxy to another file descriptor, just call through to its // close method. // close method. mParcelDescriptor.close(); mWrapped.close(); } else { } else { Parcel.closeFileDescriptor(mFileDescriptor); Parcel.closeFileDescriptor(mFileDescriptor); } } Loading Loading @@ -374,6 +384,9 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override @Override protected void finalize() throws Throwable { protected void finalize() throws Throwable { if (mGuard != null) { mGuard.warnIfOpen(); } try { try { if (!mClosed) { if (!mClosed) { close(); close(); Loading @@ -384,21 +397,22 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } } public ParcelFileDescriptor(ParcelFileDescriptor descriptor) { public ParcelFileDescriptor(ParcelFileDescriptor descriptor) { super(); mWrapped = descriptor; mParcelDescriptor = descriptor; mFileDescriptor = mWrapped.mFileDescriptor; mFileDescriptor = mParcelDescriptor.mFileDescriptor; mGuard.open("close"); } } /*package */ParcelFileDescriptor(FileDescriptor descriptor) { /** {@hide} */ super(); public ParcelFileDescriptor(FileDescriptor descriptor) { if (descriptor == null) { if (descriptor == null) { throw new NullPointerException("descriptor must not be null"); throw new NullPointerException("descriptor must not be null"); } } mWrapped = null; mFileDescriptor = descriptor; mFileDescriptor = descriptor; mParcelDescriptor = null; mGuard.open("close"); } } /* Parcelable interface */ @Override public int describeContents() { public int describeContents() { return Parcelable.CONTENTS_FILE_DESCRIPTOR; return Parcelable.CONTENTS_FILE_DESCRIPTOR; } } Loading @@ -408,6 +422,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * If {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set in flags, * If {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set in flags, * the file descriptor will be closed after a copy is written to the Parcel. * the file descriptor will be closed after a copy is written to the Parcel. */ */ @Override public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) { out.writeFileDescriptor(mFileDescriptor); out.writeFileDescriptor(mFileDescriptor); if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { Loading @@ -421,12 +436,14 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR = new Parcelable.Creator<ParcelFileDescriptor>() { = new Parcelable.Creator<ParcelFileDescriptor>() { @Override public ParcelFileDescriptor createFromParcel(Parcel in) { public ParcelFileDescriptor createFromParcel(Parcel in) { return in.readFileDescriptor(); return in.readFileDescriptor(); } } @Override public ParcelFileDescriptor[] newArray(int size) { public ParcelFileDescriptor[] newArray(int size) { return new ParcelFileDescriptor[size]; return new ParcelFileDescriptor[size]; } } }; }; } } Loading
core/java/android/os/ParcelFileDescriptor.java +39 −22 Original line number Original line Diff line number Diff line Loading @@ -15,6 +15,9 @@ */ */ package android.os; package android.os; import dalvik.system.CloseGuard; import java.io.Closeable; import java.io.Closeable; import java.io.File; import java.io.File; import java.io.FileDescriptor; import java.io.FileDescriptor; Loading @@ -31,12 +34,16 @@ import java.net.Socket; */ */ public class ParcelFileDescriptor implements Parcelable, Closeable { public class ParcelFileDescriptor implements Parcelable, Closeable { private final FileDescriptor mFileDescriptor; private final FileDescriptor mFileDescriptor; private boolean mClosed; //this field is to create wrapper for ParcelFileDescriptor using another /** //PartialFileDescriptor but avoid invoking close twice * Wrapped {@link ParcelFileDescriptor}, if any. Used to avoid //consider ParcelFileDescriptor A(fileDescriptor fd), ParcelFileDescriptor B(A) * double-closing {@link #mFileDescriptor}. //in this particular case fd.close might be invoked twice. */ private final ParcelFileDescriptor mParcelDescriptor; private final ParcelFileDescriptor mWrapped; private volatile boolean mClosed; private final CloseGuard mGuard = CloseGuard.get(); /** /** * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied * For use with {@link #open}: if {@link #MODE_CREATE} has been supplied Loading Loading @@ -289,13 +296,15 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { if (mClosed) { if (mClosed) { throw new IllegalStateException("Already closed"); throw new IllegalStateException("Already closed"); } } if (mParcelDescriptor != null) { if (mWrapped != null) { int fd = mParcelDescriptor.detachFd(); int fd = mWrapped.detachFd(); mClosed = true; mClosed = true; mGuard.close(); return fd; return fd; } } int fd = getFd(); int fd = getFd(); mClosed = true; mClosed = true; mGuard.close(); Parcel.clearFileDescriptor(mFileDescriptor); Parcel.clearFileDescriptor(mFileDescriptor); return fd; return fd; } } Loading @@ -307,15 +316,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * @throws IOException * @throws IOException * If an error occurs attempting to close this ParcelFileDescriptor. * If an error occurs attempting to close this ParcelFileDescriptor. */ */ @Override public void close() throws IOException { public void close() throws IOException { synchronized (this) { if (mClosed) return; if (mClosed) return; mClosed = true; mClosed = true; } mGuard.close(); if (mParcelDescriptor != null) { if (mWrapped != null) { // If this is a proxy to another file descriptor, just call through to its // If this is a proxy to another file descriptor, just call through to its // close method. // close method. mParcelDescriptor.close(); mWrapped.close(); } else { } else { Parcel.closeFileDescriptor(mFileDescriptor); Parcel.closeFileDescriptor(mFileDescriptor); } } Loading Loading @@ -374,6 +384,9 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { @Override @Override protected void finalize() throws Throwable { protected void finalize() throws Throwable { if (mGuard != null) { mGuard.warnIfOpen(); } try { try { if (!mClosed) { if (!mClosed) { close(); close(); Loading @@ -384,21 +397,22 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { } } public ParcelFileDescriptor(ParcelFileDescriptor descriptor) { public ParcelFileDescriptor(ParcelFileDescriptor descriptor) { super(); mWrapped = descriptor; mParcelDescriptor = descriptor; mFileDescriptor = mWrapped.mFileDescriptor; mFileDescriptor = mParcelDescriptor.mFileDescriptor; mGuard.open("close"); } } /*package */ParcelFileDescriptor(FileDescriptor descriptor) { /** {@hide} */ super(); public ParcelFileDescriptor(FileDescriptor descriptor) { if (descriptor == null) { if (descriptor == null) { throw new NullPointerException("descriptor must not be null"); throw new NullPointerException("descriptor must not be null"); } } mWrapped = null; mFileDescriptor = descriptor; mFileDescriptor = descriptor; mParcelDescriptor = null; mGuard.open("close"); } } /* Parcelable interface */ @Override public int describeContents() { public int describeContents() { return Parcelable.CONTENTS_FILE_DESCRIPTOR; return Parcelable.CONTENTS_FILE_DESCRIPTOR; } } Loading @@ -408,6 +422,7 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { * If {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set in flags, * If {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set in flags, * the file descriptor will be closed after a copy is written to the Parcel. * the file descriptor will be closed after a copy is written to the Parcel. */ */ @Override public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) { out.writeFileDescriptor(mFileDescriptor); out.writeFileDescriptor(mFileDescriptor); if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { if ((flags&PARCELABLE_WRITE_RETURN_VALUE) != 0 && !mClosed) { Loading @@ -421,12 +436,14 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR public static final Parcelable.Creator<ParcelFileDescriptor> CREATOR = new Parcelable.Creator<ParcelFileDescriptor>() { = new Parcelable.Creator<ParcelFileDescriptor>() { @Override public ParcelFileDescriptor createFromParcel(Parcel in) { public ParcelFileDescriptor createFromParcel(Parcel in) { return in.readFileDescriptor(); return in.readFileDescriptor(); } } @Override public ParcelFileDescriptor[] newArray(int size) { public ParcelFileDescriptor[] newArray(int size) { return new ParcelFileDescriptor[size]; return new ParcelFileDescriptor[size]; } } }; }; } }