/** * Copyright (c) 2020, 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. */ #ifndef CPP_WATCHDOG_SERVER_SRC_WATCHDOGSERVICEHELPER_H_ #define CPP_WATCHDOG_SERVER_SRC_WATCHDOGSERVICEHELPER_H_ #include "WatchdogProcessService.h" #include #include #include #include #include #include #include #include #include #include #include namespace android { namespace automotive { namespace watchdog { class ServiceManager; // Forward declaration for testing use only. namespace internal { class WatchdogServiceHelperPeer; } // namespace internal class IWatchdogServiceHelper : public android::IBinder::DeathRecipient { public: virtual android::binder::Status registerService( const android::sp< android::automotive::watchdog::internal::ICarWatchdogServiceForSystem>& service) = 0; virtual android::binder::Status unregisterService( const android::sp< android::automotive::watchdog::internal::ICarWatchdogServiceForSystem>& service) = 0; // Helper methods for APIs in ICarWatchdogServiceForSystem.aidl. virtual android::binder::Status checkIfAlive(const android::wp& who, int32_t sessionId, TimeoutLength timeout) const = 0; virtual android::binder::Status prepareProcessTermination( const android::wp& who) = 0; virtual android::binder::Status getPackageInfosForUids( const std::vector& uids, const std::vector& vendorPackagePrefixes, std::vector* packageInfos) = 0; virtual android::binder::Status latestIoOveruseStats( const std::vector& packageIoOveruseStats) = 0; virtual android::binder::Status resetResourceOveruseStats( const std::vector& packageNames) = 0; virtual android::binder::Status getTodayIoUsageStats( std::vector* userPackageIoUsageStats) = 0; protected: virtual android::base::Result init( const android::sp& watchdogProcessService) = 0; virtual void terminate() = 0; private: friend class ServiceManager; }; // WatchdogServiceHelper implements the helper functions for the outbound API requests to // the CarWatchdogService. This class doesn't handle the inbound APIs requests from // CarWatchdogService except the registration APIs. class WatchdogServiceHelper final : public IWatchdogServiceHelper { public: WatchdogServiceHelper() : mService(nullptr), mWatchdogProcessService(nullptr) {} ~WatchdogServiceHelper(); android::binder::Status registerService( const android::sp< android::automotive::watchdog::internal::ICarWatchdogServiceForSystem>& service) override; android::binder::Status unregisterService( const android::sp< android::automotive::watchdog::internal::ICarWatchdogServiceForSystem>& service) override; void binderDied(const android::wp& who) override; // Helper methods for ICarWatchdogServiceForSystem.aidl. android::binder::Status checkIfAlive(const android::wp& who, int32_t sessionId, TimeoutLength timeout) const override; android::binder::Status prepareProcessTermination( const android::wp& who) override; android::binder::Status getPackageInfosForUids( const std::vector& uids, const std::vector& vendorPackagePrefixes, std::vector* packageInfos); android::binder::Status latestIoOveruseStats( const std::vector& packageIoOveruseStats); android::binder::Status resetResourceOveruseStats(const std::vector& packageNames); android::binder::Status getTodayIoUsageStats( std::vector* userPackageIoUsageStats); protected: android::base::Result init( const android::sp& watchdogProcessService); void terminate(); private: void unregisterServiceLocked(); mutable std::shared_mutex mRWMutex; android::sp mService GUARDED_BY(mRWMutex); android::sp mWatchdogProcessService; friend class ServiceManager; // For unit tests. friend class internal::WatchdogServiceHelperPeer; FRIEND_TEST(WatchdogServiceHelperTest, TestInit); FRIEND_TEST(WatchdogServiceHelperTest, TestErrorOnInitWithErrorFromWatchdogProcessServiceRegistration); FRIEND_TEST(WatchdogServiceHelperTest, TestErrorOnInitWithNullWatchdogProcessServiceInstance); FRIEND_TEST(WatchdogServiceHelperTest, TestTerminate); }; } // namespace watchdog } // namespace automotive } // namespace android #endif // CPP_WATCHDOG_SERVER_SRC_WATCHDOGSERVICEHELPER_H_