Add SharedMemory.fromFileDescriptor

- Rename existing SharedMemory.create and make it public
- Passed file is now detached after creating shared memory and is
  not usable any more.

Bug: 188780895
CTS-Coverage-Bug: 197226773
Test: atest com.android.car.internal.test.LargeParcelableJavaStableAIDLTest
      (runs only in auto. will add matching CTS tests for non-auto devices)

(This combines two CL in internal tree, so Change-Id and Merged-In id are
different)
Change-Id: I8a634062d10ff0c114f3add1d2a5e8056f17b788
Merged-In: I11381e78580b97982b25a52aa06f2192def7353f
This commit is contained in:
Keun young Park
2021-05-26 18:32:15 -07:00
committed by Keun-young Park
parent 97fe4d0cc4
commit 39c4f40746
2 changed files with 21 additions and 0 deletions

View File

@@ -30329,6 +30329,7 @@ package android.os {
method public void close();
method @NonNull public static android.os.SharedMemory create(@Nullable String, int) throws android.system.ErrnoException;
method public int describeContents();
method @NonNull public static android.os.SharedMemory fromFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
method public int getSize();
method @NonNull public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
method @NonNull public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;

View File

@@ -93,6 +93,26 @@ public final class SharedMemory implements Parcelable, Closeable {
}
}
/**
* Creates an instance from existing shared memory passed as {@link ParcelFileDescriptor}.
*
* <p> The {@code fd} should be a shared memory created from
{@code SharedMemory or ASharedMemory}. This can be useful when shared memory is passed as
file descriptor through JNI or binder service implemented in cpp.
* <p> Note that newly created {@code SharedMemory} takes ownership of passed {@code fd} and
* the original {@code fd} becomes detached (Check {@link ParcelFileDescriptor#detachFd()}).
* If the caller wants to use the file descriptor after the call, the caller should duplicate
* the file descriptor (Check {@link ParcelFileDescriptor#dup()}) and pass the duped version
* instead.
*
* @param fd File descriptor of shared memory passed as {@link ParcelFileDescriptor}.
*/
public static @NonNull SharedMemory fromFileDescriptor(@NonNull ParcelFileDescriptor fd) {
FileDescriptor f = new FileDescriptor();
f.setInt$(fd.detachFd());
return new SharedMemory(f);
}
private static final int PROT_MASK = OsConstants.PROT_READ | OsConstants.PROT_WRITE
| OsConstants.PROT_EXEC | OsConstants.PROT_NONE;