Merge "libbinder: avoid attached objects for stability"
This commit is contained in:
commit
1ed44fd5bb
5 changed files with 34 additions and 9 deletions
|
@ -141,7 +141,7 @@ public:
|
|||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
BBinder::BBinder() : mExtras(nullptr)
|
||||
BBinder::BBinder() : mExtras(nullptr), mStability(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -138,6 +138,7 @@ BpBinder* BpBinder::create(int32_t handle) {
|
|||
|
||||
BpBinder::BpBinder(int32_t handle, int32_t trackedUid)
|
||||
: mHandle(handle)
|
||||
, mStability(0)
|
||||
, mAlive(1)
|
||||
, mObitsSent(0)
|
||||
, mObituaries(nullptr)
|
||||
|
|
|
@ -15,6 +15,9 @@
|
|||
*/
|
||||
#include <binder/Stability.h>
|
||||
|
||||
#include <binder/BpBinder.h>
|
||||
#include <binder/Binder.h>
|
||||
|
||||
namespace android {
|
||||
namespace internal {
|
||||
|
||||
|
@ -78,11 +81,12 @@ status_t Stability::set(IBinder* binder, int32_t stability, bool log) {
|
|||
|
||||
if (currentStability == stability) return OK;
|
||||
|
||||
binder->attachObject(
|
||||
reinterpret_cast<void*>(&Stability::get),
|
||||
reinterpret_cast<void*>(stability),
|
||||
nullptr /*cleanupCookie*/,
|
||||
nullptr /*cleanup function*/);
|
||||
BBinder* local = binder->localBinder();
|
||||
if (local != nullptr) {
|
||||
local->mStability = static_cast<int32_t>(stability);
|
||||
} else {
|
||||
binder->remoteBinder()->mStability = static_cast<int32_t>(stability);
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
@ -90,8 +94,12 @@ status_t Stability::set(IBinder* binder, int32_t stability, bool log) {
|
|||
Stability::Level Stability::get(IBinder* binder) {
|
||||
if (binder == nullptr) return UNDECLARED;
|
||||
|
||||
return static_cast<Level>(reinterpret_cast<intptr_t>(
|
||||
binder->findObject(reinterpret_cast<void*>(&Stability::get))));
|
||||
BBinder* local = binder->localBinder();
|
||||
if (local != nullptr) {
|
||||
return static_cast<Stability::Level>(local->mStability);
|
||||
}
|
||||
|
||||
return static_cast<Stability::Level>(binder->remoteBinder()->mStability);
|
||||
}
|
||||
|
||||
bool Stability::check(int32_t provided, Level required) {
|
||||
|
|
|
@ -24,6 +24,10 @@
|
|||
// ---------------------------------------------------------------------------
|
||||
namespace android {
|
||||
|
||||
namespace internal {
|
||||
class Stability;
|
||||
}
|
||||
|
||||
class BBinder : public IBinder
|
||||
{
|
||||
public:
|
||||
|
@ -88,7 +92,12 @@ private:
|
|||
Extras* getOrCreateExtras();
|
||||
|
||||
std::atomic<Extras*> mExtras;
|
||||
void* mReserved0;
|
||||
|
||||
friend ::android::internal::Stability;
|
||||
union {
|
||||
int32_t mStability;
|
||||
void* mReserved0;
|
||||
};
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
// ---------------------------------------------------------------------------
|
||||
namespace android {
|
||||
|
||||
namespace internal {
|
||||
class Stability;
|
||||
};
|
||||
|
||||
using binder_proxy_limit_callback = void(*)(int);
|
||||
|
||||
class BpBinder : public IBinder
|
||||
|
@ -116,6 +120,9 @@ protected:
|
|||
private:
|
||||
const int32_t mHandle;
|
||||
|
||||
friend ::android::internal::Stability;
|
||||
int32_t mStability;
|
||||
|
||||
struct Obituary {
|
||||
wp<DeathRecipient> recipient;
|
||||
void* cookie;
|
||||
|
|
Loading…
Reference in a new issue