| /* | |
| * Copyright (C) 2024 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 <powermanager/PowerHintSessionWrapper.h> | |
| using namespace aidl::android::hardware::power; | |
| namespace android::power { | |
| // Caches support for a given call in a static variable, checking both | |
| // the return value and interface version. | |
| #define CACHE_SUPPORT(version, method) \ | |
| ({ \ | |
| static bool support = mInterfaceVersion >= version; \ | |
| !support ? decltype(method)::unsupported() : ({ \ | |
| auto result = method; \ | |
| if (result.isUnsupported()) { \ | |
| support = false; \ | |
| } \ | |
| std::move(result); \ | |
| }); \ | |
| }) | |
| #define CHECK_SESSION(resultType) \ | |
| if (mSession == nullptr) { \ | |
| return HalResult<resultType>::failed("Session not running"); \ | |
| } | |
| // FWD_CALL just forwards calls from the wrapper to the session object. | |
| // It only works if the call has no return object, as is the case with all calls | |
| // except getSessionConfig. | |
| #define FWD_CALL(version, name, args, untypedArgs) \ | |
| HalResult<void> PowerHintSessionWrapper::name args { \ | |
| CHECK_SESSION(void) \ | |
| return CACHE_SUPPORT(version, HalResult<void>::fromStatus(mSession->name untypedArgs)); \ | |
| } | |
| PowerHintSessionWrapper::PowerHintSessionWrapper(std::shared_ptr<IPowerHintSession>&& session) | |
| : mSession(session) { | |
| if (mSession != nullptr) { | |
| mSession->getInterfaceVersion(&mInterfaceVersion); | |
| } | |
| } | |
| // Support for individual hints/modes is not really handled here since there | |
| // is no way to check for it, so in the future if a way to check that is added, | |
| // this will need to be updated. | |
| FWD_CALL(2, updateTargetWorkDuration, (int64_t in_targetDurationNanos), (in_targetDurationNanos)); | |
| FWD_CALL(2, reportActualWorkDuration, (const std::vector<WorkDuration>& in_durations), | |
| (in_durations)); | |
| FWD_CALL(2, pause, (), ()); | |
| FWD_CALL(2, resume, (), ()); | |
| FWD_CALL(2, close, (), ()); | |
| FWD_CALL(4, sendHint, (SessionHint in_hint), (in_hint)); | |
| FWD_CALL(4, setThreads, (const std::vector<int32_t>& in_threadIds), (in_threadIds)); | |
| FWD_CALL(5, setMode, (SessionMode in_type, bool in_enabled), (in_type, in_enabled)); | |
| HalResult<SessionConfig> PowerHintSessionWrapper::getSessionConfig() { | |
| CHECK_SESSION(SessionConfig); | |
| SessionConfig config; | |
| return CACHE_SUPPORT(5, | |
| HalResult<SessionConfig>::fromStatus(mSession->getSessionConfig(&config), | |
| std::move(config))); | |
| } | |
| } // namespace android::power |