1d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov/* 2d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * Copyright (C) 2017 The Android Open Source Project 3d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * 4d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 5d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * you may not use this file except in compliance with the License. 6d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * You may obtain a copy of the License at 7d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * 8d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 9d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * 10d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * Unless required by applicable law or agreed to in writing, software 11d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 12d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * See the License for the specific language governing permissions and 14d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov * limitations under the License. 15d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov */ 16d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 17d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#ifndef ANDROID_HARDWARE_HIDL_HAL_DEATH_HANDLER_H 18d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#define ANDROID_HARDWARE_HIDL_HAL_DEATH_HANDLER_H 19d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 20d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <functional> 21d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <mutex> 22d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <unordered_map> 23d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 24d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <hidl/HidlSupport.h> 25d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <utils/Singleton.h> 26d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 27d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovusing android::hardware::hidl_death_recipient; 28d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovusing android::hidl::base::V1_0::IBase; 29d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 30d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovnamespace android { 31d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 32d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovclass HalDeathHandler : public hidl_death_recipient, private Singleton<HalDeathHandler> { 33d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov public: 34d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov typedef std::function<void()> AtExitHandler; 35d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 36d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // Note that the exit handler gets called using a thread from 37d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // RPC threadpool, thus it needs to be thread-safe. 38d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov void registerAtExitHandler(void* cookie, AtExitHandler handler); 39d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov void unregisterAtExitHandler(void* cookie); 40d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 41d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // hidl_death_recipient 42d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov virtual void serviceDied(uint64_t cookie, const wp<IBase>& who); 43d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 44d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // Used both for (un)registering handlers, and for passing to 45d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // '(un)linkToDeath'. 46d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov static sp<HalDeathHandler> getInstance(); 47d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 48d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov private: 49d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov friend class Singleton<HalDeathHandler>; 50d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov typedef std::unordered_map<void*, AtExitHandler> Handlers; 51d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 52d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov HalDeathHandler(); 53d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov virtual ~HalDeathHandler(); 54d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 55d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov sp<HalDeathHandler> mSelf; // Allows the singleton instance to live forever. 56d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov std::mutex mHandlersLock; 57d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov Handlers mHandlers; 58d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov}; 59d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 60d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} // namespace android 61d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 62d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#endif // ANDROID_HARDWARE_HIDL_HAL_DEATH_HANDLER_H 63