am 6ed0cfd3: am 5919ac6b: OBB: track binder death observers

Merge commit '6ed0cfd3e798e3014c9f1099631249463d25140c'

* commit '6ed0cfd3e798e3014c9f1099631249463d25140c':
  OBB: track binder death observers
This commit is contained in:
Kenny Root
2010-10-08 17:58:15 -07:00
committed by Android Git Automerger

View File

@@ -172,8 +172,6 @@ class MountService extends IMountService.Stub
this.token = token;
this.callerUid = callerUid;
mounted = false;
getBinder().linkToDeath(this, 0);
}
// OBB source filename
@@ -198,7 +196,11 @@ class MountService extends IMountService.Stub
mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(OBB_RUN_ACTION, action));
}
public void cleanUp() {
public void link() throws RemoteException {
getBinder().linkToDeath(this, 0);
}
public void unlink() {
getBinder().unlinkToDeath(this, 0);
}
@@ -1672,14 +1674,39 @@ class MountService extends IMountService.Stub
Slog.i(TAG, "Send to OBB handler: " + action.toString());
}
private void addObbState(ObbState obbState) {
private void addObbState(ObbState obbState) throws RemoteException {
synchronized (mObbMounts) {
List<ObbState> obbStates = mObbMounts.get(obbState.getBinder());
final IBinder binder = obbState.getBinder();
List<ObbState> obbStates = mObbMounts.get(binder);
final boolean unique;
if (obbStates == null) {
obbStates = new ArrayList<ObbState>();
mObbMounts.put(obbState.getBinder(), obbStates);
mObbMounts.put(binder, obbStates);
unique = true;
} else {
unique = obbStates.contains(obbState);
}
obbStates.add(obbState);
if (unique) {
obbStates.add(obbState);
try {
obbState.link();
} catch (RemoteException e) {
/*
* The binder died before we could link it, so clean up our
* state and return failure.
*/
obbStates.remove(obbState);
if (obbStates.isEmpty()) {
mObbMounts.remove(binder);
}
// Rethrow the error so mountObb can get it
throw e;
}
}
mObbPathToStateMap.put(obbState.filename, obbState);
// Track the number of OBBs used by this UID.
@@ -1695,14 +1722,17 @@ class MountService extends IMountService.Stub
private void removeObbState(ObbState obbState) {
synchronized (mObbMounts) {
final List<ObbState> obbStates = mObbMounts.get(obbState.getBinder());
final IBinder binder = obbState.getBinder();
final List<ObbState> obbStates = mObbMounts.get(binder);
if (obbStates != null) {
obbStates.remove(obbState);
}
if (obbStates == null || obbStates.isEmpty()) {
mObbMounts.remove(obbState.getBinder());
obbState.cleanUp();
if (obbStates.remove(obbState)) {
obbState.unlink();
}
if (obbStates.isEmpty()) {
mObbMounts.remove(binder);
}
}
mObbPathToStateMap.remove(obbState.filename);
// Track the number of OBBs used by this UID.
@@ -1721,7 +1751,7 @@ class MountService extends IMountService.Stub
}
}
private void replaceObbState(ObbState oldObbState, ObbState newObbState) {
private void replaceObbState(ObbState oldObbState, ObbState newObbState) throws RemoteException {
synchronized (mObbMounts) {
removeObbState(oldObbState);
addObbState(newObbState);