am 3bc64a2c: Merge change 6088 into donut

Merge commit '3bc64a2cb97da7bf7dc203416ad6c7d86c5925fc'

* commit '3bc64a2cb97da7bf7dc203416ad6c7d86c5925fc':
  WifiManager: Limit the number of WifiLocks that can be active simultaneously.
This commit is contained in:
Android (Google) Code Review
2009-07-06 09:12:56 -07:00
committed by The Android Open Source Project

View File

@@ -253,6 +253,15 @@ public class WifiManager {
IWifiManager mService;
Handler mHandler;
/* Maximum number of active locks we allow.
* This limit was added to prevent apps from creating a ridiculous number
* of locks and crashing the system by overflowing the global ref table.
*/
private static final int MAX_ACTIVE_LOCKS = 50;
/* Number of currently active WifiLocks and MulticastLocks */
private int mActiveLockCount;
/**
* Create a new WifiManager instance.
* Applications will almost always want to use
@@ -703,6 +712,14 @@ public class WifiManager {
if (mRefCounted ? (++mRefCount > 0) : (!mHeld)) {
try {
mService.acquireWifiLock(mBinder, mLockType, mTag);
synchronized (WifiManager.this) {
if (mActiveLockCount >= MAX_ACTIVE_LOCKS) {
mService.releaseWifiLock(mBinder);
throw new UnsupportedOperationException(
"Exceeded maximum number of wifi locks");
}
mActiveLockCount++;
}
} catch (RemoteException ignore) {
}
mHeld = true;
@@ -727,6 +744,9 @@ public class WifiManager {
if (mRefCounted ? (--mRefCount == 0) : (mHeld)) {
try {
mService.releaseWifiLock(mBinder);
synchronized (WifiManager.this) {
mActiveLockCount--;
}
} catch (RemoteException ignore) {
}
mHeld = false;
@@ -784,6 +804,9 @@ public class WifiManager {
if (mHeld) {
try {
mService.releaseWifiLock(mBinder);
synchronized (WifiManager.this) {
mActiveLockCount--;
}
} catch (RemoteException ignore) {
}
}
@@ -878,6 +901,14 @@ public class WifiManager {
if (!mHeld) {
try {
mService.acquireMulticastLock(mBinder, mTag);
synchronized (WifiManager.this) {
if (mActiveLockCount >= MAX_ACTIVE_LOCKS) {
mService.releaseMulticastLock();
throw new UnsupportedOperationException(
"Exceeded maximum number of wifi locks");
}
mActiveLockCount++;
}
mHeld = true;
} catch (RemoteException ignore) {
}
@@ -902,6 +933,9 @@ public class WifiManager {
if (mHeld) {
try {
mService.releaseMulticastLock();
synchronized (WifiManager.this) {
mActiveLockCount--;
}
mHeld = false;
} catch (RemoteException ignore) {
}