summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2014-11-14 01:43:31 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-11-14 01:43:31 +0000
commit1f3ac8b42ff784930d8194b75d33aef1098a8231 (patch)
tree82145feeb77b33e82e36d095ec3bf2ed4345bb08
parent35e5423d4df88e8a0d0b4a7d4ca723e43a3bf35c (diff)
parenta4cff88d80bf1acbdbd063af88ecad83a8b9b7b4 (diff)
downloadframeworks_native-1f3ac8b42ff784930d8194b75d33aef1098a8231.zip
frameworks_native-1f3ac8b42ff784930d8194b75d33aef1098a8231.tar.gz
frameworks_native-1f3ac8b42ff784930d8194b75d33aef1098a8231.tar.bz2
am a4cff88d: Fix issue #18356768: some app process may hang at Runtime#exit...
* commit 'a4cff88d80bf1acbdbd063af88ecad83a8b9b7b4': Fix issue #18356768: some app process may hang at Runtime#exit...
-rw-r--r--include/private/binder/Static.h5
-rw-r--r--libs/binder/Parcel.cpp36
-rw-r--r--libs/binder/Static.cpp6
3 files changed, 22 insertions, 25 deletions
diff --git a/include/private/binder/Static.h b/include/private/binder/Static.h
index eeb37d7..d104646 100644
--- a/include/private/binder/Static.h
+++ b/include/private/binder/Static.h
@@ -34,11 +34,6 @@ extern Vector<int32_t> gTextBuffers;
extern Mutex gProcessMutex;
extern sp<ProcessState> gProcess;
-// For Parcel.cpp
-extern Mutex gParcelGlobalAllocSizeLock;
-extern size_t gParcelGlobalAllocSize;
-extern size_t gParcelGlobalAllocCount;
-
// For IServiceManager.cpp
extern Mutex gDefaultServiceManagerLock;
extern sp<IServiceManager> gDefaultServiceManager;
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 98a3dd7..e7589b1 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -75,6 +75,10 @@ struct small_flat_data
namespace android {
+static pthread_mutex_t gParcelGlobalAllocSizeLock = PTHREAD_MUTEX_INITIALIZER;
+static size_t gParcelGlobalAllocSize = 0;
+static size_t gParcelGlobalAllocCount = 0;
+
void acquire_object(const sp<ProcessState>& proc,
const flat_binder_object& obj, const void* who)
{
@@ -305,13 +309,17 @@ Parcel::~Parcel()
}
size_t Parcel::getGlobalAllocSize() {
- AutoMutex _l(gParcelGlobalAllocSizeLock);
- return gParcelGlobalAllocSize;
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
+ size_t size = gParcelGlobalAllocSize;
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
+ return size;
}
size_t Parcel::getGlobalAllocCount() {
- AutoMutex _l(gParcelGlobalAllocSizeLock);
- return gParcelGlobalAllocCount;
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
+ size_t count = gParcelGlobalAllocCount;
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
+ return count;
}
const uint8_t* Parcel::data() const
@@ -1511,10 +1519,10 @@ void Parcel::freeDataNoInit()
releaseObjects();
if (mData) {
LOG_ALLOC("Parcel %p: freeing with %zu capacity", this, mDataCapacity);
- gParcelGlobalAllocSizeLock.lock();
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
gParcelGlobalAllocSize -= mDataCapacity;
gParcelGlobalAllocCount--;
- gParcelGlobalAllocSizeLock.unlock();
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
free(mData);
}
if (mObjects) free(mObjects);
@@ -1546,10 +1554,10 @@ status_t Parcel::restartWrite(size_t desired)
if (data) {
LOG_ALLOC("Parcel %p: restart from %zu to %zu capacity", this, mDataCapacity, desired);
- gParcelGlobalAllocSizeLock.lock();
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
gParcelGlobalAllocSize += desired;
gParcelGlobalAllocSize -= mDataCapacity;
- gParcelGlobalAllocSizeLock.unlock();
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
mData = data;
mDataCapacity = desired;
}
@@ -1630,10 +1638,10 @@ status_t Parcel::continueWrite(size_t desired)
mOwner = NULL;
LOG_ALLOC("Parcel %p: taking ownership of %zu capacity", this, desired);
- gParcelGlobalAllocSizeLock.lock();
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
gParcelGlobalAllocSize += desired;
gParcelGlobalAllocCount++;
- gParcelGlobalAllocSizeLock.unlock();
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
mData = data;
mObjects = objects;
@@ -1671,10 +1679,10 @@ status_t Parcel::continueWrite(size_t desired)
if (data) {
LOG_ALLOC("Parcel %p: continue from %zu to %zu capacity", this, mDataCapacity,
desired);
- gParcelGlobalAllocSizeLock.lock();
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
gParcelGlobalAllocSize += desired;
gParcelGlobalAllocSize -= mDataCapacity;
- gParcelGlobalAllocSizeLock.unlock();
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
mData = data;
mDataCapacity = desired;
} else if (desired > mDataCapacity) {
@@ -1706,10 +1714,10 @@ status_t Parcel::continueWrite(size_t desired)
}
LOG_ALLOC("Parcel %p: allocating with %zu capacity", this, desired);
- gParcelGlobalAllocSizeLock.lock();
+ pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
gParcelGlobalAllocSize += desired;
gParcelGlobalAllocCount++;
- gParcelGlobalAllocSizeLock.unlock();
+ pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
mData = data;
mDataSize = mDataPos = 0;
diff --git a/libs/binder/Static.cpp b/libs/binder/Static.cpp
index b870c34..cd9509f 100644
--- a/libs/binder/Static.cpp
+++ b/libs/binder/Static.cpp
@@ -90,12 +90,6 @@ public:
static LibBinderIPCtStatics gIPCStatics;
-// ------------ Parcel.cpp
-
-Mutex gParcelGlobalAllocSizeLock;
-size_t gParcelGlobalAllocSize = 0;
-size_t gParcelGlobalAllocCount = 0;
-
// ------------ IServiceManager.cpp
Mutex gDefaultServiceManagerLock;