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