diff options
Diffstat (limited to 'services/powermanager/PowerHintSessionWrapper.cpp')
| -rw-r--r-- | services/powermanager/PowerHintSessionWrapper.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/services/powermanager/PowerHintSessionWrapper.cpp b/services/powermanager/PowerHintSessionWrapper.cpp new file mode 100644 index 0000000000..930c7fa2b8 --- /dev/null +++ b/services/powermanager/PowerHintSessionWrapper.cpp @@ -0,0 +1,80 @@ +/* + * 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 |