Files
hardware_interfaces/neuralnetworks/aidl/utils/src/Service.cpp
Michael Butler 20f76f3654 Configure Version value for each version of NN AIDL utils
Currently, there are two different versions of the NN AIDL utils:
* neuralnetworks_utils_hal_aidl_v1 (v1)
* neuralnetowrks_utils_hal_aidl (v2)

This change configures utils::kVersion to match the version of the
utility library that builds it.

Bug: N/A
Test: mma
Change-Id: I7d08bf50f76664702ec0828cc35a363eb29bdde3
2021-11-15 15:42:28 -08:00

90 lines
3.3 KiB
C++

/*
* Copyright (C) 2021 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 "Service.h"
#include <AndroidVersionUtil.h>
#include <aidl/android/hardware/neuralnetworks/IDevice.h>
#include <android/binder_auto_utils.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <nnapi/IDevice.h>
#include <nnapi/Result.h>
#include <nnapi/Types.h>
#include <nnapi/hal/ResilientDevice.h>
#include <string>
#include "Device.h"
#include "Utils.h"
namespace aidl::android::hardware::neuralnetworks::utils {
namespace {
// Map the AIDL version of an IDevice to NNAPI canonical feature level.
nn::GeneralResult<nn::Version> getAidlServiceFeatureLevel(IDevice* service) {
CHECK(service != nullptr);
int aidlVersion;
const auto ret = service->getInterfaceVersion(&aidlVersion);
HANDLE_ASTATUS(ret) << "getInterfaceVersion failed";
// For service AIDL versions greater than or equal to the AIDL library version that the runtime
// was built against, clamp it to the runtime AIDL library version.
aidlVersion = std::min(aidlVersion, IDevice::version);
// Map stable AIDL versions to canonical versions.
auto version = aidlVersionToCanonicalVersion(aidlVersion);
if (!version.has_value()) {
return NN_ERROR() << "Unknown AIDL service version: " << aidlVersion;
}
return version.value();
}
} // namespace
nn::GeneralResult<nn::SharedDevice> getDevice(const std::string& instanceName) {
auto fullName = std::string(IDevice::descriptor) + "/" + instanceName;
hal::utils::ResilientDevice::Factory makeDevice =
[instanceName,
name = std::move(fullName)](bool blocking) -> nn::GeneralResult<nn::SharedDevice> {
std::add_pointer_t<AIBinder*(const char*)> getService;
if (blocking) {
if (__builtin_available(android __NNAPI_AIDL_MIN_ANDROID_API__, *)) {
getService = AServiceManager_waitForService;
} else {
getService = AServiceManager_getService;
}
} else {
getService = AServiceManager_checkService;
}
auto service = IDevice::fromBinder(ndk::SpAIBinder(getService(name.c_str())));
if (service == nullptr) {
return NN_ERROR()
<< (blocking ? "AServiceManager_waitForService (or AServiceManager_getService)"
: "AServiceManager_checkService")
<< " returned nullptr";
}
ABinderProcess_startThreadPool();
const auto featureLevel = NN_TRY(getAidlServiceFeatureLevel(service.get()));
return Device::create(instanceName, std::move(service), featureLevel);
};
return hal::utils::ResilientDevice::create(std::move(makeDevice));
}
} // namespace aidl::android::hardware::neuralnetworks::utils