Don't leak wakelock instances

am: 4b17e984b6

Change-Id: I952939e1d7e7b7f3ddfff7ecdfb7f3ca70bd9b70
This commit is contained in:
Christopher Tate
2016-09-27 23:44:51 +00:00
committed by android-build-merger
2 changed files with 23 additions and 4 deletions

View File

@@ -1339,6 +1339,11 @@ public final class PowerManager {
mTag = tag;
}
/** @hide */
public String getTag() {
return mTag;
}
/** @hide */
public void setHistoryTag(String tag) {
mHistoryTag = tag;

View File

@@ -306,10 +306,24 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne
this.service = IJobService.Stub.asInterface(service);
final PowerManager pm =
(PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, runningJob.getTag());
mWakeLock.setWorkSource(new WorkSource(runningJob.getSourceUid()));
mWakeLock.setReferenceCounted(false);
mWakeLock.acquire();
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
runningJob.getTag());
wl.setWorkSource(new WorkSource(runningJob.getSourceUid()));
wl.setReferenceCounted(false);
wl.acquire();
synchronized (mLock) {
// We use a new wakelock instance per job. In rare cases there is a race between
// teardown following job completion/cancellation and new job service spin-up
// such that if we simply assign mWakeLock to be the new instance, we orphan
// the currently-live lock instead of cleanly replacing it. Watch for this and
// explicitly fast-forward the release if we're in that situation.
if (mWakeLock != null) {
Slog.w(TAG, "Bound new job " + runningJob + " but live wakelock " + mWakeLock
+ " tag=" + mWakeLock.getTag());
mWakeLock.release();
}
mWakeLock = wl;
}
mCallbackHandler.obtainMessage(MSG_SERVICE_BOUND).sendToTarget();
}