IPCThreadState.h revision 702ea9d42f52fc145090c0f0bfbe64993e4b8b33
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();
43702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick
44702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick            void                setStrictModePolicy(int32_t policy);
45702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick            int32_t             getStrictModePolicy() const;
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int64_t             clearCallingIdentity();
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                restoreCallingIdentity(int64_t token);
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                flushCommands();
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                joinThreadPool(bool isMain = true);
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Stop the local process.
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                stopProcess(bool immediate = true);
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            transact(int32_t handle,
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                         uint32_t code, const Parcel& data,
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                         Parcel* reply, uint32_t flags);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                incStrongHandle(int32_t handle);
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                decStrongHandle(int32_t handle);
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                incWeakHandle(int32_t handle);
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                decWeakHandle(int32_t handle);
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            attemptIncStrongHandle(int32_t handle);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                expungeHandle(int32_t handle, IBinder* binder);
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            requestDeathNotification(   int32_t handle,
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                            BpBinder* proxy);
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            clearDeathNotification( int32_t handle,
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                        BpBinder* proxy);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                shutdown();
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
748c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // Call this to disable switching threads to background scheduling when
758c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // receiving incoming IPC calls.  This is specifically here for the
768c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // Android system process, since it expects to have background apps calling
778c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // in to it but doesn't want to acquire locks in its services while in
788c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    // the background.
798c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    static  void                disableBackgroundScheduling(bool disable);
808c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                IPCThreadState();
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ~IPCThreadState();
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            sendReply(const Parcel& reply, uint32_t flags);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            waitForResponse(Parcel *reply,
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                status_t *acquireResult=NULL);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            talkWithDriver(bool doReceive=true);
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            writeTransactionData(int32_t cmd,
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     uint32_t binderFlags,
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     int32_t handle,
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     uint32_t code,
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     const Parcel& data,
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                                     status_t* statusBuffer);
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            executeCommand(int32_t command);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                clearCaller();
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                threadDestructor(void *st);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static  void                freeBuffer(Parcel* parcel,
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           const uint8_t* data, size_t dataSize,
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           const size_t* objects, size_t objectsSize,
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           void* cookie);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const   sp<ProcessState>    mProcess;
1068c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn    const   pid_t               mMyThreadId;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<BBinder*>    mPendingStrongDerefs;
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<RefBase::weakref_type*> mPendingWeakDerefs;
1098c6cedc9bc9a4b69616a79a95449f6f6b08c7bf1Dianne Hackborn
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Parcel              mIn;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Parcel              mOut;
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t            mLastError;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pid_t               mCallingPid;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uid_t               mCallingUid;
115702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick            int32_t             mStrictModePolicy;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
117702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_IPC_THREAD_STATE_H
123