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