From: Dan Stoza Date: Thu, 6 Apr 2017 23:18:39 +0000 (-0700) Subject: libbinder: Add int64_t/uint64_t to SafeInterface X-Git-Tag: android-x86-9.0-r1~523^2~109^2~5 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=662a899ed9bb727c1267ec10d24d87a2f0be3355;p=android-x86%2Fframeworks-native.git libbinder: Add int64_t/uint64_t to SafeInterface Adds support for sending and receiving int64_t and uint64_t parameters as part of a SafeInterface. Test: New tests in binderSafeInterfaceTest Change-Id: I3d27dd006591084b5c48f1bcb4d6dca40b679d23 --- diff --git a/libs/binder/include/binder/SafeInterface.h b/libs/binder/include/binder/SafeInterface.h index 44c1352984..1a535220ce 100644 --- a/libs/binder/include/binder/SafeInterface.h +++ b/libs/binder/include/binder/SafeInterface.h @@ -121,6 +121,24 @@ public: } }; template + struct HandleInt { + static status_t read(const ParcelHandler& handler, const Parcel& parcel, I* i) { + return handler.callParcel("readInt64", [&]() { return parcel.readInt64(i); }); + } + static status_t write(const ParcelHandler& handler, Parcel* parcel, I i) { + return handler.callParcel("writeInt64", [&]() { return parcel->writeInt64(i); }); + } + }; + template + struct HandleInt { + static status_t read(const ParcelHandler& handler, const Parcel& parcel, I* i) { + return handler.callParcel("readUint64", [&]() { return parcel.readUint64(i); }); + } + static status_t write(const ParcelHandler& handler, Parcel* parcel, I i) { + return handler.callParcel("writeUint64", [&]() { return parcel->writeUint64(i); }); + } + }; + template typename std::enable_if::value, status_t>::type read(const Parcel& parcel, I* i) const { return HandleInt::value, sizeof(I), I>::read(*this, parcel, i); diff --git a/libs/binder/tests/binderSafeInterfaceTest.cpp b/libs/binder/tests/binderSafeInterfaceTest.cpp index d1f63a728b..26b0cc270e 100644 --- a/libs/binder/tests/binderSafeInterfaceTest.cpp +++ b/libs/binder/tests/binderSafeInterfaceTest.cpp @@ -168,6 +168,8 @@ public: CallMeBack, IncrementInt32, IncrementUint32, + IncrementInt64, + IncrementUint64, IncrementTwo, Last, }; @@ -190,6 +192,8 @@ public: virtual void callMeBack(const sp& callback, int32_t a) const = 0; virtual status_t increment(int32_t a, int32_t* aPlusOne) const = 0; virtual status_t increment(uint32_t a, uint32_t* aPlusOne) const = 0; + virtual status_t increment(int64_t a, int64_t* aPlusOne) const = 0; + virtual status_t increment(uint64_t a, uint64_t* aPlusOne) const = 0; // This tests that input/output parameter interleaving works correctly virtual status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, @@ -251,6 +255,16 @@ public: using Signature = status_t (ISafeInterfaceTest::*)(uint32_t, uint32_t*) const; return callRemote(Tag::IncrementUint32, a, aPlusOne); } + status_t increment(int64_t a, int64_t* aPlusOne) const override { + ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); + using Signature = status_t (ISafeInterfaceTest::*)(int64_t, int64_t*) const; + return callRemote(Tag::IncrementInt64, a, aPlusOne); + } + status_t increment(uint64_t a, uint64_t* aPlusOne) const override { + ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); + using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; + return callRemote(Tag::IncrementUint64, a, aPlusOne); + } status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); using Signature = @@ -326,6 +340,16 @@ public: *aPlusOne = a + 1; return NO_ERROR; } + status_t increment(int64_t a, int64_t* aPlusOne) const override { + ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); + *aPlusOne = a + 1; + return NO_ERROR; + } + status_t increment(uint64_t a, uint64_t* aPlusOne) const override { + ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); + *aPlusOne = a + 1; + return NO_ERROR; + } status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); *aPlusOne = a + 1; @@ -379,6 +403,14 @@ public: using Signature = status_t (ISafeInterfaceTest::*)(uint32_t, uint32_t*) const; return callLocal(data, reply, &ISafeInterfaceTest::increment); } + case ISafeInterfaceTest::Tag::IncrementInt64: { + using Signature = status_t (ISafeInterfaceTest::*)(int64_t, int64_t*) const; + return callLocal(data, reply, &ISafeInterfaceTest::increment); + } + case ISafeInterfaceTest::Tag::IncrementUint64: { + using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; + return callLocal(data, reply, &ISafeInterfaceTest::increment); + } case ISafeInterfaceTest::Tag::IncrementTwo: { using Signature = status_t (ISafeInterfaceTest::*)(int32_t, int32_t*, int32_t, int32_t*) const; @@ -544,6 +576,22 @@ TEST_F(SafeInterfaceTest, TestIncrementUint32) { ASSERT_EQ(a + 1, aPlusOne); } +TEST_F(SafeInterfaceTest, TestIncrementInt64) { + const int64_t a = 1; + int64_t aPlusOne = 0; + status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); + ASSERT_EQ(NO_ERROR, result); + ASSERT_EQ(a + 1, aPlusOne); +} + +TEST_F(SafeInterfaceTest, TestIncrementUint64) { + const uint64_t a = 1; + uint64_t aPlusOne = 0; + status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); + ASSERT_EQ(NO_ERROR, result); + ASSERT_EQ(a + 1, aPlusOne); +} + TEST_F(SafeInterfaceTest, TestIncrementTwo) { const int32_t a = 1; int32_t aPlusOne = 0;