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#define LOG_TAG "HalDeathHandler" 18d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov//#define LOG_NDEBUG 0 19d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 20d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <utils/Log.h> 21d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 22d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <media/audiohal/hidl/HalDeathHandler.h> 23d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 24d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovnamespace android { 25d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 26d621ac82e648c8ef395068edb1af2747f49b700aMikhail NaganovANDROID_SINGLETON_STATIC_INSTANCE(HalDeathHandler); 27d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 28d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov// static 29d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovsp<HalDeathHandler> HalDeathHandler::getInstance() { 30d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return &Singleton<HalDeathHandler>::getInstance(); 31d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} 32d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 33d621ac82e648c8ef395068edb1af2747f49b700aMikhail NaganovHalDeathHandler::HalDeathHandler() : mSelf(this) { 34d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} 35d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 36d621ac82e648c8ef395068edb1af2747f49b700aMikhail NaganovHalDeathHandler::~HalDeathHandler() { 37d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} 38d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 39d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovvoid HalDeathHandler::registerAtExitHandler(void* cookie, AtExitHandler handler) { 40d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov std::lock_guard<std::mutex> guard(mHandlersLock); 41d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov mHandlers.insert({cookie, handler}); 42d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} 43d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 44d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovvoid HalDeathHandler::unregisterAtExitHandler(void* cookie) { 45d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov std::lock_guard<std::mutex> guard(mHandlersLock); 46d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov mHandlers.erase(cookie); 47d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} 48d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 49d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganovvoid HalDeathHandler::serviceDied(uint64_t /*cookie*/, const wp<IBase>& /*who*/) { 50d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // No matter which of the service objects has died, 51d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // we need to run all the registered handlers and crash our process. 52d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov std::lock_guard<std::mutex> guard(mHandlersLock); 53d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov for (const auto& handler : mHandlers) { 54d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov handler.second(); 55d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov } 56d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov LOG_ALWAYS_FATAL("HAL server crashed, need to restart"); 57d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} 58d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov 59d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov} // namespace android 60