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 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 @@
 
 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 @@
 }
 
 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 @@
         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 @@
 
     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 @@
         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 @@
             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 @@
         }
 
         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 @@
 
 static LibBinderIPCtStatics gIPCStatics;
 
-// ------------ Parcel.cpp
-
-Mutex gParcelGlobalAllocSizeLock;
-size_t gParcelGlobalAllocSize = 0;
-size_t gParcelGlobalAllocCount = 0;
-
 // ------------ IServiceManager.cpp
 
 Mutex gDefaultServiceManagerLock;
