IPCThreadState.h revision 8c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_IPC_THREAD_STATE_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_IPC_THREAD_STATE_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
21c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h>
22c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/ProcessState.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Vector.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_WIN32_PROC
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttypedef  int  uid_t;
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass IPCThreadState
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  IPCThreadState*     self();
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<ProcessState>    process();
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            clearLastError();
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int                 getCallingPid();
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int                 getCallingUid();
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int64_t             clearCallingIdentity();
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                restoreCallingIdentity(int64_t token);
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                flushCommands();
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                joinThreadPool(bool isMain = true);
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Stop the local process.
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                stopProcess(bool immediate = true);
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            transact(int32_t handle,
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                         uint32_t code, const Parcel& data,
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                         Parcel* reply, uint32_t flags);
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                incStrongHandle(int32_t handle);
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                decStrongHandle(int32_t handle);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                incWeakHandle(int32_t handle);
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                decWeakHandle(int32_t handle);
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            attemptIncStrongHandle(int32_t handle);
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                expungeHandle(int32_t handle, IBinder* binder);
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            requestDeathNotification(   int32_t handle,
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                            BpBinder* proxy);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            clearDeathNotification( int32_t handle,
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                        BpBinder* proxy);
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                shutdown();
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
718c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // Call this to disable switching threads to background scheduling when
728c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // receiving incoming IPC calls.  This is specifically here for the
738c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // Android system process, since it expects to have background apps calling
748c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // in to it but doesn't want to acquire locks in its services while in
758c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // the background.
768c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    static  void                disableBackgroundScheduling(bool disable);
778c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                IPCThreadState();
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ~IPCThreadState();
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            sendReply(const Parcel& reply, uint32_t flags);
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            waitForResponse(Parcel *reply,
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                status_t *acquireResult=NULL);
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            talkWithDriver(bool doReceive=true);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            writeTransactionData(int32_t cmd,
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     uint32_t binderFlags,
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     int32_t handle,
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     uint32_t code,
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     const Parcel& data,
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     status_t* statusBuffer);
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            executeCommand(int32_t command);
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                clearCaller();
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                threadDestructor(void *st);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                freeBuffer(Parcel* parcel,
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           const uint8_t* data, size_t dataSize,
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           const size_t* objects, size_t objectsSize,
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           void* cookie);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const   sp<ProcessState>    mProcess;
1038c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    const   pid_t               mMyThreadId;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<BBinder*>    mPendingStrongDerefs;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<RefBase::weakref_type*> mPendingWeakDerefs;
1068c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Parcel              mIn;
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Parcel              mOut;
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            mLastError;
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pid_t               mCallingPid;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uid_t               mCallingUid;
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_IPC_THREAD_STATE_H
119