19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_IPC_THREAD_STATE_H 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_IPC_THREAD_STATE_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h> 220795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/ProcessState.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WIN32_PROC 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int uid_t; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass IPCThreadState 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static IPCThreadState* self(); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ProcessState> process(); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t clearLastError(); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getCallingPid(); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getCallingUid(); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t clearCallingIdentity(); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void restoreCallingIdentity(int64_t token); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void flushCommands(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void joinThreadPool(bool isMain = true); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stop the local process. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopProcess(bool immediate = true); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t transact(int32_t handle, 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply, uint32_t flags); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void incStrongHandle(int32_t handle); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void decStrongHandle(int32_t handle); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void incWeakHandle(int32_t handle); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void decWeakHandle(int32_t handle); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t attemptIncStrongHandle(int32_t handle); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void expungeHandle(int32_t handle, IBinder* binder); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t requestDeathNotification( int32_t handle, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpBinder* proxy); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t clearDeathNotification( int32_t handle, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpBinder* proxy); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void shutdown(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn // Call this to disable switching threads to background scheduling when 72887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn // receiving incoming IPC calls. This is specifically here for the 73887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn // Android system process, since it expects to have background apps calling 74887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn // in to it but doesn't want to acquire locks in its services while in 75887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn // the background. 76887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn static void disableBackgroundScheduling(bool disable); 77887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~IPCThreadState(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t sendReply(const Parcel& reply, uint32_t flags); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t waitForResponse(Parcel *reply, 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *acquireResult=NULL); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t talkWithDriver(bool doReceive=true); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t writeTransactionData(int32_t cmd, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t binderFlags, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t handle, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Parcel& data, 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t* statusBuffer); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t executeCommand(int32_t command); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearCaller(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void threadDestructor(void *st); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void freeBuffer(Parcel* parcel, 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint8_t* data, size_t dataSize, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t* objects, size_t objectsSize, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* cookie); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<ProcessState> mProcess; 103887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn const pid_t mMyThreadId; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<BBinder*> mPendingStrongDerefs; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<RefBase::weakref_type*> mPendingWeakDerefs; 106887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel mIn; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel mOut; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t mLastError; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t mCallingPid; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid_t mCallingUid; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_IPC_THREAD_STATE_H 119