Merge "Implement CloseGuard in ContentResolver."

This commit is contained in:
Jeff Brown
2011-10-10 11:48:49 -07:00
committed by Android (Google) Code Review

View File

@@ -16,6 +16,8 @@
package android.content;
import dalvik.system.CloseGuard;
import android.accounts.Account;
import android.app.ActivityManagerNative;
import android.app.ActivityThread;
@@ -33,6 +35,7 @@ import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.EventLog;
@@ -1562,27 +1565,39 @@ public abstract class ContentResolver {
private final class CursorWrapperInner extends CursorWrapper {
private final IContentProvider mContentProvider;
public static final String TAG="CursorWrapperInner";
private boolean mCloseFlag = false;
private final CloseGuard mCloseGuard = CloseGuard.get();
private boolean mProviderReleased;
CursorWrapperInner(Cursor cursor, IContentProvider icp) {
super(cursor);
mContentProvider = icp;
mCloseGuard.open("close");
}
@Override
public void close() {
super.close();
ContentResolver.this.releaseProvider(mContentProvider);
mCloseFlag = true;
mProviderReleased = true;
if (mCloseGuard != null) {
mCloseGuard.close();
}
}
@Override
protected void finalize() throws Throwable {
// TODO: integrate CloseGuard support.
try {
if(!mCloseFlag) {
if (mCloseGuard != null) {
mCloseGuard.warnIfOpen();
}
if (!mProviderReleased && mContentProvider != null) {
// Even though we are using CloseGuard, log this anyway so that
// application developers always see the message in the log.
Log.w(TAG, "Cursor finalized without prior close()");
close();
ContentResolver.this.releaseProvider(mContentProvider);
}
} finally {
super.finalize();