diff options
| -rw-r--r-- | cmds/idlcli/Android.bp | 3 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator.h | 29 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator/CommandGetCapabilities.cpp | 69 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator/CommandOff.cpp | 17 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator/CommandOn.cpp | 17 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator/CommandPerform.cpp | 92 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator/CommandSetAmplitude.cpp | 17 | ||||
| -rw-r--r-- | cmds/idlcli/vibrator/CommandSetExternalControl.cpp | 17 | ||||
| -rw-r--r-- | cmds/installd/dexopt.cpp | 23 | ||||
| -rw-r--r-- | cmds/installd/otapreopt.cpp | 4 | ||||
| -rw-r--r-- | cmds/servicemanager/ServiceManager.cpp | 10 | ||||
| -rw-r--r-- | libs/binder/ProcessState.cpp | 6 | ||||
| -rw-r--r-- | libs/binder/aidl/android/os/IServiceManager.aidl | 4 | ||||
| -rw-r--r-- | libs/binder/ndk/include_ndk/android/binder_parcel_utils.h | 36 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 6 |
15 files changed, 291 insertions, 59 deletions
diff --git a/cmds/idlcli/Android.bp b/cmds/idlcli/Android.bp index 40b8dc74f7..bb92fd3ac0 100644 --- a/cmds/idlcli/Android.bp +++ b/cmds/idlcli/Android.bp @@ -20,9 +20,11 @@ cc_defaults { "android.hardware.vibrator@1.2", "android.hardware.vibrator@1.3", "libbase", + "libbinder", "libhidlbase", "liblog", "libutils", + "vintf-vibrator-cpp", ], cflags: [ "-DLOG_TAG=\"idlcli\"", @@ -34,6 +36,7 @@ cc_library { defaults: ["idlcli-defaults"], srcs: [ "CommandVibrator.cpp", + "vibrator/CommandGetCapabilities.cpp", "vibrator/CommandOff.cpp", "vibrator/CommandOn.cpp", "vibrator/CommandPerform.cpp", diff --git a/cmds/idlcli/vibrator.h b/cmds/idlcli/vibrator.h index bcb207b7d0..2f119234c1 100644 --- a/cmds/idlcli/vibrator.h +++ b/cmds/idlcli/vibrator.h @@ -18,6 +18,8 @@ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #include <android/hardware/vibrator/1.3/IVibrator.h> +#include <android/hardware/vibrator/IVibrator.h> +#include <binder/IServiceManager.h> #include "utils.h" @@ -31,9 +33,25 @@ static constexpr int NUM_TRIES = 2; // Creates a Return<R> with STATUS::EX_NULL_POINTER. template <class R> -inline Return<R> NullptrStatus() { +inline R NullptrStatus() { using ::android::hardware::Status; - return Return<R>{Status::fromExceptionCode(Status::EX_NULL_POINTER)}; + return Status::fromExceptionCode(Status::EX_NULL_POINTER); +} + +template <> +inline binder::Status NullptrStatus() { + using binder::Status; + return Status::fromExceptionCode(Status::EX_NULL_POINTER); +} + +template <typename I> +inline sp<I> getService() { + return I::getService(); +} + +template <> +inline sp<hardware::vibrator::IVibrator> getService() { + return waitForVintfService<hardware::vibrator::IVibrator>(); } template <typename I> @@ -42,12 +60,12 @@ public: static std::unique_ptr<HalWrapper> Create() { // Assume that if getService returns a nullptr, HAL is not available on the // device. - auto hal = I::getService(); + auto hal = getService<I>(); return hal ? std::unique_ptr<HalWrapper>(new HalWrapper(std::move(hal))) : nullptr; } template <class R, class... Args0, class... Args1> - Return<R> call(Return<R> (I::*fn)(Args0...), Args1&&... args1) { + R call(R (I::*fn)(Args0...), Args1&&... args1) { return (*mHal.*fn)(std::forward<Args1>(args1)...); } @@ -65,7 +83,7 @@ static auto getHal() { } template <class R, class I, class... Args0, class... Args1> -Return<R> halCall(Return<R> (I::*fn)(Args0...), Args1&&... args1) { +R halCall(R (I::*fn)(Args0...), Args1&&... args1) { auto hal = getHal<I>(); return hal ? hal->call(fn, std::forward<Args1>(args1)...) : NullptrStatus<R>(); } @@ -77,6 +95,7 @@ namespace V1_0 = ::android::hardware::vibrator::V1_0; namespace V1_1 = ::android::hardware::vibrator::V1_1; namespace V1_2 = ::android::hardware::vibrator::V1_2; namespace V1_3 = ::android::hardware::vibrator::V1_3; +namespace aidl = ::android::hardware::vibrator; } // namespace vibrator } // namespace idlcli diff --git a/cmds/idlcli/vibrator/CommandGetCapabilities.cpp b/cmds/idlcli/vibrator/CommandGetCapabilities.cpp new file mode 100644 index 0000000000..30d85873c0 --- /dev/null +++ b/cmds/idlcli/vibrator/CommandGetCapabilities.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2019 The Android Open Source Project * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "utils.h" +#include "vibrator.h" + +namespace android { +namespace idlcli { + +class CommandVibrator; + +namespace vibrator { + +class CommandGetCapabilities : public Command { + std::string getDescription() const override { return "Retrieves vibrator capabilities."; } + + std::string getUsageSummary() const override { return ""; } + + UsageDetails getUsageDetails() const override { + UsageDetails details{}; + return details; + } + + Status doArgs(Args &args) override { + if (!args.empty()) { + std::cerr << "Unexpected Arguments!" << std::endl; + return USAGE; + } + return OK; + } + + Status doMain(Args && /*args*/) override { + std::string statusStr; + int32_t cap; + Status ret; + + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::getCapabilities, &cap); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else { + return UNAVAILABLE; + } + + std::cout << "Status: " << statusStr << std::endl; + std::cout << "Capabilities: " << std::bitset<32>(cap) << std::endl; + + return ret; + } +}; + +static const auto Command = + CommandRegistry<CommandVibrator>::Register<CommandGetCapabilities>("getCapabilities"); + +} // namespace vibrator +} // namespace idlcli +} // namespace android diff --git a/cmds/idlcli/vibrator/CommandOff.cpp b/cmds/idlcli/vibrator/CommandOff.cpp index a674f0192f..53fada0f86 100644 --- a/cmds/idlcli/vibrator/CommandOff.cpp +++ b/cmds/idlcli/vibrator/CommandOff.cpp @@ -42,15 +42,24 @@ class CommandOff : public Command { } Status doMain(Args && /*args*/) override { - auto ret = halCall(&V1_0::IVibrator::off); + std::string statusStr; + Status ret; - if (!ret.isOk()) { + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::off); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else if (auto hal = getHal<V1_0::IVibrator>()) { + auto status = hal->call(&V1_0::IVibrator::off); + statusStr = toString(status); + ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; + } else { return UNAVAILABLE; } - std::cout << "Status: " << toString(ret) << std::endl; + std::cout << "Status: " << statusStr << std::endl; - return ret == V1_0::Status::OK ? OK : ERROR; + return ret; } }; diff --git a/cmds/idlcli/vibrator/CommandOn.cpp b/cmds/idlcli/vibrator/CommandOn.cpp index 2164b7d149..ccb3c19ca8 100644 --- a/cmds/idlcli/vibrator/CommandOn.cpp +++ b/cmds/idlcli/vibrator/CommandOn.cpp @@ -50,15 +50,24 @@ class CommandOn : public Command { } Status doMain(Args && /*args*/) override { - auto ret = halCall(&V1_0::IVibrator::on, mDuration); + std::string statusStr; + Status ret; - if (!ret.isOk()) { + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::on, mDuration, nullptr); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else if (auto hal = getHal<V1_0::IVibrator>()) { + auto status = hal->call(&V1_0::IVibrator::on, mDuration); + statusStr = toString(status); + ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; + } else { return UNAVAILABLE; } - std::cout << "Status: " << toString(ret) << std::endl; + std::cout << "Status: " << statusStr << std::endl; - return ret == V1_0::Status::OK ? OK : ERROR; + return ret; } uint32_t mDuration; diff --git a/cmds/idlcli/vibrator/CommandPerform.cpp b/cmds/idlcli/vibrator/CommandPerform.cpp index 688cbd87a1..58d4e0ac16 100644 --- a/cmds/idlcli/vibrator/CommandPerform.cpp +++ b/cmds/idlcli/vibrator/CommandPerform.cpp @@ -23,6 +23,34 @@ class CommandVibrator; namespace vibrator { +/* + * The following static asserts are only relevant here because the argument + * parser uses a single implementation for determining the string names. + */ +static_assert(static_cast<uint8_t>(V1_0::EffectStrength::LIGHT) == + static_cast<uint8_t>(aidl::EffectStrength::LIGHT)); +static_assert(static_cast<uint8_t>(V1_0::EffectStrength::MEDIUM) == + static_cast<uint8_t>(aidl::EffectStrength::MEDIUM)); +static_assert(static_cast<uint8_t>(V1_0::EffectStrength::STRONG) == + static_cast<uint8_t>(aidl::EffectStrength::STRONG)); +static_assert(static_cast<uint8_t>(V1_3::Effect::CLICK) == + static_cast<uint8_t>(aidl::Effect::CLICK)); +static_assert(static_cast<uint8_t>(V1_3::Effect::DOUBLE_CLICK) == + static_cast<uint8_t>(aidl::Effect::DOUBLE_CLICK)); +static_assert(static_cast<uint8_t>(V1_3::Effect::TICK) == static_cast<uint8_t>(aidl::Effect::TICK)); +static_assert(static_cast<uint8_t>(V1_3::Effect::THUD) == static_cast<uint8_t>(aidl::Effect::THUD)); +static_assert(static_cast<uint8_t>(V1_3::Effect::POP) == static_cast<uint8_t>(aidl::Effect::POP)); +static_assert(static_cast<uint8_t>(V1_3::Effect::HEAVY_CLICK) == + static_cast<uint8_t>(aidl::Effect::HEAVY_CLICK)); +static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_1) == + static_cast<uint8_t>(aidl::Effect::RINGTONE_1)); +static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_2) == + static_cast<uint8_t>(aidl::Effect::RINGTONE_2)); +static_assert(static_cast<uint8_t>(V1_3::Effect::RINGTONE_15) == + static_cast<uint8_t>(aidl::Effect::RINGTONE_15)); +static_assert(static_cast<uint8_t>(V1_3::Effect::TEXTURE_TICK) == + static_cast<uint8_t>(aidl::Effect::TEXTURE_TICK)); + using V1_0::EffectStrength; using V1_3::Effect; @@ -62,38 +90,50 @@ class CommandPerform : public Command { } Status doMain(Args && /*args*/) override { - Return<void> ret; - V1_0::Status status; + std::string statusStr; uint32_t lengthMs; - auto callback = [&status, &lengthMs](V1_0::Status retStatus, uint32_t retLengthMs) { - status = retStatus; - lengthMs = retLengthMs; - }; - - if (auto hal = getHal<V1_3::IVibrator>()) { - ret = hal->call(&V1_3::IVibrator::perform_1_3, static_cast<V1_3::Effect>(mEffect), - mStrength, callback); - } else if (auto hal = getHal<V1_2::IVibrator>()) { - ret = hal->call(&V1_2::IVibrator::perform_1_2, static_cast<V1_2::Effect>(mEffect), - mStrength, callback); - } else if (auto hal = getHal<V1_1::IVibrator>()) { - ret = hal->call(&V1_1::IVibrator::perform_1_1, static_cast<V1_1::Effect_1_1>(mEffect), - mStrength, callback); - } else if (auto hal = getHal<V1_0::IVibrator>()) { - ret = hal->call(&V1_0::IVibrator::perform, static_cast<V1_0::Effect>(mEffect), - mStrength, callback); + Status ret; + + if (auto hal = getHal<aidl::IVibrator>()) { + int32_t aidlLengthMs; + auto status = + hal->call(&aidl::IVibrator::perform, static_cast<aidl::Effect>(mEffect), + static_cast<aidl::EffectStrength>(mStrength), nullptr, &aidlLengthMs); + statusStr = status.toString8(); + lengthMs = static_cast<uint32_t>(aidlLengthMs); + ret = status.isOk() ? OK : ERROR; } else { - ret = NullptrStatus<void>(); - } - - if (!ret.isOk()) { - return UNAVAILABLE; + Return<void> hidlRet; + V1_0::Status status; + auto callback = [&status, &lengthMs](V1_0::Status retStatus, uint32_t retLengthMs) { + status = retStatus; + lengthMs = retLengthMs; + }; + + if (auto hal = getHal<V1_3::IVibrator>()) { + hidlRet = hal->call(&V1_3::IVibrator::perform_1_3, + static_cast<V1_3::Effect>(mEffect), mStrength, callback); + } else if (auto hal = getHal<V1_2::IVibrator>()) { + hidlRet = hal->call(&V1_2::IVibrator::perform_1_2, + static_cast<V1_2::Effect>(mEffect), mStrength, callback); + } else if (auto hal = getHal<V1_1::IVibrator>()) { + hidlRet = hal->call(&V1_1::IVibrator::perform_1_1, + static_cast<V1_1::Effect_1_1>(mEffect), mStrength, callback); + } else if (auto hal = getHal<V1_0::IVibrator>()) { + hidlRet = hal->call(&V1_0::IVibrator::perform, static_cast<V1_0::Effect>(mEffect), + mStrength, callback); + } else { + return UNAVAILABLE; + } + + statusStr = toString(status); + ret = hidlRet.isOk() && status == V1_0::Status::OK ? OK : ERROR; } - std::cout << "Status: " << toString(status) << std::endl; + std::cout << "Status: " << statusStr << std::endl; std::cout << "Length: " << lengthMs << std::endl; - return status == V1_0::Status::OK ? OK : ERROR; + return ret; } Effect mEffect; diff --git a/cmds/idlcli/vibrator/CommandSetAmplitude.cpp b/cmds/idlcli/vibrator/CommandSetAmplitude.cpp index 38a1dc279b..6e2261f61e 100644 --- a/cmds/idlcli/vibrator/CommandSetAmplitude.cpp +++ b/cmds/idlcli/vibrator/CommandSetAmplitude.cpp @@ -50,15 +50,24 @@ class CommandSetAmplitude : public Command { } Status doMain(Args && /*args*/) override { - auto ret = halCall(&V1_0::IVibrator::setAmplitude, mAmplitude); + std::string statusStr; + Status ret; - if (!ret.isOk()) { + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::setAmplitude, mAmplitude); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else if (auto hal = getHal<V1_0::IVibrator>()) { + auto status = hal->call(&V1_0::IVibrator::setAmplitude, mAmplitude); + statusStr = toString(status); + ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; + } else { return UNAVAILABLE; } - std::cout << "Status: " << toString(ret) << std::endl; + std::cout << "Status: " << statusStr << std::endl; - return ret == V1_0::Status::OK ? OK : ERROR; + return ret; } uint8_t mAmplitude; diff --git a/cmds/idlcli/vibrator/CommandSetExternalControl.cpp b/cmds/idlcli/vibrator/CommandSetExternalControl.cpp index 5fb1faca16..5bc827e707 100644 --- a/cmds/idlcli/vibrator/CommandSetExternalControl.cpp +++ b/cmds/idlcli/vibrator/CommandSetExternalControl.cpp @@ -48,15 +48,24 @@ class CommandSetExternalControl : public Command { } Status doMain(Args && /*args*/) override { - auto ret = halCall(&V1_3::IVibrator::setExternalControl, mEnable); + std::string statusStr; + Status ret; - if (!ret.isOk()) { + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::setExternalControl, mEnable); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else if (auto hal = getHal<V1_3::IVibrator>()) { + auto status = hal->call(&V1_3::IVibrator::setExternalControl, mEnable); + statusStr = toString(status); + ret = status.isOk() && status == V1_0::Status::OK ? OK : ERROR; + } else { return UNAVAILABLE; } - std::cout << "Status: " << toString(ret) << std::endl; + std::cout << "Status: " << statusStr << std::endl; - return ret == V1_0::Status::OK ? OK : ERROR; + return ret; } bool mEnable; diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index 768d900591..f95e445ade 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -339,6 +339,10 @@ class RunDex2Oat : public ExecVHelper { ? "dalvik.vm.dex2oat-threads" : "dalvik.vm.boot-dex2oat-threads"; std::string dex2oat_threads_arg = MapPropertyToArg(threads_property, "-j%s"); + const char* cpu_set_property = post_bootcomplete + ? "dalvik.vm.dex2oat-cpu-set" + : "dalvik.vm.boot-dex2oat-cpu-set"; + std::string dex2oat_cpu_set_arg = MapPropertyToArg(cpu_set_property, "--cpu-set=%s"); std::string bootclasspath; char* dex2oat_bootclasspath = getenv("DEX2OATBOOTCLASSPATH"); @@ -518,6 +522,7 @@ class RunDex2Oat : public ExecVHelper { AddArg(image_block_size_arg); AddArg(dex2oat_compiler_filter_arg); AddArg(dex2oat_threads_arg); + AddArg(dex2oat_cpu_set_arg); AddArg(dex2oat_swap_fd); AddArg(dex2oat_image_fd); @@ -708,12 +713,13 @@ static void open_profile_files(uid_t uid, const std::string& package_name, } } -static constexpr int PROFMAN_BIN_RETURN_CODE_COMPILE = 0; -static constexpr int PROFMAN_BIN_RETURN_CODE_SKIP_COMPILATION = 1; -static constexpr int PROFMAN_BIN_RETURN_CODE_BAD_PROFILES = 2; -static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_IO = 3; -static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_LOCKING = 4; -static constexpr int PROFMAN_BIN_RETURN_CODE_SUCCESS = 5; +static constexpr int PROFMAN_BIN_RETURN_CODE_SUCCESS = 0; +static constexpr int PROFMAN_BIN_RETURN_CODE_COMPILE = 1; +static constexpr int PROFMAN_BIN_RETURN_CODE_SKIP_COMPILATION = 2; +static constexpr int PROFMAN_BIN_RETURN_CODE_BAD_PROFILES = 3; +static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_IO = 4; +static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_LOCKING = 5; +static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_DIFFERENT_VERSIONS = 6; class RunProfman : public ExecVHelper { public: @@ -889,6 +895,11 @@ static bool analyze_profiles(uid_t uid, const std::string& package_name, should_clear_current_profiles = false; should_clear_reference_profile = false; break; + case PROFMAN_BIN_RETURN_CODE_ERROR_DIFFERENT_VERSIONS: + need_to_compile = false; + should_clear_current_profiles = true; + should_clear_reference_profile = true; + break; default: // Unknown return code or error. Unlink profiles. LOG(WARNING) << "Unexpected error code while processing profiles for location " diff --git a/cmds/installd/otapreopt.cpp b/cmds/installd/otapreopt.cpp index db36ce3c9e..eefbe4ffe2 100644 --- a/cmds/installd/otapreopt.cpp +++ b/cmds/installd/otapreopt.cpp @@ -480,6 +480,10 @@ private: "-j", false, cmd); + AddCompilerOptionFromSystemProperty("dalvik.vm.image-dex2oat-cpu-set", + "--cpu-set=", + false, + cmd); AddCompilerOptionFromSystemProperty( StringPrintf("dalvik.vm.isa.%s.variant", isa).c_str(), "--instruction-set-variant=", diff --git a/cmds/servicemanager/ServiceManager.cpp b/cmds/servicemanager/ServiceManager.cpp index 861401c979..2d2af3c716 100644 --- a/cmds/servicemanager/ServiceManager.cpp +++ b/cmds/servicemanager/ServiceManager.cpp @@ -68,7 +68,15 @@ static bool meetsDeclarationRequirements(const sp<IBinder>& binder, const std::s } #endif // !VENDORSERVICEMANAGER -ServiceManager::ServiceManager(std::unique_ptr<Access>&& access) : mAccess(std::move(access)) {} +ServiceManager::ServiceManager(std::unique_ptr<Access>&& access) : mAccess(std::move(access)) { +#ifndef VENDORSERVICEMANAGER + // can process these at any times, don't want to delay first VINTF client + std::thread([] { + vintf::VintfObject::GetDeviceHalManifest(); + vintf::VintfObject::GetFrameworkHalManifest(); + }).detach(); +#endif // !VENDORSERVICEMANAGER +} ServiceManager::~ServiceManager() { // this should only happen in tests diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index ea61dc5aff..ce2cd9969f 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -385,6 +385,12 @@ ProcessState::ProcessState(const char *driver) , mThreadPoolSeq(1) , mCallRestriction(CallRestriction::NONE) { + +// TODO(b/139016109): enforce in build system +#if defined(__ANDROID_APEX__) && !defined(__ANDROID_APEX_COM_ANDROID_VNDK_CURRENT__) + LOG_ALWAYS_FATAL("Cannot use libbinder in APEX (only system.img libbinder) since it is not stable."); +#endif + if (mDriverFD >= 0) { // mmap the binder, providing a chunk of virtual address space to receive transactions. mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0); diff --git a/libs/binder/aidl/android/os/IServiceManager.aidl b/libs/binder/aidl/android/os/IServiceManager.aidl index 8c7ebbaf36..b965881e7f 100644 --- a/libs/binder/aidl/android/os/IServiceManager.aidl +++ b/libs/binder/aidl/android/os/IServiceManager.aidl @@ -58,7 +58,7 @@ interface IServiceManager { * Returns null if the service does not exist. */ @UnsupportedAppUsage - IBinder getService(@utf8InCpp String name); + @nullable IBinder getService(@utf8InCpp String name); /** * Retrieve an existing service called @a name from the service @@ -66,7 +66,7 @@ interface IServiceManager { * exist. */ @UnsupportedAppUsage - IBinder checkService(@utf8InCpp String name); + @nullable IBinder checkService(@utf8InCpp String name); /** * Place a new @a service called @a name into the service 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 f3bc31b0bb..787166762b 100644 --- a/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h +++ b/libs/binder/ndk/include_ndk/android/binder_parcel_utils.h @@ -441,6 +441,42 @@ binder_status_t AParcel_readStdVectorParcelableElement(const AParcel* parcel, vo } /** + * Writes a ScopedFileDescriptor object inside a std::vector<ScopedFileDescriptor> at index 'index' + * to 'parcel'. + */ +template <> +inline binder_status_t AParcel_writeStdVectorParcelableElement<ScopedFileDescriptor>( + AParcel* parcel, const void* vectorData, size_t index) { + const std::vector<ScopedFileDescriptor>* vector = + static_cast<const std::vector<ScopedFileDescriptor>*>(vectorData); + int writeFd = vector->at(index).get(); + if (writeFd < 0) { + return STATUS_UNEXPECTED_NULL; + } + return AParcel_writeParcelFileDescriptor(parcel, writeFd); +} + +/** + * Reads a ScopedFileDescriptor object inside a std::vector<ScopedFileDescriptor> at index 'index' + * from 'parcel'. + */ +template <> +inline binder_status_t AParcel_readStdVectorParcelableElement<ScopedFileDescriptor>( + const AParcel* parcel, void* vectorData, size_t index) { + std::vector<ScopedFileDescriptor>* vector = + static_cast<std::vector<ScopedFileDescriptor>*>(vectorData); + int readFd; + binder_status_t status = AParcel_readParcelFileDescriptor(parcel, &readFd); + if (status == STATUS_OK) { + if (readFd < 0) { + return STATUS_UNEXPECTED_NULL; + } + vector->at(index).set(readFd); + } + return status; +} + +/** * Convenience API for writing a std::vector<P> */ template <typename P> diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 8049b6121b..5b1abec22f 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -509,9 +509,9 @@ private: using RefreshRateType = scheduler::RefreshRateConfigs::RefreshRateType; struct ActiveConfigInfo { - RefreshRateType type; - int configId; - Scheduler::ConfigEvent event; + RefreshRateType type = RefreshRateType::DEFAULT; + int configId = 0; + Scheduler::ConfigEvent event = Scheduler::ConfigEvent::None; bool operator!=(const ActiveConfigInfo& other) const { return type != other.type || configId != other.configId || event != other.event; |