Don't leak wakelock instances
am: 4b17e984b6
Change-Id: I952939e1d7e7b7f3ddfff7ecdfb7f3ca70bd9b70
This commit is contained in:
@@ -1339,6 +1339,11 @@ public final class PowerManager {
|
|||||||
mTag = tag;
|
mTag = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hide */
|
||||||
|
public String getTag() {
|
||||||
|
return mTag;
|
||||||
|
}
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public void setHistoryTag(String tag) {
|
public void setHistoryTag(String tag) {
|
||||||
mHistoryTag = tag;
|
mHistoryTag = tag;
|
||||||
|
|||||||
@@ -306,10 +306,24 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne
|
|||||||
this.service = IJobService.Stub.asInterface(service);
|
this.service = IJobService.Stub.asInterface(service);
|
||||||
final PowerManager pm =
|
final PowerManager pm =
|
||||||
(PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
|
(PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
|
||||||
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, runningJob.getTag());
|
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
||||||
mWakeLock.setWorkSource(new WorkSource(runningJob.getSourceUid()));
|
runningJob.getTag());
|
||||||
mWakeLock.setReferenceCounted(false);
|
wl.setWorkSource(new WorkSource(runningJob.getSourceUid()));
|
||||||
mWakeLock.acquire();
|
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();
|
mCallbackHandler.obtainMessage(MSG_SERVICE_BOUND).sendToTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user