14eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato/* 24eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Copyright (C) 2013 The Android Open Source Project 34eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 44eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 54eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * you may not use this file except in compliance with the License. 64eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * You may obtain a copy of the License at 74eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 84eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 94eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Unless required by applicable law or agreed to in writing, software 114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * See the License for the specific language governing permissions and 144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * limitations under the License. 154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopackage com.android.internal.app.procstats; 184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 19e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_AVERAGE; 20e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MAXIMUM; 21e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MINIMUM; 224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT; 234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM; 244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE; 254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM; 264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM; 274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_AVERAGE; 284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_MAXIMUM; 294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_COUNT; 304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato/** 324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Class to accumulate PSS data. 334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopublic class PssTable extends SparseMappingTable.Table { 354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Construct the PssTable with 'tableData' as backing store 374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * for the longs data. 384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public PssTable(SparseMappingTable tableData) { 404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato super(tableData); 414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Merge the the values from the other table into this one. 454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void mergeStats(PssTable that) { 474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int N = that.getKeyCount(); 484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<N; i++) { 494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = that.getKeyAt(i); 504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int state = SparseMappingTable.getIdFromKey(key); 514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mergeStats(state, (int)that.getValue(key, PSS_SAMPLE_COUNT), 524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato that.getValue(key, PSS_MINIMUM), 534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato that.getValue(key, PSS_AVERAGE), 544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato that.getValue(key, PSS_MAXIMUM), 554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato that.getValue(key, PSS_USS_MINIMUM), 564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato that.getValue(key, PSS_USS_AVERAGE), 57e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn that.getValue(key, PSS_USS_MAXIMUM), 58e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn that.getValue(key, PSS_RSS_MINIMUM), 59e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn that.getValue(key, PSS_RSS_AVERAGE), 60e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn that.getValue(key, PSS_RSS_MAXIMUM)); 614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Merge the supplied PSS data in. The new min pss will be the minimum of the existing 664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * one and the new one, the average will now incorporate the new average, etc. 674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void mergeStats(int state, int inCount, long minPss, long avgPss, long maxPss, 69e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn long minUss, long avgUss, long maxUss, long minRss, long avgRss, long maxRss) { 704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = getOrAddKey((byte)state, PSS_COUNT); 714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long count = getValue(key, PSS_SAMPLE_COUNT); 724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (count == 0) { 734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_SAMPLE_COUNT, inCount); 744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_MINIMUM, minPss); 754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_AVERAGE, avgPss); 764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_MAXIMUM, maxPss); 774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_USS_MINIMUM, minUss); 784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_USS_AVERAGE, avgUss); 794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_USS_MAXIMUM, maxUss); 80e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn setValue(key, PSS_RSS_MINIMUM, minRss); 81e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn setValue(key, PSS_RSS_AVERAGE, avgRss); 82e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn setValue(key, PSS_RSS_MAXIMUM, maxRss); 834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_SAMPLE_COUNT, count + inCount); 854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long val; 874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = getValue(key, PSS_MINIMUM); 894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val > minPss) { 904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_MINIMUM, minPss); 914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = getValue(key, PSS_AVERAGE); 944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_AVERAGE, 954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato (long)(((val*(double)count)+(avgPss*(double)inCount)) / (count+inCount))); 964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = getValue(key, PSS_MAXIMUM); 984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val < maxPss) { 994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_MAXIMUM, maxPss); 1004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = getValue(key, PSS_USS_MINIMUM); 1034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val > minUss) { 1044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_USS_MINIMUM, minUss); 1054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = getValue(key, PSS_USS_AVERAGE); 10834a6e844565494e4c7742a54ec6ef20475637c5eMakoto Onuki setValue(key, PSS_USS_AVERAGE, 1094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato (long)(((val*(double)count)+(avgUss*(double)inCount)) / (count+inCount))); 1104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = getValue(key, PSS_USS_MAXIMUM); 1124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val < maxUss) { 1134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setValue(key, PSS_USS_MAXIMUM, maxUss); 1144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 115e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 116e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn val = getValue(key, PSS_RSS_MINIMUM); 117e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (val > minUss) { 118e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn setValue(key, PSS_RSS_MINIMUM, minUss); 119e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 120e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 121e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn val = getValue(key, PSS_RSS_AVERAGE); 122e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn setValue(key, PSS_RSS_AVERAGE, 123e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn (long)(((val*(double)count)+(avgUss*(double)inCount)) / (count+inCount))); 124e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 125e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn val = getValue(key, PSS_RSS_MAXIMUM); 126e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (val < maxUss) { 127e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn setValue(key, PSS_RSS_MAXIMUM, maxUss); 128e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 1294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato} 132