Merge "Implement CloseGuard in ContentResolver."
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package android.content;
|
package android.content;
|
||||||
|
|
||||||
|
import dalvik.system.CloseGuard;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.app.ActivityManagerNative;
|
import android.app.ActivityManagerNative;
|
||||||
import android.app.ActivityThread;
|
import android.app.ActivityThread;
|
||||||
@@ -33,6 +35,7 @@ import android.os.IBinder;
|
|||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
|
import android.os.StrictMode;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.EventLog;
|
import android.util.EventLog;
|
||||||
@@ -1562,27 +1565,39 @@ public abstract class ContentResolver {
|
|||||||
private final class CursorWrapperInner extends CursorWrapper {
|
private final class CursorWrapperInner extends CursorWrapper {
|
||||||
private final IContentProvider mContentProvider;
|
private final IContentProvider mContentProvider;
|
||||||
public static final String TAG="CursorWrapperInner";
|
public static final String TAG="CursorWrapperInner";
|
||||||
private boolean mCloseFlag = false;
|
|
||||||
|
private final CloseGuard mCloseGuard = CloseGuard.get();
|
||||||
|
private boolean mProviderReleased;
|
||||||
|
|
||||||
CursorWrapperInner(Cursor cursor, IContentProvider icp) {
|
CursorWrapperInner(Cursor cursor, IContentProvider icp) {
|
||||||
super(cursor);
|
super(cursor);
|
||||||
mContentProvider = icp;
|
mContentProvider = icp;
|
||||||
|
mCloseGuard.open("close");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
super.close();
|
super.close();
|
||||||
ContentResolver.this.releaseProvider(mContentProvider);
|
ContentResolver.this.releaseProvider(mContentProvider);
|
||||||
mCloseFlag = true;
|
mProviderReleased = true;
|
||||||
|
|
||||||
|
if (mCloseGuard != null) {
|
||||||
|
mCloseGuard.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void finalize() throws Throwable {
|
protected void finalize() throws Throwable {
|
||||||
// TODO: integrate CloseGuard support.
|
|
||||||
try {
|
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()");
|
Log.w(TAG, "Cursor finalized without prior close()");
|
||||||
close();
|
ContentResolver.this.releaseProvider(mContentProvider);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
super.finalize();
|
super.finalize();
|
||||||
|
|||||||
Reference in New Issue
Block a user