diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/binder/ndk/Android.bp | 6 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_parcel.h | 78 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_parcel_utils.h | 44 | ||||
| -rw-r--r-- | libs/binder/ndk/libbinder_ndk.map.txt | 2 | ||||
| -rw-r--r-- | libs/binder/ndk/parcel.cpp | 55 | ||||
| -rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 2 | ||||
| -rw-r--r-- | libs/binder/tests/binderValueTypeTest.cpp | 4 | ||||
| -rw-r--r-- | libs/gui/ISurfaceComposer.cpp | 48 | ||||
| -rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 4 | ||||
| -rw-r--r-- | libs/gui/include/gui/ISurfaceComposer.h | 6 | ||||
| -rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 3 | ||||
| -rw-r--r-- | libs/gui/tests/Surface_test.cpp | 3 | ||||
| -rw-r--r-- | libs/ui/GraphicBuffer.cpp | 4 | ||||
| -rw-r--r-- | libs/vr/libbufferhubqueue/include/private/dvr/epoll_file_descriptor.h | 2 | ||||
| -rw-r--r-- | libs/vr/libpdx_default_transport/pdx_benchmarks.cpp | 2 | ||||
| -rw-r--r-- | libs/vr/libvrflinger/epoll_event_dispatcher.cpp | 2 |
16 files changed, 247 insertions, 18 deletions
diff --git a/libs/binder/ndk/Android.bp b/libs/binder/ndk/Android.bp index d799c5f0c6..1b69dfd6a7 100644 --- a/libs/binder/ndk/Android.bp +++ b/libs/binder/ndk/Android.bp @@ -23,6 +23,8 @@ cc_library { "include_apex", ], + cflags: ["-Wall", "-Wextra", "-Werror"], + srcs: [ "ibinder.cpp", "ibinder_jni.cpp", @@ -40,6 +42,10 @@ cc_library { ], version_script: "libbinder_ndk.map.txt", + stubs: { + symbol_file: "libbinder_ndk.map.txt", + versions: ["29"], + }, } ndk_headers { diff --git a/libs/binder/ndk/include_ndk/android/binder_parcel.h b/libs/binder/ndk/include_ndk/android/binder_parcel.h index 866af70157..2258210f2e 100644 --- a/libs/binder/ndk/include_ndk/android/binder_parcel.h +++ b/libs/binder/ndk/include_ndk/android/binder_parcel.h @@ -149,7 +149,49 @@ typedef bool (*AParcel_stringArrayElementAllocator)(void* arrayData, size_t inde * not required to be null-terminated. If the object at index is null, then this should be null. */ typedef const char* (*AParcel_stringArrayElementGetter)(const void* arrayData, size_t index, - size_t* outLength); + int32_t* outLength); + +/** + * This is called to allocate an array of size 'length'. If length is -1, then a 'null' array (or + * equivalent) should be created. + * + * See also AParcel_readParcelableArray + * + * \param arrayData some external representation of an array + * \param length the length to allocate this array to + * + * \return true if allocation succeeded. If length is -1, a true return here means that a 'null' + * value (or equivalent) was successfully stored. + */ +typedef bool (*AParcel_parcelableArrayAllocator)(void* arrayData, int32_t length); + +/** + * This is called to parcel the underlying data from an arrayData object at index. + * + * See also AParcel_writeParcelableArray + * + * \param parcel parcel to write the parcelable to + * \param arrayData some external representation of an array of parcelables (a user-defined type). + * \param index the index of the value to be retrieved. + * + * \return status (usually returned from other parceling functions). STATUS_OK for success. + */ +typedef binder_status_t (*AParcel_writeParcelableElement)(AParcel* parcel, const void* arrayData, + size_t index); + +/** + * This is called to set an underlying value in an arrayData object at index. + * + * See also AParcel_readParcelableArray + * + * \param parcel parcel to read the parcelable from + * \param arrayData some external representation of an array of parcelables (a user-defined type). + * \param index the index of the value to be set. + * + * \return status (usually returned from other parceling functions). STATUS_OK for success. + */ +typedef binder_status_t (*AParcel_readParcelableElement)(const AParcel* parcel, void* arrayData, + size_t index); // @START-PRIMITIVE-VECTOR-GETTERS /** @@ -497,6 +539,40 @@ binder_status_t AParcel_readStringArray(const AParcel* parcel, void* arrayData, AParcel_stringArrayElementAllocator elementAllocator) __INTRODUCED_IN(29); +/** + * Writes an array of parcelables (user-defined types) to the next location in a non-null parcel. + * + * \param parcel the parcel to write to. + * \param arrayData an array of size 'length' (or null if length is -1, may be null if length is 0). + * \param length the length of arrayData or -1 if this represents a null array. + * \param elementWriter function to be called for every array index to write the user-defined type + * at that location. + * + * \return STATUS_OK on successful write. + */ +binder_status_t AParcel_writeParcelableArray(AParcel* parcel, const void* arrayData, int32_t length, + AParcel_writeParcelableElement elementWriter) + __INTRODUCED_IN(29); + +/** + * Reads an array of parcelables (user-defined types) from the next location in a non-null parcel. + * + * First, allocator will be called with the length of the array. If the allocation succeeds and the + * length is greater than zero, elementReader will be called for every index to read the + * corresponding parcelable. + * + * \param parcel the parcel to read from. + * \param arrayData some external representation of an array. + * \param allocator the callback that will be called to allocate the array. + * \param elementReader the callback that will be called to fill out individual elements. + * + * \return STATUS_OK on successful read. + */ +binder_status_t AParcel_readParcelableArray(const AParcel* parcel, void* arrayData, + AParcel_parcelableArrayAllocator allocator, + AParcel_readParcelableElement elementReader) + __INTRODUCED_IN(29); + // @START-PRIMITIVE-READ-WRITE /** * Writes int32_t value to the next location in a non-null parcel. diff --git a/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h b/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h index f99c3a92e2..fcdf7af22c 100644 --- a/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h +++ b/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h @@ -299,7 +299,7 @@ static inline bool AParcel_stdVectorStringElementAllocator(void* vectorData, siz * index. */ static inline const char* AParcel_stdVectorStringElementGetter(const void* vectorData, size_t index, - size_t* outLength) { + int32_t* outLength) { const std::vector<std::string>* vec = static_cast<const std::vector<std::string>*>(vectorData); const std::string& element = vec->at(index); @@ -327,7 +327,7 @@ static inline bool AParcel_nullableStdVectorStringElementAllocator(void* vectorD */ static inline const char* AParcel_nullableStdVectorStringElementGetter(const void* vectorData, size_t index, - size_t* outLength) { + int32_t* outLength) { const std::optional<std::vector<std::optional<std::string>>>* vec = static_cast<const std::optional<std::vector<std::optional<std::string>>>*>(vectorData); const std::optional<std::string>& element = vec->value().at(index); @@ -420,6 +420,46 @@ static inline binder_status_t AParcel_readVector( AParcel_nullableStdVectorStringElementAllocator); } +/** + * Writes a parcelable object of type P inside a std::vector<P> at index 'index' to 'parcel'. + */ +template <typename P> +binder_status_t AParcel_writeStdVectorParcelableElement(AParcel* parcel, const void* vectorData, + size_t index) { + const std::vector<P>* vector = static_cast<const std::vector<P>*>(vectorData); + return vector->at(index).writeToParcel(parcel); +} + +/** + * Reads a parcelable object of type P inside a std::vector<P> at index 'index' from 'parcel'. + */ +template <typename P> +binder_status_t AParcel_readStdVectorParcelableElement(const AParcel* parcel, void* vectorData, + size_t index) { + std::vector<P>* vector = static_cast<std::vector<P>*>(vectorData); + return vector->at(index).readFromParcel(parcel); +} + +/** + * Convenience API for writing a std::vector<P> + */ +template <typename P> +static inline binder_status_t AParcel_writeVector(AParcel* parcel, const std::vector<P>& vec) { + const void* vectorData = static_cast<const void*>(&vec); + return AParcel_writeParcelableArray(parcel, vectorData, vec.size(), + AParcel_writeStdVectorParcelableElement<P>); +} + +/** + * Convenience API for reading a std::vector<P> + */ +template <typename P> +static inline binder_status_t AParcel_readVector(const AParcel* parcel, std::vector<P>* vec) { + void* vectorData = static_cast<void*>(vec); + return AParcel_readParcelableArray(parcel, vectorData, AParcel_stdVectorExternalAllocator<P>, + AParcel_readStdVectorParcelableElement<P>); +} + // @START /** * Writes a vector of int32_t to the next location in a non-null parcel. diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt index 4328b6ea6d..ee7132f87f 100644 --- a/libs/binder/ndk/libbinder_ndk.map.txt +++ b/libs/binder/ndk/libbinder_ndk.map.txt @@ -40,6 +40,7 @@ LIBBINDER_NDK { # introduced=29 AParcel_readInt32Array; AParcel_readInt64; AParcel_readInt64Array; + AParcel_readParcelableArray; AParcel_readParcelFileDescriptor; AParcel_readStatusHeader; AParcel_readString; @@ -64,6 +65,7 @@ LIBBINDER_NDK { # introduced=29 AParcel_writeInt32Array; AParcel_writeInt64; AParcel_writeInt64Array; + AParcel_writeParcelableArray; AParcel_writeParcelFileDescriptor; AParcel_writeStatusHeader; AParcel_writeString; diff --git a/libs/binder/ndk/parcel.cpp b/libs/binder/ndk/parcel.cpp index 2d68559395..ae2276e794 100644 --- a/libs/binder/ndk/parcel.cpp +++ b/libs/binder/ndk/parcel.cpp @@ -173,7 +173,7 @@ binder_status_t WriteArray(AParcel* parcel, const void* arrayData, int32_t lengt Parcel* rawParcel = parcel->get(); - for (size_t i = 0; i < length; i++) { + for (int32_t i = 0; i < length; i++) { status = (rawParcel->*write)(getter(arrayData, i)); if (status != STATUS_OK) return PruneStatusT(status); @@ -197,7 +197,7 @@ binder_status_t ReadArray(const AParcel* parcel, void* arrayData, ArrayAllocator if (length <= 0) return STATUS_OK; - for (size_t i = 0; i < length; i++) { + for (int32_t i = 0; i < length; i++) { T readTarget; status = (rawParcel->*read)(&readTarget); if (status != STATUS_OK) return PruneStatusT(status); @@ -376,12 +376,12 @@ binder_status_t AParcel_writeStringArray(AParcel* parcel, const void* arrayData, if (status != STATUS_OK) return status; if (length <= 0) return STATUS_OK; - for (size_t i = 0; i < length; i++) { - size_t length = 0; - const char* str = getter(arrayData, i, &length); - if (str == nullptr && length != -1) return STATUS_BAD_VALUE; + for (int32_t i = 0; i < length; i++) { + int32_t elementLength = 0; + const char* str = getter(arrayData, i, &elementLength); + if (str == nullptr && elementLength != -1) return STATUS_BAD_VALUE; - binder_status_t status = AParcel_writeString(parcel, str, length); + binder_status_t status = AParcel_writeString(parcel, str, elementLength); if (status != STATUS_OK) return status; } @@ -392,7 +392,7 @@ binder_status_t AParcel_writeStringArray(AParcel* parcel, const void* arrayData, // allocator. struct StringArrayElementAllocationAdapter { void* arrayData; // stringData from the NDK - size_t index; // index into the string array + int32_t index; // index into the string array AParcel_stringArrayElementAllocator elementAllocator; static bool Allocator(void* stringData, int32_t length, char** buffer) { @@ -433,6 +433,45 @@ binder_status_t AParcel_readStringArray(const AParcel* parcel, void* arrayData, return STATUS_OK; } +binder_status_t AParcel_writeParcelableArray(AParcel* parcel, const void* arrayData, int32_t length, + AParcel_writeParcelableElement elementWriter) { + // we have no clue if arrayData represents a null object or not, we can only infer from length + bool arrayIsNull = length < 0; + binder_status_t status = WriteAndValidateArraySize(parcel, arrayIsNull, length); + if (status != STATUS_OK) return status; + if (length <= 0) return STATUS_OK; + + for (int32_t i = 0; i < length; i++) { + binder_status_t status = elementWriter(parcel, arrayData, i); + if (status != STATUS_OK) return status; + } + + return STATUS_OK; +} + +binder_status_t AParcel_readParcelableArray(const AParcel* parcel, void* arrayData, + AParcel_parcelableArrayAllocator allocator, + AParcel_readParcelableElement elementReader) { + const Parcel* rawParcel = parcel->get(); + + int32_t length; + status_t status = rawParcel->readInt32(&length); + + if (status != STATUS_OK) return PruneStatusT(status); + if (length < -1) return STATUS_BAD_VALUE; + + if (!allocator(arrayData, length)) return STATUS_NO_MEMORY; + + if (length == -1) return STATUS_OK; // null array + + for (int32_t i = 0; i < length; i++) { + binder_status_t status = elementReader(parcel, arrayData, i); + if (status != STATUS_OK) return status; + } + + return STATUS_OK; +} + // See gen_parcel_helper.py. These auto-generated read/write methods use the same types for // libbinder and this library. // @START diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp index 73c2eba1d5..2dd86ba7e1 100644 --- a/libs/binder/tests/binderLibTest.cpp +++ b/libs/binder/tests/binderLibTest.cpp @@ -1295,7 +1295,7 @@ int run_server(int index, int readypipefd, bool usePoll) } IPCThreadState::self()->flushCommands(); // flush BC_ENTER_LOOPER - epoll_fd = epoll_create1(0); + epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (epoll_fd == -1) { return 1; } diff --git a/libs/binder/tests/binderValueTypeTest.cpp b/libs/binder/tests/binderValueTypeTest.cpp index 15949d48c0..f8922b0784 100644 --- a/libs/binder/tests/binderValueTypeTest.cpp +++ b/libs/binder/tests/binderValueTypeTest.cpp @@ -75,13 +75,13 @@ using ::std::vector; VALUE_TYPE_TEST(bool, Boolean, true) VALUE_TYPE_TEST(int32_t, Int, 31337) -VALUE_TYPE_TEST(int64_t, Long, 13370133701337l) +VALUE_TYPE_TEST(int64_t, Long, 13370133701337L) VALUE_TYPE_TEST(double, Double, 3.14159265358979323846) VALUE_TYPE_TEST(String16, String, String16("Lovely")) VALUE_TYPE_VECTOR_TEST(bool, Boolean, true) VALUE_TYPE_VECTOR_TEST(int32_t, Int, 31337) -VALUE_TYPE_VECTOR_TEST(int64_t, Long, 13370133701337l) +VALUE_TYPE_VECTOR_TEST(int64_t, Long, 13370133701337L) VALUE_TYPE_VECTOR_TEST(double, Double, 3.14159265358979323846) VALUE_TYPE_VECTOR_TEST(String16, String, String16("Lovely")) diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index e22bc708c9..d2d27e8239 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -332,6 +332,34 @@ public: return result; } + virtual status_t getDisplayViewport(const sp<IBinder>& display, Rect* outViewport) { + Parcel data, reply; + status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); + if (result != NO_ERROR) { + ALOGE("getDisplayViewport failed to writeInterfaceToken: %d", result); + return result; + } + result = data.writeStrongBinder(display); + if (result != NO_ERROR) { + ALOGE("getDisplayViewport failed to writeStrongBinder: %d", result); + return result; + } + result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_VIEWPORT, data, &reply); + if (result != NO_ERROR) { + ALOGE("getDisplayViewport failed to transact: %d", result); + return result; + } + result = reply.readInt32(); + if (result == NO_ERROR) { + result = reply.read(*outViewport); + if (result != NO_ERROR) { + ALOGE("getDisplayViewport failed to read: %d", result); + return result; + } + } + return result; + } + virtual int getActiveConfig(const sp<IBinder>& display) { Parcel data, reply; @@ -724,6 +752,26 @@ status_t BnSurfaceComposer::onTransact( } return NO_ERROR; } + case GET_DISPLAY_VIEWPORT: { + CHECK_INTERFACE(ISurfaceComposer, data, reply); + Rect outViewport; + sp<IBinder> display = nullptr; + status_t result = data.readStrongBinder(&display); + if (result != NO_ERROR) { + ALOGE("getDisplayViewport failed to readStrongBinder: %d", result); + return result; + } + result = getDisplayViewport(display, &outViewport); + result = reply->writeInt32(result); + if (result == NO_ERROR) { + result = reply->write(outViewport); + if (result != NO_ERROR) { + ALOGE("getDisplayViewport failed to write: %d", result); + return result; + } + } + return NO_ERROR; + } case GET_ACTIVE_CONFIG: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> display = data.readStrongBinder(); diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 63560c4b89..f3c6fd2f87 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -718,6 +718,10 @@ status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display, return NO_ERROR; } +status_t SurfaceComposerClient::getDisplayViewport(const sp<IBinder>& display, Rect* outViewport) { + return ComposerService::getComposerService()->getDisplayViewport(display, outViewport); +} + int SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) { return ComposerService::getComposerService()->getActiveConfig(display); } diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index e40157206d..99a3a75502 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -157,6 +157,9 @@ public: virtual status_t getDisplayStats(const sp<IBinder>& display, DisplayStatInfo* stats) = 0; + /* returns display viewport information of the given display */ + virtual status_t getDisplayViewport(const sp<IBinder>& display, Rect* outViewport) = 0; + /* indicates which of the configurations returned by getDisplayInfo is * currently active */ virtual int getActiveConfig(const sp<IBinder>& display) = 0; @@ -250,7 +253,8 @@ public: ENABLE_VSYNC_INJECTIONS, INJECT_VSYNC, GET_LAYER_DEBUG_INFO, - CREATE_SCOPED_CONNECTION + CREATE_SCOPED_CONNECTION, + GET_DISPLAY_VIEWPORT }; virtual status_t onTransact(uint32_t code, const Parcel& data, diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 377fe68c41..ad8a8b09d0 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -79,6 +79,9 @@ public: static status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info); + // Get the display viewport for the given display + static status_t getDisplayViewport(const sp<IBinder>& display, Rect* outViewport); + // Get the index of the current active configuration (relative to the list // returned by getDisplayInfo) static int getActiveConfig(const sp<IBinder>& display); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index 2c02ba657d..6e196bfac8 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -581,6 +581,9 @@ public: Vector<DisplayInfo>* /*configs*/) override { return NO_ERROR; } status_t getDisplayStats(const sp<IBinder>& /*display*/, DisplayStatInfo* /*stats*/) override { return NO_ERROR; } + status_t getDisplayViewport(const sp<IBinder>& /*display*/, Rect* /*outViewport*/) override { + return NO_ERROR; + } int getActiveConfig(const sp<IBinder>& /*display*/) override { return 0; } status_t setActiveConfig(const sp<IBinder>& /*display*/, int /*id*/) override { diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp index c1f1d2583f..4aa9f628ce 100644 --- a/libs/ui/GraphicBuffer.cpp +++ b/libs/ui/GraphicBuffer.cpp @@ -370,6 +370,10 @@ status_t GraphicBuffer::flatten(void*& buffer, size_t& size, int*& fds, size_t& status_t GraphicBuffer::unflatten( void const*& buffer, size_t& size, int const*& fds, size_t& count) { + if (size < 12 * sizeof(int)) { + android_errorWriteLog(0x534e4554, "114223584"); + return NO_MEMORY; + } int const* buf = static_cast<int const*>(buffer); diff --git a/libs/vr/libbufferhubqueue/include/private/dvr/epoll_file_descriptor.h b/libs/vr/libbufferhubqueue/include/private/dvr/epoll_file_descriptor.h index 6e303a5e5a..2f14f7cd91 100644 --- a/libs/vr/libbufferhubqueue/include/private/dvr/epoll_file_descriptor.h +++ b/libs/vr/libbufferhubqueue/include/private/dvr/epoll_file_descriptor.h @@ -28,7 +28,7 @@ class EpollFileDescriptor { return -EALREADY; } - fd_.reset(epoll_create(64)); + fd_.reset(epoll_create1(EPOLL_CLOEXEC)); if (fd_.get() < 0) return -errno; diff --git a/libs/vr/libpdx_default_transport/pdx_benchmarks.cpp b/libs/vr/libpdx_default_transport/pdx_benchmarks.cpp index fa0adf0182..f72dabc658 100644 --- a/libs/vr/libpdx_default_transport/pdx_benchmarks.cpp +++ b/libs/vr/libpdx_default_transport/pdx_benchmarks.cpp @@ -66,7 +66,7 @@ void SetThreadName(const std::string& name) { prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(name.c_str()), 0, 0, 0); } -constexpr uint64_t kNanosPerSecond = 1000000000llu; +constexpr uint64_t kNanosPerSecond = 1000000000LLU; uint64_t GetClockNs() { timespec t; diff --git a/libs/vr/libvrflinger/epoll_event_dispatcher.cpp b/libs/vr/libvrflinger/epoll_event_dispatcher.cpp index 962c7459fd..1cf5f17f62 100644 --- a/libs/vr/libvrflinger/epoll_event_dispatcher.cpp +++ b/libs/vr/libvrflinger/epoll_event_dispatcher.cpp @@ -11,7 +11,7 @@ namespace android { namespace dvr { EpollEventDispatcher::EpollEventDispatcher() { - epoll_fd_.Reset(epoll_create(64)); + epoll_fd_.Reset(epoll_create1(EPOLL_CLOEXEC)); if (!epoll_fd_) { ALOGE("Failed to create epoll fd: %s", strerror(errno)); return; |