1dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/*
2dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Copyright (C) 2016 The Android Open Source Project
3dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
4dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * you may not use this file except in compliance with the License.
6dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * You may obtain a copy of the License at
7dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
8dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
10dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * See the License for the specific language governing permissions and
14dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * limitations under the License.
15dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber */
16dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
17dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#ifndef ANDROID_OS_HW_REMOTE_BINDER_H
18dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#define ANDROID_OS_HW_REMOTE_BINDER_H
19dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
20dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <android-base/macros.h>
21dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <hwbinder/Binder.h>
22dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <jni.h>
23727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen#include <utils/List.h>
24727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen#include <utils/Mutex.h>
25dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#include <utils/RefBase.h>
26dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
27dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Hubernamespace android {
28dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
29727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen// Per-IBinder death recipient bookkeeping.  This is how we reconcile local jobject
30727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen// death recipient references passed in through JNI with the permanent corresponding
31727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen// HwBinderDeathRecipient objects.
32727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen
33727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenenclass HwBinderDeathRecipient;
34727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen
35727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenenclass HwBinderDeathRecipientList : public RefBase {
36727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    List< sp<HwBinderDeathRecipient> > mList;
37727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    Mutex mLock;
38727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen
39727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenenpublic:
40727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    HwBinderDeathRecipientList();
41727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    ~HwBinderDeathRecipientList();
42727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen
43727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    void add(const sp<HwBinderDeathRecipient>& recipient);
44727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    void remove(const sp<HwBinderDeathRecipient>& recipient);
45727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    sp<HwBinderDeathRecipient> find(jobject recipient);
46727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen
47727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    Mutex& lock();  // Use with care; specifically for mutual exclusion during binder death
48727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen};
49727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen
50dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberstruct JHwRemoteBinder : public RefBase {
51dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    static void InitClass(JNIEnv *env);
52dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
53dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    static sp<JHwRemoteBinder> SetNativeContext(
54dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            JNIEnv *env, jobject thiz, const sp<JHwRemoteBinder> &context);
55dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
56dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    static sp<JHwRemoteBinder> GetNativeContext(JNIEnv *env, jobject thiz);
57dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
58dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    static jobject NewObject(JNIEnv *env, const sp<hardware::IBinder> &binder);
59dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
60dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    JHwRemoteBinder(
61dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber            JNIEnv *env, jobject thiz, const sp<hardware::IBinder> &binder);
62dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
63727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    sp<hardware::IBinder> getBinder() const;
64dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    void setBinder(const sp<hardware::IBinder> &binder);
65727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    sp<HwBinderDeathRecipientList> getDeathRecipientList() const;
66dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
67dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberprotected:
68dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    virtual ~JHwRemoteBinder();
69dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
70dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberprivate:
71dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    jobject mObject;
72dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
73dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    sp<hardware::IBinder> mBinder;
74727f7bf84f28765608548a6afe8f54c43a4ccf64Martijn Coenen    sp<HwBinderDeathRecipientList> mDeathRecipientList;
75dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    DISALLOW_COPY_AND_ASSIGN(JHwRemoteBinder);
76dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber};
77dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
78dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberint register_android_os_HwRemoteBinder(JNIEnv *env);
79dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
80dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}  // namespace android
81dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
82dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber#endif  // ANDROID_OS_HW_REMOTE_BINDER_H
83dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
84