summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Josh Gao <jmgao@google.com> 2019-07-24 15:40:57 -0700
committer Josh Gao <jmgao@google.com> 2019-07-25 12:13:15 -0700
commit390d9e6a1806626eb521d55a36b1578d28714cc8 (patch)
tree6a78483a1db38f7cbe3604e74b5f7ba38f8ac2bd
parent16e2397de5a4046bd2ca850f36aedee40206c60e (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 (cherry picked from commit 6ca916a657cd56158212a57601108716ce78cbe8)
-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 57a88012a31a..3e2ba3d3115f 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;