SharedMemory: break Cleaner reference cycle.
Previously, the Cleaner we create to close the ashmem file descriptor used a thunk that held a strong reference to the FileDescriptor we wanted to clean up, which prevented the Cleaner from ever running. Break the cycle by storing the integer value of the file descriptor instead. Bug: http://b/138323667 Test: treehugger Change-Id: I613a7d035892032f9567d59acb04672957c96011 (cherry picked from commit6ca916a657) (cherry picked from commit390d9e6a18)
This commit is contained in:
committed by
android-build-team Robot
parent
185fc7dfa4
commit
bc999ddb2d
@@ -62,7 +62,7 @@ public final class SharedMemory implements Parcelable, Closeable {
|
||||
|
||||
mMemoryRegistration = new MemoryRegistration(mSize);
|
||||
mCleaner = Cleaner.create(mFileDescriptor,
|
||||
new Closer(mFileDescriptor, mMemoryRegistration));
|
||||
new Closer(mFileDescriptor.getInt$(), mMemoryRegistration));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -290,10 +290,10 @@ public final class SharedMemory implements Parcelable, Closeable {
|
||||
* Cleaner that closes the FD
|
||||
*/
|
||||
private static final class Closer implements Runnable {
|
||||
private FileDescriptor mFd;
|
||||
private int mFd;
|
||||
private MemoryRegistration mMemoryReference;
|
||||
|
||||
private Closer(FileDescriptor fd, MemoryRegistration memoryReference) {
|
||||
private Closer(int fd, MemoryRegistration memoryReference) {
|
||||
mFd = fd;
|
||||
mMemoryReference = memoryReference;
|
||||
}
|
||||
@@ -301,7 +301,9 @@ public final class SharedMemory implements Parcelable, Closeable {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Os.close(mFd);
|
||||
FileDescriptor fd = new FileDescriptor();
|
||||
fd.setInt$(mFd);
|
||||
Os.close(fd);
|
||||
} catch (ErrnoException e) { /* swallow error */ }
|
||||
mMemoryReference.release();
|
||||
mMemoryReference = null;
|
||||
|
||||
Reference in New Issue
Block a user