summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorJosh Gao <jmgao@google.com>2019-07-24 15:40:57 -0700
committerJosh Gao <jmgao@google.com>2019-07-24 15:40:57 -0700
commit6ca916a657cd56158212a57601108716ce78cbe8 (patch)
treed64b843160613a6df31d1b370b37160a810e9c02 /core/java/android
parente691553aa6efe0ae226f198918d0887f524d917d (diff)
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
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/os/SharedMemory.java10
1 files changed, 6 insertions, 4 deletions
diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java
index 6025c348853c..4c12c325bde3 100644
--- a/core/java/android/os/SharedMemory.java
+++ b/core/java/android/os/SharedMemory.java
@@ -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;