diff options
author | Mathias Agopian <mathias@google.com> | 2009-05-27 14:34:50 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-05-27 14:34:50 -0700 |
commit | 2da99bdaa1712f00525e6a84b58044332cb1baef (patch) | |
tree | ed330500de06dc645769ea87372fb624390b52a8 /libs/binder/BpBinder.cpp | |
parent | 947f4f4d384ea26eb2145cc070a3eed42c59534a (diff) | |
parent | cc77841f643751fd9f128e90f7d1587445ef353e (diff) | |
download | frameworks_base-2da99bdaa1712f00525e6a84b58044332cb1baef.zip frameworks_base-2da99bdaa1712f00525e6a84b58044332cb1baef.tar.gz frameworks_base-2da99bdaa1712f00525e6a84b58044332cb1baef.tar.bz2 |
Merge commit 'goog/master' into merge_master
Conflicts:
include/ui/Rect.h
libs/ui/ISurfaceComposer.cpp
Diffstat (limited to 'libs/binder/BpBinder.cpp')
-rw-r--r-- | libs/binder/BpBinder.cpp | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp index 56bf413..5de87ec 100644 --- a/libs/binder/BpBinder.cpp +++ b/libs/binder/BpBinder.cpp @@ -98,16 +98,33 @@ BpBinder::BpBinder(int32_t handle) IPCThreadState::self()->incWeakHandle(handle); } -String16 BpBinder::getInterfaceDescriptor() const +bool BpBinder::isDescriptorCached() const { + Mutex::Autolock _l(mLock); + return mDescriptorCache.size() ? true : false; +} + +const String16& BpBinder::getInterfaceDescriptor() const { - String16 res; - Parcel send, reply; - status_t err = const_cast<BpBinder*>(this)->transact( - INTERFACE_TRANSACTION, send, &reply); - if (err == NO_ERROR) { - res = reply.readString16(); + if (isDescriptorCached() == false) { + Parcel send, reply; + // do the IPC without a lock held. + status_t err = const_cast<BpBinder*>(this)->transact( + INTERFACE_TRANSACTION, send, &reply); + if (err == NO_ERROR) { + String16 res(reply.readString16()); + Mutex::Autolock _l(mLock); + // mDescriptorCache could have been assigned while the lock was + // released. + if (mDescriptorCache.size() == 0) + mDescriptorCache = res; + } } - return res; + + // we're returning a reference to a non-static object here. Usually this + // is not something smart to do, however, with binder objects it is + // (usually) safe because they are reference-counted. + + return mDescriptorCache; } bool BpBinder::isBinderAlive() const |