summaryrefslogtreecommitdiff
path: root/libs/binder/include/binder/IPCThreadState.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/binder/include/binder/IPCThreadState.h')
-rw-r--r--libs/binder/include/binder/IPCThreadState.h331
1 files changed, 162 insertions, 169 deletions
diff --git a/libs/binder/include/binder/IPCThreadState.h b/libs/binder/include/binder/IPCThreadState.h
index dc5b1a1712..09ab442c7d 100644
--- a/libs/binder/include/binder/IPCThreadState.h
+++ b/libs/binder/include/binder/IPCThreadState.h
@@ -16,9 +16,10 @@
#pragma once
-#include <utils/Errors.h>
+#include <binder/Common.h>
#include <binder/Parcel.h>
#include <binder/ProcessState.h>
+#include <utils/Errors.h>
#include <utils/Vector.h>
#if defined(_WIN32)
@@ -32,13 +33,12 @@ namespace android {
* Kernel binder thread state. All operations here refer to kernel binder. This
* object is allocated per-thread.
*/
-class IPCThreadState
-{
+class IPCThreadState {
public:
using CallRestriction = ProcessState::CallRestriction;
- static IPCThreadState* self();
- static IPCThreadState* selfOrNull(); // self(), but won't instantiate
+ LIBBINDER_EXPORTED static IPCThreadState* self();
+ LIBBINDER_EXPORTED static IPCThreadState* selfOrNull(); // self(), but won't instantiate
// Freeze or unfreeze the binder interface to a specific process. When freezing, this method
// will block up to timeout_ms to process pending transactions directed to pid. Unfreeze
@@ -52,182 +52,175 @@ public:
// binder transactions to be processed.
//
// returns: 0 in case of success, a value < 0 in case of error
- static status_t freeze(pid_t pid, bool enabled, uint32_t timeout_ms);
+ LIBBINDER_EXPORTED static status_t freeze(pid_t pid, bool enabled, uint32_t timeout_ms);
// Provide information about the state of a frozen process
- static status_t getProcessFreezeInfo(pid_t pid, uint32_t *sync_received,
- uint32_t *async_received);
-
- status_t clearLastError();
-
- /**
- * Returns the PID of the process which has made the current binder
- * call. If not in a binder call, this will return getpid.
- *
- * Warning: oneway transactions do not receive PID. Even if you expect
- * a transaction to be synchronous, a misbehaving client could send it
- * as an asynchronous call and result in a 0 PID here. Additionally, if
- * there is a race and the calling process dies, the PID may still be
- * 0 for a synchronous call.
- */
- [[nodiscard]] pid_t getCallingPid() const;
-
- /**
- * Returns the SELinux security identifier of the process which has
- * made the current binder call. If not in a binder call this will
- * return nullptr. If this isn't requested with
- * Binder::setRequestingSid, it will also return nullptr.
- *
- * This can't be restored once it's cleared, and it does not return the
- * context of the current process when not in a binder call.
- */
- [[nodiscard]] const char* getCallingSid() const;
-
- /**
- * Returns the UID of the process which has made the current binder
- * call. If not in a binder call, this will return 0.
- */
- [[nodiscard]] uid_t getCallingUid() const;
-
- /**
- * Make it an abort to rely on getCalling* for a section of
- * execution.
- *
- * Usage:
- * IPCThreadState::SpGuard guard {
- * .address = __builtin_frame_address(0),
- * .context = "...",
- * };
- * const auto* orig = pushGetCallingSpGuard(&guard);
- * {
- * // will abort if you call getCalling*, unless you are
- * // serving a nested binder transaction
- * }
- * restoreCallingSpGuard(orig);
- */
- struct SpGuard {
- const void* address;
- const char* context;
- };
- const SpGuard* pushGetCallingSpGuard(const SpGuard* guard);
- void restoreGetCallingSpGuard(const SpGuard* guard);
- /**
- * Used internally by getCalling*. Can also be used to assert that
- * you are in a binder context (getCalling* is valid). This is
- * intentionally not exposed as a boolean API since code should be
- * written to know its environment.
- */
- void checkContextIsBinderForUse(const char* use) const;
-
- void setStrictModePolicy(int32_t policy);
- int32_t getStrictModePolicy() const;
-
- // See Binder#setCallingWorkSourceUid in Binder.java.
- int64_t setCallingWorkSourceUid(uid_t uid);
- // Internal only. Use setCallingWorkSourceUid(uid) instead.
- int64_t setCallingWorkSourceUidWithoutPropagation(uid_t uid);
- // See Binder#getCallingWorkSourceUid in Binder.java.
- uid_t getCallingWorkSourceUid() const;
- // See Binder#clearCallingWorkSource in Binder.java.
- int64_t clearCallingWorkSource();
- // See Binder#restoreCallingWorkSource in Binder.java.
- void restoreCallingWorkSource(int64_t token);
- void clearPropagateWorkSource();
- bool shouldPropagateWorkSource() const;
-
- void setLastTransactionBinderFlags(int32_t flags);
- int32_t getLastTransactionBinderFlags() const;
-
- void setCallRestriction(CallRestriction restriction);
- CallRestriction getCallRestriction() const;
-
- int64_t clearCallingIdentity();
- // Restores PID/UID (not SID)
- void restoreCallingIdentity(int64_t token);
- bool hasExplicitIdentity();
-
- // For main functions - dangerous for libraries to use
- status_t setupPolling(int* fd);
- status_t handlePolledCommands();
- void flushCommands();
- bool flushIfNeeded();
-
- // Adds the current thread into the binder threadpool.
- //
- // This is in addition to any threads which are started
- // with startThreadPool. Libraries should not call this
- // function, as they may be loaded into processes which
- // try to configure the threadpool differently.
- void joinThreadPool(bool isMain = true);
-
- // Stop the local process.
- void stopProcess(bool immediate = true);
-
- status_t transact(int32_t handle,
- uint32_t code, const Parcel& data,
+ LIBBINDER_EXPORTED static status_t getProcessFreezeInfo(pid_t pid, uint32_t* sync_received,
+ uint32_t* async_received);
+
+ LIBBINDER_EXPORTED status_t clearLastError();
+
+ /**
+ * Returns the PID of the process which has made the current binder
+ * call. If not in a binder call, this will return getpid.
+ *
+ * Warning: oneway transactions do not receive PID. Even if you expect
+ * a transaction to be synchronous, a misbehaving client could send it
+ * as an asynchronous call and result in a 0 PID here. Additionally, if
+ * there is a race and the calling process dies, the PID may still be
+ * 0 for a synchronous call.
+ */
+ [[nodiscard]] LIBBINDER_EXPORTED pid_t getCallingPid() const;
+
+ /**
+ * Returns the SELinux security identifier of the process which has
+ * made the current binder call. If not in a binder call this will
+ * return nullptr. If this isn't requested with
+ * Binder::setRequestingSid, it will also return nullptr.
+ *
+ * This can't be restored once it's cleared, and it does not return the
+ * context of the current process when not in a binder call.
+ */
+ [[nodiscard]] LIBBINDER_EXPORTED const char* getCallingSid() const;
+
+ /**
+ * Returns the UID of the process which has made the current binder
+ * call. If not in a binder call, this will return 0.
+ */
+ [[nodiscard]] LIBBINDER_EXPORTED uid_t getCallingUid() const;
+
+ /**
+ * Make it an abort to rely on getCalling* for a section of
+ * execution.
+ *
+ * Usage:
+ * IPCThreadState::SpGuard guard {
+ * .address = __builtin_frame_address(0),
+ * .context = "...",
+ * };
+ * const auto* orig = pushGetCallingSpGuard(&guard);
+ * {
+ * // will abort if you call getCalling*, unless you are
+ * // serving a nested binder transaction
+ * }
+ * restoreCallingSpGuard(orig);
+ */
+ struct SpGuard {
+ const void* address;
+ const char* context;
+ };
+ LIBBINDER_EXPORTED const SpGuard* pushGetCallingSpGuard(const SpGuard* guard);
+ LIBBINDER_EXPORTED void restoreGetCallingSpGuard(const SpGuard* guard);
+ /**
+ * Used internally by getCalling*. Can also be used to assert that
+ * you are in a binder context (getCalling* is valid). This is
+ * intentionally not exposed as a boolean API since code should be
+ * written to know its environment.
+ */
+ LIBBINDER_EXPORTED void checkContextIsBinderForUse(const char* use) const;
+
+ LIBBINDER_EXPORTED void setStrictModePolicy(int32_t policy);
+ LIBBINDER_EXPORTED int32_t getStrictModePolicy() const;
+
+ // See Binder#setCallingWorkSourceUid in Binder.java.
+ LIBBINDER_EXPORTED int64_t setCallingWorkSourceUid(uid_t uid);
+ // Internal only. Use setCallingWorkSourceUid(uid) instead.
+ LIBBINDER_EXPORTED int64_t setCallingWorkSourceUidWithoutPropagation(uid_t uid);
+ // See Binder#getCallingWorkSourceUid in Binder.java.
+ LIBBINDER_EXPORTED uid_t getCallingWorkSourceUid() const;
+ // See Binder#clearCallingWorkSource in Binder.java.
+ LIBBINDER_EXPORTED int64_t clearCallingWorkSource();
+ // See Binder#restoreCallingWorkSource in Binder.java.
+ LIBBINDER_EXPORTED void restoreCallingWorkSource(int64_t token);
+ LIBBINDER_EXPORTED void clearPropagateWorkSource();
+ LIBBINDER_EXPORTED bool shouldPropagateWorkSource() const;
+
+ LIBBINDER_EXPORTED void setLastTransactionBinderFlags(int32_t flags);
+ LIBBINDER_EXPORTED int32_t getLastTransactionBinderFlags() const;
+
+ LIBBINDER_EXPORTED void setCallRestriction(CallRestriction restriction);
+ LIBBINDER_EXPORTED CallRestriction getCallRestriction() const;
+
+ LIBBINDER_EXPORTED int64_t clearCallingIdentity();
+ // Restores PID/UID (not SID)
+ LIBBINDER_EXPORTED void restoreCallingIdentity(int64_t token);
+ LIBBINDER_EXPORTED bool hasExplicitIdentity();
+
+ // For main functions - dangerous for libraries to use
+ LIBBINDER_EXPORTED status_t setupPolling(int* fd);
+ LIBBINDER_EXPORTED status_t handlePolledCommands();
+ LIBBINDER_EXPORTED void flushCommands();
+ LIBBINDER_EXPORTED bool flushIfNeeded();
+
+ // Adds the current thread into the binder threadpool.
+ //
+ // This is in addition to any threads which are started
+ // with startThreadPool. Libraries should not call this
+ // function, as they may be loaded into processes which
+ // try to configure the threadpool differently.
+ LIBBINDER_EXPORTED void joinThreadPool(bool isMain = true);
+
+ // Stop the local process.
+ LIBBINDER_EXPORTED void stopProcess(bool immediate = true);
+
+ LIBBINDER_EXPORTED status_t transact(int32_t handle, uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags);
- void incStrongHandle(int32_t handle, BpBinder *proxy);
- void decStrongHandle(int32_t handle);
- void incWeakHandle(int32_t handle, BpBinder *proxy);
- void decWeakHandle(int32_t handle);
- status_t attemptIncStrongHandle(int32_t handle);
- static void expungeHandle(int32_t handle, IBinder* binder);
- status_t requestDeathNotification( int32_t handle,
- BpBinder* proxy);
- status_t clearDeathNotification( int32_t handle,
- BpBinder* proxy);
+ LIBBINDER_EXPORTED void incStrongHandle(int32_t handle, BpBinder* proxy);
+ LIBBINDER_EXPORTED void decStrongHandle(int32_t handle);
+ LIBBINDER_EXPORTED void incWeakHandle(int32_t handle, BpBinder* proxy);
+ LIBBINDER_EXPORTED void decWeakHandle(int32_t handle);
+ LIBBINDER_EXPORTED status_t attemptIncStrongHandle(int32_t handle);
+ LIBBINDER_EXPORTED static void expungeHandle(int32_t handle, IBinder* binder);
+ LIBBINDER_EXPORTED status_t requestDeathNotification(int32_t handle, BpBinder* proxy);
+ LIBBINDER_EXPORTED status_t clearDeathNotification(int32_t handle, BpBinder* proxy);
- static void shutdown();
+ LIBBINDER_EXPORTED static void shutdown();
// Call this to disable switching threads to background scheduling when
// receiving incoming IPC calls. This is specifically here for the
// Android system process, since it expects to have background apps calling
// in to it but doesn't want to acquire locks in its services while in
// the background.
- static void disableBackgroundScheduling(bool disable);
- bool backgroundSchedulingDisabled();
-
- // Call blocks until the number of executing binder threads is less than
- // the maximum number of binder threads threads allowed for this process.
- void blockUntilThreadAvailable();
-
- // Service manager registration
- void setTheContextObject(const sp<BBinder>& obj);
-
- // WARNING: DO NOT USE THIS API
- //
- // Returns a pointer to the stack from the last time a transaction
- // was initiated by the kernel. Used to compare when making nested
- // calls between multiple different transports.
- const void* getServingStackPointer() const;
-
- // The work source represents the UID of the process we should attribute the transaction
- // to. We use -1 to specify that the work source was not set using #setWorkSource.
- //
- // This constant needs to be kept in sync with Binder.UNSET_WORKSOURCE from the Java
- // side.
- static const int32_t kUnsetWorkSource = -1;
+ LIBBINDER_EXPORTED static void disableBackgroundScheduling(bool disable);
+ LIBBINDER_EXPORTED bool backgroundSchedulingDisabled();
+
+ // Call blocks until the number of executing binder threads is less than
+ // the maximum number of binder threads threads allowed for this process.
+ LIBBINDER_EXPORTED void blockUntilThreadAvailable();
+
+ // Service manager registration
+ LIBBINDER_EXPORTED void setTheContextObject(const sp<BBinder>& obj);
+
+ // WARNING: DO NOT USE THIS API
+ //
+ // Returns a pointer to the stack from the last time a transaction
+ // was initiated by the kernel. Used to compare when making nested
+ // calls between multiple different transports.
+ LIBBINDER_EXPORTED const void* getServingStackPointer() const;
+
+ // The work source represents the UID of the process we should attribute the transaction
+ // to. We use -1 to specify that the work source was not set using #setWorkSource.
+ //
+ // This constant needs to be kept in sync with Binder.UNSET_WORKSOURCE from the Java
+ // side.
+ LIBBINDER_EXPORTED static const int32_t kUnsetWorkSource = -1;
+
private:
- IPCThreadState();
- ~IPCThreadState();
-
- status_t sendReply(const Parcel& reply, uint32_t flags);
- status_t waitForResponse(Parcel *reply,
- status_t *acquireResult=nullptr);
- status_t talkWithDriver(bool doReceive=true);
- status_t writeTransactionData(int32_t cmd,
- uint32_t binderFlags,
- int32_t handle,
- uint32_t code,
- const Parcel& data,
- status_t* statusBuffer);
- status_t getAndExecuteCommand();
- status_t executeCommand(int32_t command);
- void processPendingDerefs();
- void processPostWriteDerefs();
-
- void clearCaller();
+ IPCThreadState();
+ ~IPCThreadState();
+
+ status_t sendReply(const Parcel& reply, uint32_t flags);
+ status_t waitForResponse(Parcel* reply, status_t* acquireResult = nullptr);
+ status_t talkWithDriver(bool doReceive = true);
+ status_t writeTransactionData(int32_t cmd, uint32_t binderFlags, int32_t handle, uint32_t code,
+ const Parcel& data, status_t* statusBuffer);
+ status_t getAndExecuteCommand();
+ status_t executeCommand(int32_t command);
+ void processPendingDerefs();
+ void processPostWriteDerefs();
+
+ void clearCaller();
static void threadDestructor(void *st);
static void freeBuffer(const uint8_t* data, size_t dataSize, const binder_size_t* objects,