| /** |
| * 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 WATCHDOG_SERVER_SRC_WATCHDOGBINDERMEDIATOR_H_ |
| #define WATCHDOG_SERVER_SRC_WATCHDOGBINDERMEDIATOR_H_ |
| |
| #include <android-base/result.h> |
| #include <android/automotive/watchdog/BnCarWatchdog.h> |
| #include <android/automotive/watchdog/StateType.h> |
| #include <binder/IBinder.h> |
| #include <binder/Status.h> |
| #include <gtest/gtest_prod.h> |
| #include <utils/Errors.h> |
| #include <utils/String16.h> |
| #include <utils/StrongPointer.h> |
| #include <utils/Vector.h> |
| |
| #include "IoPerfCollection.h" |
| #include "WatchdogProcessService.h" |
| |
| namespace android { |
| namespace automotive { |
| namespace watchdog { |
| |
| class ServiceManager; |
| |
| // WatchdogBinderMediator implements the carwatchdog binder APIs such that it forwards the calls |
| // either to process ANR service or I/O performance data collection. |
| class WatchdogBinderMediator : public BnCarWatchdog, public IBinder::DeathRecipient { |
| public: |
| WatchdogBinderMediator() : mWatchdogProcessService(nullptr), mIoPerfCollection(nullptr) {} |
| |
| status_t dump(int fd, const Vector<String16>& args) override; |
| binder::Status registerClient(const sp<ICarWatchdogClient>& client, |
| TimeoutLength timeout) override { |
| return mWatchdogProcessService->registerClient(client, timeout); |
| } |
| binder::Status unregisterClient(const sp<ICarWatchdogClient>& client) override { |
| return mWatchdogProcessService->unregisterClient(client); |
| } |
| binder::Status registerMediator(const sp<ICarWatchdogClient>& mediator) override; |
| binder::Status unregisterMediator(const sp<ICarWatchdogClient>& mediator) override; |
| binder::Status registerMonitor(const sp<ICarWatchdogMonitor>& monitor) override; |
| binder::Status unregisterMonitor(const sp<ICarWatchdogMonitor>& monitor) override; |
| binder::Status tellClientAlive(const sp<ICarWatchdogClient>& client, |
| int32_t sessionId) override { |
| return mWatchdogProcessService->tellClientAlive(client, sessionId); |
| } |
| binder::Status tellMediatorAlive(const sp<ICarWatchdogClient>& mediator, |
| const std::vector<int32_t>& clientsNotResponding, |
| int32_t sessionId) override { |
| return mWatchdogProcessService->tellMediatorAlive(mediator, clientsNotResponding, |
| sessionId); |
| } |
| binder::Status tellDumpFinished(const android::sp<ICarWatchdogMonitor>& monitor, |
| int32_t pid) override { |
| return mWatchdogProcessService->tellDumpFinished(monitor, pid); |
| } |
| binder::Status notifySystemStateChange(StateType type, int32_t arg1, int32_t arg2) override; |
| |
| protected: |
| android::base::Result<void> init(android::sp<WatchdogProcessService> watchdogProcessService, |
| android::sp<IoPerfCollection> ioPerfCollection); |
| void terminate() { |
| mWatchdogProcessService = nullptr; |
| mIoPerfCollection = nullptr; |
| } |
| |
| private: |
| void binderDied(const android::wp<IBinder>& who) override { |
| return mWatchdogProcessService->binderDied(who); |
| } |
| bool dumpHelpText(int fd, std::string errorMsg); |
| |
| android::sp<WatchdogProcessService> mWatchdogProcessService; |
| android::sp<IoPerfCollection> mIoPerfCollection; |
| |
| friend class ServiceManager; |
| friend class WatchdogBinderMediatorTest; |
| FRIEND_TEST(WatchdogBinderMediatorTest, TestErrorOnNullptrDuringInit); |
| FRIEND_TEST(WatchdogBinderMediatorTest, TestHandlesEmptyDumpArgs); |
| }; |
| |
| } // namespace watchdog |
| } // namespace automotive |
| } // namespace android |
| |
| #endif // WATCHDOG_SERVER_SRC_WATCHDOGBINDERMEDIATOR_H_ |