Merge "Ease contention on the mProcessStatsThread mutex in updateCpuStats." into froyo
This commit is contained in:
committed by
Android (Google) Code Review
commit
afbf9f8d6d
@ -123,6 +123,8 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
public final class ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor {
|
public final class ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor {
|
||||||
static final String TAG = "ActivityManager";
|
static final String TAG = "ActivityManager";
|
||||||
@ -927,7 +929,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
*/
|
*/
|
||||||
final ProcessStats mProcessStats = new ProcessStats(
|
final ProcessStats mProcessStats = new ProcessStats(
|
||||||
MONITOR_THREAD_CPU_USAGE);
|
MONITOR_THREAD_CPU_USAGE);
|
||||||
long mLastCpuTime = 0;
|
final AtomicLong mLastCpuTime = new AtomicLong(0);
|
||||||
|
final AtomicBoolean mProcessStatsMutexFree = new AtomicBoolean(true);
|
||||||
|
|
||||||
long mLastWriteTime = 0;
|
long mLastWriteTime = 0;
|
||||||
|
|
||||||
long mInitialStartTime = 0;
|
long mInitialStartTime = 0;
|
||||||
@ -1430,7 +1434,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
try {
|
try {
|
||||||
synchronized(this) {
|
synchronized(this) {
|
||||||
final long now = SystemClock.uptimeMillis();
|
final long now = SystemClock.uptimeMillis();
|
||||||
long nextCpuDelay = (mLastCpuTime+MONITOR_CPU_MAX_TIME)-now;
|
long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
|
||||||
long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
|
long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
|
||||||
//Slog.i(TAG, "Cpu delay=" + nextCpuDelay
|
//Slog.i(TAG, "Cpu delay=" + nextCpuDelay
|
||||||
// + ", write delay=" + nextWriteDelay);
|
// + ", write delay=" + nextWriteDelay);
|
||||||
@ -1438,12 +1442,12 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
nextCpuDelay = nextWriteDelay;
|
nextCpuDelay = nextWriteDelay;
|
||||||
}
|
}
|
||||||
if (nextCpuDelay > 0) {
|
if (nextCpuDelay > 0) {
|
||||||
|
mProcessStatsMutexFree.set(true);
|
||||||
this.wait(nextCpuDelay);
|
this.wait(nextCpuDelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCpuStatsNow();
|
updateCpuStatsNow();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Slog.e(TAG, "Unexpected exception collecting process stats", e);
|
Slog.e(TAG, "Unexpected exception collecting process stats", e);
|
||||||
@ -1470,9 +1474,12 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateCpuStats() {
|
void updateCpuStats() {
|
||||||
synchronized (mProcessStatsThread) {
|
|
||||||
final long now = SystemClock.uptimeMillis();
|
final long now = SystemClock.uptimeMillis();
|
||||||
if (mLastCpuTime < (now-MONITOR_CPU_MIN_TIME)) {
|
if (mLastCpuTime.get() >= now - MONITOR_CPU_MIN_TIME) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mProcessStatsMutexFree.compareAndSet(true, false)) {
|
||||||
|
synchronized (mProcessStatsThread) {
|
||||||
mProcessStatsThread.notify();
|
mProcessStatsThread.notify();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1480,12 +1487,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
|
|
||||||
void updateCpuStatsNow() {
|
void updateCpuStatsNow() {
|
||||||
synchronized (mProcessStatsThread) {
|
synchronized (mProcessStatsThread) {
|
||||||
|
mProcessStatsMutexFree.set(false);
|
||||||
final long now = SystemClock.uptimeMillis();
|
final long now = SystemClock.uptimeMillis();
|
||||||
boolean haveNewCpuStats = false;
|
boolean haveNewCpuStats = false;
|
||||||
|
|
||||||
if (MONITOR_CPU_USAGE &&
|
if (MONITOR_CPU_USAGE &&
|
||||||
mLastCpuTime < (now-MONITOR_CPU_MIN_TIME)) {
|
mLastCpuTime.get() < (now-MONITOR_CPU_MIN_TIME)) {
|
||||||
mLastCpuTime = now;
|
mLastCpuTime.set(now);
|
||||||
haveNewCpuStats = true;
|
haveNewCpuStats = true;
|
||||||
mProcessStats.update();
|
mProcessStats.update();
|
||||||
//Slog.i(TAG, mProcessStats.printCurrentState());
|
//Slog.i(TAG, mProcessStats.printCurrentState());
|
||||||
|
Reference in New Issue
Block a user