summaryrefslogtreecommitdiffstats
path: root/libs/binder/BpBinder.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-05-27 14:34:50 -0700
committerMathias Agopian <mathias@google.com>2009-05-27 14:34:50 -0700
commit2da99bdaa1712f00525e6a84b58044332cb1baef (patch)
treeed330500de06dc645769ea87372fb624390b52a8 /libs/binder/BpBinder.cpp
parent947f4f4d384ea26eb2145cc070a3eed42c59534a (diff)
parentcc77841f643751fd9f128e90f7d1587445ef353e (diff)
downloadframeworks_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.cpp33
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