Loading libs/binder/BpBinder.cpp +16 −2 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ namespace android { Mutex BpBinder::sTrackingLock; std::unordered_map<int32_t, uint32_t> BpBinder::sTrackingMap; std::unordered_map<int32_t, uint32_t> sLastLimitCallbackMap; int BpBinder::sNumTrackedUids = 0; std::atomic_bool BpBinder::sCountByUidEnabled(false); binder_proxy_limit_callback BpBinder::sLimitCallback; Loading Loading @@ -117,12 +118,24 @@ sp<BpBinder> BpBinder::create(int32_t handle) { if (sBinderProxyThrottleCreate) { return nullptr; } trackedValue = trackedValue & COUNTING_VALUE_MASK; uint32_t lastLimitCallbackAt = sLastLimitCallbackMap[trackedUid]; if (trackedValue > lastLimitCallbackAt && (trackedValue - lastLimitCallbackAt > sBinderProxyCountHighWatermark)) { ALOGE("Still too many binder proxy objects sent to uid %d from uid %d (%d proxies " "held)", getuid(), trackedUid, trackedValue); if (sLimitCallback) sLimitCallback(trackedUid); sLastLimitCallbackMap[trackedUid] = trackedValue; } } else { if ((trackedValue & COUNTING_VALUE_MASK) >= sBinderProxyCountHighWatermark) { ALOGE("Too many binder proxy objects sent to uid %d from uid %d (%d proxies held)", getuid(), trackedUid, trackedValue); sTrackingMap[trackedUid] |= LIMIT_REACHED_MASK; if (sLimitCallback) sLimitCallback(trackedUid); sLastLimitCallbackMap[trackedUid] = trackedValue & COUNTING_VALUE_MASK; if (sBinderProxyThrottleCreate) { ALOGI("Throttling binder proxy creates from uid %d in uid %d until binder proxy" " count drops below %d", Loading Loading @@ -452,8 +465,9 @@ BpBinder::~BpBinder() ((trackedValue & COUNTING_VALUE_MASK) <= sBinderProxyCountLowWatermark) )) { ALOGI("Limit reached bit reset for uid %d (fewer than %d proxies from uid %d held)", getuid(), mTrackedUid, sBinderProxyCountLowWatermark); getuid(), sBinderProxyCountLowWatermark, mTrackedUid); sTrackingMap[mTrackedUid] &= ~LIMIT_REACHED_MASK; sLastLimitCallbackMap.erase(mTrackedUid); } if (--sTrackingMap[mTrackedUid] == 0) { sTrackingMap.erase(mTrackedUid); Loading Loading
libs/binder/BpBinder.cpp +16 −2 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ namespace android { Mutex BpBinder::sTrackingLock; std::unordered_map<int32_t, uint32_t> BpBinder::sTrackingMap; std::unordered_map<int32_t, uint32_t> sLastLimitCallbackMap; int BpBinder::sNumTrackedUids = 0; std::atomic_bool BpBinder::sCountByUidEnabled(false); binder_proxy_limit_callback BpBinder::sLimitCallback; Loading Loading @@ -117,12 +118,24 @@ sp<BpBinder> BpBinder::create(int32_t handle) { if (sBinderProxyThrottleCreate) { return nullptr; } trackedValue = trackedValue & COUNTING_VALUE_MASK; uint32_t lastLimitCallbackAt = sLastLimitCallbackMap[trackedUid]; if (trackedValue > lastLimitCallbackAt && (trackedValue - lastLimitCallbackAt > sBinderProxyCountHighWatermark)) { ALOGE("Still too many binder proxy objects sent to uid %d from uid %d (%d proxies " "held)", getuid(), trackedUid, trackedValue); if (sLimitCallback) sLimitCallback(trackedUid); sLastLimitCallbackMap[trackedUid] = trackedValue; } } else { if ((trackedValue & COUNTING_VALUE_MASK) >= sBinderProxyCountHighWatermark) { ALOGE("Too many binder proxy objects sent to uid %d from uid %d (%d proxies held)", getuid(), trackedUid, trackedValue); sTrackingMap[trackedUid] |= LIMIT_REACHED_MASK; if (sLimitCallback) sLimitCallback(trackedUid); sLastLimitCallbackMap[trackedUid] = trackedValue & COUNTING_VALUE_MASK; if (sBinderProxyThrottleCreate) { ALOGI("Throttling binder proxy creates from uid %d in uid %d until binder proxy" " count drops below %d", Loading Loading @@ -452,8 +465,9 @@ BpBinder::~BpBinder() ((trackedValue & COUNTING_VALUE_MASK) <= sBinderProxyCountLowWatermark) )) { ALOGI("Limit reached bit reset for uid %d (fewer than %d proxies from uid %d held)", getuid(), mTrackedUid, sBinderProxyCountLowWatermark); getuid(), sBinderProxyCountLowWatermark, mTrackedUid); sTrackingMap[mTrackedUid] &= ~LIMIT_REACHED_MASK; sLastLimitCallbackMap.erase(mTrackedUid); } if (--sTrackingMap[mTrackedUid] == 0) { sTrackingMap.erase(mTrackedUid); Loading