import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakData;\r
import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDetector;\r
import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;\r
+import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;\r
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingChildData;\r
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingData;\r
import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;\r
DBTableManager.TABLE_INDEX_PROFILING_DATA);\r
String tableName = profilingData.getTableName();\r
ResultSet rs = SqlManager.selectAllFromTable(tableName);\r
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();\r
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance().getProfileDataMaker();\r
if (null == rs || profiler == null) {\r
return false;\r
}\r
String seq = data.get(ProfilingData.SEQUENCE_INDEX);\r
profiler.getProfilingDataMap().put(seq, fupData);\r
String symbol = data.get(ProfilingData.KEY_INDEX);\r
- profiler.getSymbolSeqHash().put(symbol, seq);\r
+ FunctionUsageProfiler.getSymbolSeqHash().put(symbol, seq);\r
}\r
rs.close();\r
} catch (SQLException e) {\r
ResultSet rs = SqlManager.selectAllFromTable(tableName);\r
// FunctionUsageProfiler profiler = AnalyzerManager\r
// .getFunctionUserProfiler();\r
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();\r
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()\r
+ .getProfileDataMaker();\r
if (null == rs || profiler == null) {\r
return false;\r
}\r
}
public void setTotalProfilingSampleCount(int count) {
- // AnalyzerManager.getFunctionUserProfiler().setTotalSampleCount(count);
- FunctionUsageProfiler.getInstance().setTotalSampleCount(count);
+ FunctionUsageProfiler.getInstance().getProfileDataMaker()
+ .setTotalSampleCount(count);
}
public int getTotalProfilingSampleCount() {
- return FunctionUsageProfiler.getInstance().getTotalSampleCount();
- // return
- // AnalyzerManager.getFunctionUserProfiler().getTotalSampleCount();
+ return FunctionUsageProfiler.getInstance().getProfileDataMaker()
+ .getTotalSampleCount();
}
}
import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakData;
import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDetector;
import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingChildData;
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingData;
import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
unlockDB();
return;
}
- // FunctionUsageProfiler profiler = AnalyzerManager
- // .getFunctionUserProfiler();
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
+ .getProfileDataMaker();
HashMap<String, ProfilingData> profilingDataMap = profiler
.getProfilingDataMap();
List<ProfilingData> pDataList = new ArrayList<ProfilingData>();
}
// FunctionUsageProfiler profiler = AnalyzerManager
// .getFunctionUserProfiler();
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
+ .getProfileDataMaker();
HashMap<String, ProfilingChildData> profilingDataMap = profiler
.getChildListMap();
List<ProfilingChildData> pDataList = new ArrayList<ProfilingChildData>();
int size = inputs.size();
for (int i = 0; i < size; i++) {
List<String> input = inputs.get(i);
- // System.out.println("file b : "+input);
if (AnalyzerUtil.isInternal(input, false)) {
continue;
}
// read / write
} else if (fdApiType.equals(LogCenterConstants.FD_API_TYPE_READ)
|| fdApiType.equals(LogCenterConstants.FD_API_TYPE_WRITE)) {
-
- System.out.print("Read Write " + input + "\n");
-
if (printCalledFunctionChart(input) == false) {
continue;
}
}
} else // / Other
{
- // System.out.print(" Other "+input+"\n");
if (printCalledFunctionChart(input) == false) {
continue;
}
import org.tizen.dynamicanalyzer.logparser.LogParser;
import org.tizen.dynamicanalyzer.nl.InformationViewLabels;
import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
public class CallStackManager {
class DuplicateUserCall {
// insert call count
// FunctionUsageProfiler profiler = AnalyzerManager
// .getFunctionUserProfiler();
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance().getProfileDataMaker();
profiler.makeFupDataForCallTrace(selfCallstackUnit, input);
List<CallStackUnit> userCallstack = getUserCallstack(tid);
import java.util.List;
import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
-import org.tizen.dynamicanalyzer.common.AnalyzerPaths;
-import org.tizen.dynamicanalyzer.common.CommonConstants;
import org.tizen.dynamicanalyzer.communicator.DACommunicator;
-import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
import org.tizen.dynamicanalyzer.nl.SummaryLabels;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackManager;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
-import org.tizen.dynamicanalyzer.ui.userinterface.UIDataManager;
-import org.tizen.dynamicanalyzer.utils.Formatter;
public class FunctionUsageProfiler implements Runnable {
- class CallstackTree {
- ProfilingData me;
- CallstackTree parent;
- List<CallstackTree> children = null;
- int childExeTime = 0;
-
- public CallstackTree(ProfilingData me, CallstackTree parent) {
- this.me = me;
- this.parent = parent;
- children = new ArrayList<FunctionUsageProfiler.CallstackTree>();
- }
-
- public void addChild(CallstackTree child) {
- children.add(child);
- }
-
- public void addChildExeTime(int time) {
- childExeTime += time;
- }
-
- public int getInclusiveExeTime() {
- // int cTime = 0;
- // for (int i = 0; i < children.size(); i++) {
- // cTime += children.get(i).getThis().getLastExeTime();
- // }
- return me.getLastElapsedTime() - childExeTime;
- }
-
- public ProfilingData getThis() {
- return me;
- }
-
- public CallstackTree getParent() {
- return parent;
- }
- }
-
// 0.01 second = 10 ms
public static final long SAMPLE_TIME = 10;
public static final String APPLICATION = SummaryLabels.FUNCTION_USAGE_PROFILER_APPLICATION;
public static final String DEPENDENT_LIB_KEY = "profiling_dependent_lib_key";//$NON-NLS-1$
public static final String UNKNOWN = "";//$NON-NLS-1$
- private int totalSampleCount = 0;
- private CallstackTree current = null;
private static FunctionUsageProfiler instance = null;
- /**
- * key: seq - value : function usage profiling data hash map all function
- * usage profiling data are in this hash map
- **/
- private HashMap<String, ProfilingData> profilingDataMap = null;
-
- /**
- * key : seq - value : child seq list // all child lists are in this hash
- */
- private HashMap<String, ProfilingChildData> childListMap = null;
+ private ProfileDataMaker profileDataMaker = null;
/**
* key: symbol(child) or file path (parent) - value : sequence num of
* profiling data. all parent and child data is in
*/
- private HashMap<String, String> symbolSeqHash = null;
+ private static HashMap<String, String> symbolSeqHash = null;
private List<String> sampleInputs = null;
private static Thread profiler = null;
- private ProfilingData appBin = null;
- private ProfilingData dependentLib = null;
- private String appBinName = null;
+ public FunctionUsageProfiler() {
+ profileDataMaker = new ProfileDataMaker();
+ }
+
+ public ProfileDataMaker getProfileDataMaker() {
+ return profileDataMaker;
+ }
public static FunctionUsageProfiler getInstance() {
if (null == instance) {
return instance;
}
- public HashMap<String, ProfilingData> getProfilingDataMap() {
- if (null == profilingDataMap) {
- profilingDataMap = new HashMap<String, ProfilingData>();
- }
- return profilingDataMap;
- }
-
- public HashMap<String, ProfilingChildData> getChildListMap() {
- if (null == childListMap) {
- childListMap = new HashMap<String, ProfilingChildData>();
- }
- return childListMap;
- }
-
- public HashMap<String, String> getSymbolSeqHash() {
+ public static HashMap<String, String> getSymbolSeqHash() {
if (null == symbolSeqHash) {
symbolSeqHash = new HashMap<String, String>();
}
getSampleInputs().add(sample);
}
- public String getAppBinName() {
- return appBinName;
- }
-
- public ProfilingData getAppBin() {
- return appBin;
- }
-
- public ProfilingData getDependentLib() {
- return dependentLib;
- }
-
- public void makeFupDataForCallTrace(CallStackUnit inputCallstackApiData,
- String[] inputLog) {
- int exeTime = 0;
- String strType = inputLog[LogCenterConstants.USER_FUNCTION_TYPE_INDEX];
- int type = Integer.parseInt(strType);
- if (type == LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
- String strExeTime = inputLog[LogCenterConstants.USER_FUNCTION_ELAPSED_TIME_INDEX];
- exeTime += Integer.parseInt(strExeTime);
- }
-
- ProfilingData parent = getProfilingDataByKey(inputCallstackApiData
- .getPath());
- if (null == parent) {
- parent = makeNewProfilingData(inputCallstackApiData, true);
- checkUserCall(inputCallstackApiData, parent, null);
-
- ProfilingData child = makeNewProfilingData(inputCallstackApiData,
- false);
- parent.addChild(child);
- child.addExCount();
- child.addElpasedTime(exeTime);
- child.setParent(parent.getName());
-
- if (type != LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
- child.addCallCount();
- }
- } else {
- ProfilingData child = getProfilingDataByKey(inputCallstackApiData
- .getSymbol());
- if (null == child) {
- child = makeNewProfilingData(inputCallstackApiData, false);
- parent.addChild(child);
- child.setParent(parent.getName());
- }
- child.addElpasedTime(exeTime);
- if (type != LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
- child.addCallCount();
- }
-
- // calculate internal time
- if (type == LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
- if (null == current) {
- // bug
- System.out
- .println("bug found!!" + inputCallstackApiData.getFunctionName()); //$NON-NLS-1$
- } else {
- CallstackTree parentCt = current.getParent();
- if (null != parentCt) {
- parentCt.addChildExeTime(current.getThis()
- .getLastElapsedTime());
- }
- child.addExclusiveElapsedTime(current.getInclusiveExeTime());
- current = current.getParent();
- UIDataManager.getInstance()
- .getfunctionProfilingDataChecker()
- .addProfilingData(child);
- }
- } else {
- if (null == current) {
- CallstackTree ct = new CallstackTree(child, null);
- current = ct;
- } else {
- CallstackTree ct = new CallstackTree(child, current);
- current.addChild(ct);
- current = ct;
- }
- }
- }
- }
-
- public void makeFunctionUsageProfileData(String sampleLog) {
- totalSampleCount++;
- String[] splitSampleLog = sampleLog.split(CommonConstants.NEW_LINE);
- String[] selfAddrLog = splitSampleLog[0]
- .split(AnalyzerConstants.DATA_PARSING_TOKEN);
- String[] splitCallstack = splitSampleLog[1]
- .split(AnalyzerConstants.DATA_PARSING_TOKEN);
- List<String> sampleCallstack = new ArrayList<String>();
-
- for (int i = 0; i < splitCallstack.length; i++) {
- sampleCallstack.add(new String(splitCallstack[i]));
- }
-
- List<Long> addrs = makeCallstackHashAndList(sampleCallstack);
- HashMap<Long, CallStackUnit> addrMap = CallStackManager.getInstance()
- .getCallStackApiByAddrMap();
- String selfAddrStr = selfAddrLog[0];
- long selfAddr = Long.parseLong(selfAddrStr);
- CallStackUnit inputData = addrMap.get(selfAddr);
- if (null == inputData) {
- return;
- }
-
- // drop samples of probe library
- if (inputData.getPath().startsWith(AnalyzerPaths.DA_REMOTE_PROBE_PATH)) {
- return;
- }
-
- String inputPath = inputData.getPath();
- String inputFuncName = inputData.getFunctionName();
-
- ProfilingData parent = getProfilingDataByKey(inputPath);
- // exclusive cpu time
- if (null == parent) {
- parent = makeNewProfilingData(inputData, true);
- checkUserCall(inputData, parent, null);
- if (inputFuncName.equals(UNKNOWN)) {
- parent.addExCount();
- } else {
- ProfilingData child = makeNewProfilingData(inputData, false);
- parent.addChild(child);
- child.addExCount();
- child.setParent(parent.getName());
- }
- } else {
- if (inputFuncName.isEmpty()) {
- parent.addExCount();
- } else {
- ProfilingData child = getProfilingDataByKey(inputData
- .getSymbol());
- if (null == child) {
- child = makeNewProfilingData(inputData, false);
- parent.addChild(child);
- child.setParent(parent.getName());
- }
- child.addExCount();
- }
- }
-
- // inclusive cpu time
- for (int i = 0; i < addrs.size(); i++) {
- CallStackUnit callstackCsa = addrMap.get(addrs.get(i));
- // disable inclusive cpu time of dependent library
- if (!CallStackManager.getInstance().checkUserCall(
- callstackCsa.getPath())) {
- continue;
- }
-
- if (callstackCsa.getFunctionName().equals(UNKNOWN)) {
- ProfilingData inParent = getProfilingDataByKey(callstackCsa
- .getPath());
- ProfilingData pp = null;
- if (null == inParent) {
- inParent = makeNewProfilingData(callstackCsa, true);
- checkUserCall(callstackCsa, inParent, pp);
- }
- inParent.addInCount(totalSampleCount);
-
- if (null != inParent.getParent()) {
- String pInParentName = inParent.getParent();
- pp = getProfilingDataByKey(pInParentName);
- pp.addInCount(totalSampleCount);
- }
- } else {
- ProfilingData fupData = getProfilingDataByKey(callstackCsa
- .getSymbol());
- if (null == fupData) {
- ProfilingData inParent = getProfilingDataByKey(callstackCsa
- .getPath());
- if (null == inParent) {
- inParent = makeNewProfilingData(callstackCsa, true);
- checkUserCall(callstackCsa, inParent, null);
- }
- fupData = makeNewProfilingData(callstackCsa, false);
- fupData.setParent(inParent.getName());
-
- inParent.addChild(fupData);
- inParent.addInCount(totalSampleCount);
- if (null != inParent.getParent()) {
- String pInParentName = inParent.getParent();
- ProfilingData pp = getProfilingDataByKey(pInParentName);
- pp.addInCount(totalSampleCount);
- }
- } else {
- String pName = fupData.getParent();
- ProfilingData inParent = getProfilingDataByKey(pName);
- inParent.addInCount(totalSampleCount);
-
- if (null != inParent.getParent()) {
- String pInParentName = inParent.getParent();
- ProfilingData ppData = getProfilingDataByKey(pInParentName);
- ppData.addInCount(totalSampleCount);
- }
- }
- fupData.addInCount(totalSampleCount);
- }
- }
- }
-
- private void checkUserCall(CallStackUnit csa, ProfilingData parent,
- ProfilingData pp) {
- if (CallStackManager.getInstance().checkUserCall(csa.getPath())) {
- if (null == appBin) {
- CallStackUnit appBinCsa = new CallStackUnit(-1,
- FunctionUsageProfiler.APPLICATION);
- appBin = makeNewProfilingData(appBinCsa, true);
- appBin.setKey(APPLICATION_KEY);
- appBinName = csa.getPath();
- }
- parent.setParent(appBin.getName());
- appBin.addChild(parent);
- if (null != pp) {
- pp = appBin;
- }
- } else {
- if (null == dependentLib) {
- CallStackUnit dependentLibBinCsa = new CallStackUnit(-2,
- FunctionUsageProfiler.DEPENDENT_LIB);
- dependentLib = makeNewProfilingData(dependentLibBinCsa, true);
- dependentLib.setKey(DEPENDENT_LIB_KEY);
- }
- parent.setParent(dependentLib.getName());
- dependentLib.addChild(parent);
- if (null != pp) {
- pp = dependentLib;
- }
- }
- }
-
- private List<Long> makeCallstackHashAndList(List<String> callstackLog) {
- HashMap<Long, CallStackUnit> addrMap = CallStackManager.getInstance()
- .getCallStackApiByAddrMap();
- List<Long> addrs = new ArrayList<Long>();
- int size = callstackLog.size();
- for (int i = 1; i + 1 < size; i += 2) {
- if (callstackLog.get(i).equals(AnalyzerConstants.CALLSTACK_END)
- || callstackLog.get(i + 1).equals(
- AnalyzerConstants.CALLSTACK_END)) {
- break;
- }
- String addrStr = callstackLog.get(i);
- if (addrStr.isEmpty()) {
- return null;
- }
- long addr = 0;
- try {
- addr = Long.parseLong(addrStr);
- } catch (NumberFormatException e) {
- e.printStackTrace();
- }
- addrs.add(addr);
-
- CallStackUnit funcName = addrMap.get(addr);
- if (null == funcName) {
- String funcSymbol = callstackLog.get(i + 1);
- CallStackUnit cas = new CallStackUnit(addr, funcSymbol);
- if (null == addrMap.get(addr)) {
- addrMap.put(addr, cas);
- }
- }
- }
- return addrs;
- }
-
- public String getCpuRate(ProfilingData data, boolean exclusive) {
- int count = 0;
- double rate = 0.;
- if (exclusive) {
- count = data.getExCount();
- rate = count / (double) totalSampleCount * 100;
- } else {
- count = data.getInCount();
- rate = count / (double) totalSampleCount * 100;
- }
-
- return Formatter.toDoubleFormat2(Double.toString(rate));
- }
-
- public String getCpuTime(ProfilingData data, boolean exclusive) {
- int count = 0;
- if (exclusive) {
- count = data.getExCount();
- } else {
- count = data.getInCount();
- }
-
- return Long.toString(count * SAMPLE_TIME);
- }
-
- public ProfilingData getProfilingDataByKey(String key) {
- String seq = getSymbolSeqHash().get(key);
- if (null == seq) {
- return null;
- }
-
- return getProfilingDataMap().get(seq);
- }
-
- private ProfilingData makeNewProfilingData(CallStackUnit inputData,
- boolean isParent) {
- ProfilingData newProfilingData = new ProfilingData(inputData, isParent);
- getProfilingDataMap().put(newProfilingData.getSequence(),
- newProfilingData);
- if (isParent) {
- getSymbolSeqHash().put(inputData.getPath(),
- newProfilingData.getSequence());
- } else {
- getSymbolSeqHash().put(inputData.getSymbol(),
- newProfilingData.getSequence());
- }
- return newProfilingData;
- }
-
- public void setAppBin(ProfilingData appBin) {
- this.appBin = appBin;
- }
-
- public void setDependentLib(ProfilingData dependentLib) {
- this.dependentLib = dependentLib;
- }
-
- public void setTotalSampleCount(int count) {
- totalSampleCount = count;
- }
-
- public int getTotalSampleCount() {
- return totalSampleCount;
- }
-
public static void startProfiler() {
if (null == profiler || !profiler.isAlive()) {
profiler = new Thread(null, getInstance(),
try {
if (!getInstance().getSampleInputs().isEmpty()) {
String sample = getInstance().getFirstSample();
- getInstance().makeFunctionUsageProfileData(sample);
+ getInstance().getProfileDataMaker()
+ .makeFunctionUsageProfileData(sample);
} else if (DACommunicator.isRunning()) {
Thread.sleep(AnalyzerConstants.LOG_CHECK_INTERVAL);
} else {
--- /dev/null
+package org.tizen.dynamicanalyzer.ui.summary.profiling;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
+import org.tizen.dynamicanalyzer.common.AnalyzerPaths;
+import org.tizen.dynamicanalyzer.common.CommonConstants;
+import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
+import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackManager;
+import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
+import org.tizen.dynamicanalyzer.ui.userinterface.UIDataManager;
+import org.tizen.dynamicanalyzer.utils.Formatter;
+
+public class ProfileDataMaker {
+
+ class CallstackTree {
+ ProfilingData me;
+ CallstackTree parent;
+ List<CallstackTree> children = null;
+ int childExeTime = 0;
+
+ public CallstackTree(ProfilingData me, CallstackTree parent) {
+ this.me = me;
+ this.parent = parent;
+ children = new ArrayList<ProfileDataMaker.CallstackTree>();
+ }
+
+ public void addChild(CallstackTree child) {
+ children.add(child);
+ }
+
+ public void addChildExeTime(int time) {
+ childExeTime += time;
+ }
+
+ public int getInclusiveExeTime() {
+ return me.getLastElapsedTime() - childExeTime;
+ }
+
+ public ProfilingData getThis() {
+ return me;
+ }
+
+ public CallstackTree getParent() {
+ return parent;
+ }
+ }
+
+ private CallstackTree current = null;
+ private int totalSampleCount = 0;
+
+ /**
+ * key: seq - value : function usage profiling data hash map all function
+ * usage profiling data are in this hash map
+ **/
+ private HashMap<String, ProfilingData> profilingDataMap = null;
+
+ /**
+ * key : seq - value : child seq list // all child lists are in this hash
+ */
+ private HashMap<String, ProfilingChildData> childListMap = null;
+
+ private ProfilingData appBin = null;
+ private ProfilingData dependentLib = null;
+ private String appBinName = null;
+
+ public String getAppBinName() {
+ return appBinName;
+ }
+
+ public ProfilingData getAppBin() {
+ return appBin;
+ }
+
+ public ProfilingData getDependentLib() {
+ return dependentLib;
+ }
+
+ public void setAppBin(ProfilingData appBin) {
+ this.appBin = appBin;
+ }
+
+ public void setDependentLib(ProfilingData dependentLib) {
+ this.dependentLib = dependentLib;
+ }
+
+ public void setTotalSampleCount(int count) {
+ totalSampleCount = count;
+ }
+
+ public int getTotalSampleCount() {
+ return totalSampleCount;
+ }
+
+ public ProfilingData getProfilingDataByKey(String key) {
+ String seq = FunctionUsageProfiler.getSymbolSeqHash().get(key);
+ if (null == seq) {
+ return null;
+ }
+
+ return getProfilingDataMap().get(seq);
+ }
+
+ public HashMap<String, ProfilingData> getProfilingDataMap() {
+ if (null == profilingDataMap) {
+ profilingDataMap = new HashMap<String, ProfilingData>();
+ }
+ return profilingDataMap;
+ }
+
+ public HashMap<String, ProfilingChildData> getChildListMap() {
+ if (null == childListMap) {
+ childListMap = new HashMap<String, ProfilingChildData>();
+ }
+ return childListMap;
+ }
+
+ public String getCpuRate(ProfilingData data, boolean exclusive) {
+ int count = 0;
+ double rate = 0.;
+ if (exclusive) {
+ count = data.getExCount();
+ rate = count / (double) totalSampleCount * 100;
+ } else {
+ count = data.getInCount();
+ rate = count / (double) totalSampleCount * 100;
+ }
+
+ return Formatter.toDoubleFormat2(Double.toString(rate));
+ }
+
+ public String getCpuTime(ProfilingData data, boolean exclusive) {
+ int count = 0;
+ if (exclusive) {
+ count = data.getExCount();
+ } else {
+ count = data.getInCount();
+ }
+
+ return Long.toString(count * FunctionUsageProfiler.SAMPLE_TIME);
+ }
+
+ private void checkUserCall(CallStackUnit csa, ProfilingData parent,
+ ProfilingData pp) {
+ if (CallStackManager.getInstance().checkUserCall(csa.getPath())) {
+ if (null == appBin) {
+ CallStackUnit appBinCsa = new CallStackUnit(-1,
+ FunctionUsageProfiler.APPLICATION);
+ appBin = makeNewProfilingData(appBinCsa, true);
+ appBin.setKey(FunctionUsageProfiler.APPLICATION_KEY);
+ appBinName = csa.getPath();
+ }
+ parent.setParent(appBin.getName());
+ appBin.addChild(parent);
+ if (null != pp) {
+ pp = appBin;
+ }
+ } else {
+ if (null == dependentLib) {
+ CallStackUnit dependentLibBinCsa = new CallStackUnit(-2,
+ FunctionUsageProfiler.DEPENDENT_LIB);
+ dependentLib = makeNewProfilingData(dependentLibBinCsa, true);
+ dependentLib.setKey(FunctionUsageProfiler.DEPENDENT_LIB_KEY);
+ }
+ parent.setParent(dependentLib.getName());
+ dependentLib.addChild(parent);
+ if (null != pp) {
+ pp = dependentLib;
+ }
+ }
+ }
+
+ public void makeFunctionUsageProfileData(String sampleLog) {
+ totalSampleCount++;
+ String[] splitSampleLog = sampleLog.split(CommonConstants.NEW_LINE);
+ String[] selfAddrLog = splitSampleLog[0]
+ .split(AnalyzerConstants.DATA_PARSING_TOKEN);
+ String[] splitCallstack = splitSampleLog[1]
+ .split(AnalyzerConstants.DATA_PARSING_TOKEN);
+ List<String> sampleCallstack = new ArrayList<String>();
+
+ for (int i = 0; i < splitCallstack.length; i++) {
+ sampleCallstack.add(new String(splitCallstack[i]));
+ }
+
+ List<Long> addrs = makeCallstackHashAndList(sampleCallstack);
+ HashMap<Long, CallStackUnit> addrMap = CallStackManager.getInstance()
+ .getCallStackApiByAddrMap();
+ String selfAddrStr = selfAddrLog[0];
+ long selfAddr = Long.parseLong(selfAddrStr);
+ CallStackUnit inputData = addrMap.get(selfAddr);
+ if (null == inputData) {
+ return;
+ }
+
+ // drop samples of probe library
+ if (inputData.getPath().startsWith(AnalyzerPaths.DA_REMOTE_PROBE_PATH)) {
+ return;
+ }
+
+ String inputPath = inputData.getPath();
+ String inputFuncName = inputData.getFunctionName();
+
+ ProfilingData parent = getProfilingDataByKey(inputPath);
+ // exclusive cpu time
+ if (null == parent) {
+ parent = makeNewProfilingData(inputData, true);
+ checkUserCall(inputData, parent, null);
+ if (inputFuncName.equals(FunctionUsageProfiler.UNKNOWN)) {
+ parent.addExCount();
+ } else {
+ ProfilingData child = makeNewProfilingData(inputData, false);
+ parent.addChild(child);
+ child.addExCount();
+ child.setParent(parent.getName());
+ }
+ } else {
+ if (inputFuncName.isEmpty()) {
+ parent.addExCount();
+ } else {
+ ProfilingData child = getProfilingDataByKey(inputData
+ .getSymbol());
+ if (null == child) {
+ child = makeNewProfilingData(inputData, false);
+ parent.addChild(child);
+ child.setParent(parent.getName());
+ }
+ child.addExCount();
+ }
+ }
+
+ // inclusive cpu time
+ for (int i = 0; i < addrs.size(); i++) {
+ CallStackUnit callstackCsa = addrMap.get(addrs.get(i));
+ // disable inclusive cpu time of dependent library
+ if (!CallStackManager.getInstance().checkUserCall(
+ callstackCsa.getPath())) {
+ continue;
+ }
+
+ if (callstackCsa.getFunctionName().equals(
+ FunctionUsageProfiler.UNKNOWN)) {
+ ProfilingData inParent = getProfilingDataByKey(callstackCsa
+ .getPath());
+ ProfilingData pp = null;
+ if (null == inParent) {
+ inParent = makeNewProfilingData(callstackCsa, true);
+ checkUserCall(callstackCsa, inParent, pp);
+ }
+ inParent.addInCount(totalSampleCount);
+
+ if (null != inParent.getParent()) {
+ String pInParentName = inParent.getParent();
+ pp = getProfilingDataByKey(pInParentName);
+ pp.addInCount(totalSampleCount);
+ }
+ } else {
+ ProfilingData fupData = getProfilingDataByKey(callstackCsa
+ .getSymbol());
+ if (null == fupData) {
+ ProfilingData inParent = getProfilingDataByKey(callstackCsa
+ .getPath());
+ if (null == inParent) {
+ inParent = makeNewProfilingData(callstackCsa, true);
+ checkUserCall(callstackCsa, inParent, null);
+ }
+ fupData = makeNewProfilingData(callstackCsa, false);
+ fupData.setParent(inParent.getName());
+
+ inParent.addChild(fupData);
+ inParent.addInCount(totalSampleCount);
+ if (null != inParent.getParent()) {
+ String pInParentName = inParent.getParent();
+ ProfilingData pp = getProfilingDataByKey(pInParentName);
+ pp.addInCount(totalSampleCount);
+ }
+ } else {
+ String pName = fupData.getParent();
+ ProfilingData inParent = getProfilingDataByKey(pName);
+ inParent.addInCount(totalSampleCount);
+
+ if (null != inParent.getParent()) {
+ String pInParentName = inParent.getParent();
+ ProfilingData ppData = getProfilingDataByKey(pInParentName);
+ ppData.addInCount(totalSampleCount);
+ }
+ }
+ fupData.addInCount(totalSampleCount);
+ }
+ }
+ }
+
+ private List<Long> makeCallstackHashAndList(List<String> callstackLog) {
+ HashMap<Long, CallStackUnit> addrMap = CallStackManager.getInstance()
+ .getCallStackApiByAddrMap();
+ List<Long> addrs = new ArrayList<Long>();
+ int size = callstackLog.size();
+ for (int i = 1; i + 1 < size; i += 2) {
+ if (callstackLog.get(i).equals(AnalyzerConstants.CALLSTACK_END)
+ || callstackLog.get(i + 1).equals(
+ AnalyzerConstants.CALLSTACK_END)) {
+ break;
+ }
+ String addrStr = callstackLog.get(i);
+ if (addrStr.isEmpty()) {
+ return null;
+ }
+ long addr = 0;
+ try {
+ addr = Long.parseLong(addrStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ addrs.add(addr);
+
+ CallStackUnit funcName = addrMap.get(addr);
+ if (null == funcName) {
+ String funcSymbol = callstackLog.get(i + 1);
+ CallStackUnit cas = new CallStackUnit(addr, funcSymbol);
+ if (null == addrMap.get(addr)) {
+ addrMap.put(addr, cas);
+ }
+ }
+ }
+ return addrs;
+ }
+
+ private ProfilingData makeNewProfilingData(CallStackUnit inputData,
+ boolean isParent) {
+ ProfilingData newProfilingData = new ProfilingData(inputData, isParent);
+ getProfilingDataMap().put(newProfilingData.getSequence(),
+ newProfilingData);
+ if (isParent) {
+ FunctionUsageProfiler.getSymbolSeqHash().put(inputData.getPath(),
+ newProfilingData.getSequence());
+ } else {
+ FunctionUsageProfiler.getSymbolSeqHash().put(inputData.getSymbol(),
+ newProfilingData.getSequence());
+ }
+ return newProfilingData;
+ }
+
+ public void makeFupDataForCallTrace(CallStackUnit inputCallstackApiData,
+ String[] inputLog) {
+ int exeTime = 0;
+ String strType = inputLog[LogCenterConstants.USER_FUNCTION_TYPE_INDEX];
+ int type = Integer.parseInt(strType);
+ if (type == LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
+ String strExeTime = inputLog[LogCenterConstants.USER_FUNCTION_ELAPSED_TIME_INDEX];
+ exeTime += Integer.parseInt(strExeTime);
+ }
+
+ ProfilingData parent = getProfilingDataByKey(inputCallstackApiData
+ .getPath());
+ if (null == parent) {
+ parent = makeNewProfilingData(inputCallstackApiData, true);
+ checkUserCall(inputCallstackApiData, parent, null);
+
+ ProfilingData child = makeNewProfilingData(inputCallstackApiData,
+ false);
+ parent.addChild(child);
+ child.addExCount();
+ child.addElpasedTime(exeTime);
+ child.setParent(parent.getName());
+
+ if (type != LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
+ child.addCallCount();
+ }
+ } else {
+ ProfilingData child = getProfilingDataByKey(inputCallstackApiData
+ .getSymbol());
+ if (null == child) {
+ child = makeNewProfilingData(inputCallstackApiData, false);
+ parent.addChild(child);
+ child.setParent(parent.getName());
+ }
+ child.addElpasedTime(exeTime);
+ if (type != LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
+ child.addCallCount();
+ }
+
+ // calculate internal time
+ if (type == LogCenterConstants.USER_FUNCTION_EVENT_TYPE_EXIT) {
+ if (null == current) {
+ // bug
+ System.out
+ .println("bug found!!" + inputCallstackApiData.getFunctionName()); //$NON-NLS-1$
+ } else {
+ CallstackTree parentCt = current.getParent();
+ if (null != parentCt) {
+ parentCt.addChildExeTime(current.getThis()
+ .getLastElapsedTime());
+ }
+ child.addExclusiveElapsedTime(current.getInclusiveExeTime());
+ current = current.getParent();
+ UIDataManager.getInstance()
+ .getfunctionProfilingDataChecker()
+ .addProfilingData(child);
+ }
+ } else {
+ if (null == current) {
+ CallstackTree ct = new CallstackTree(child, null);
+ current = ct;
+ } else {
+ CallstackTree ct = new CallstackTree(child, current);
+ current.addChild(ct);
+ current = ct;
+ }
+ }
+ }
+ }
+}
children = new ProfilingChildData(Integer.toString(seq));
// AnalyzerManager.getFunctionUserProfiler().getChildListMap()
// .put(Integer.toString(seq), children);
- FunctionUsageProfiler.getInstance().getChildListMap()
+ FunctionUsageProfiler.getInstance().getProfileDataMaker().getChildListMap()
.put(Integer.toString(seq), children);
}
return children;
return exCount;
}
- // FunctionUsageProfiler profiler = AnalyzerManager
- // .getFunctionUserProfiler();
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance().getProfileDataMaker();
int size = seqs.size();
int count = 0;
for (int i = 0; i < size; i++) {
}
public List<ProfilingData> getChildList() {
- // FunctionUsageProfiler profiler = AnalyzerManager
- // .getFunctionUserProfiler();
FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
List<ProfilingData> output = new ArrayList<ProfilingData>();
List<String> seqs = getChildData().getChildren();
for (int i = 0; i < seqs.size(); i++) {
- ProfilingData child = profiler.getProfilingDataMap().get(
+ ProfilingData child = profiler.getProfileDataMaker().getProfilingDataMap().get(
seqs.get(i));
if (null != child) {
output.add(child);
}
tableData.setObject(input.getName());
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
- // FunctionUsageProfiler profiler = AnalyzerManager
- // .getFunctionUserProfiler();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
+ .getProfileDataMaker();
String exTime = "0", exRate = "0.00", inTime = "0", inRate = "0.00", callCount = "0", exeTime = "0", inExeTime = "0"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
try {
@Override
public List<TreeInput> makeTreeInput() {
List<TreeInput> output = new ArrayList<TreeInput>();
- // FunctionUsageProfiler profiler = AnalyzerManager
- // .getFunctionUserProfiler();
- FunctionUsageProfiler profiler = FunctionUsageProfiler.getInstance();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance().getProfileDataMaker();
ProfilingData appBin = profiler.getAppBin();
if (null != appBin) {
TreeInput appBinInput = makeInput(appBin,
import org.tizen.dynamicanalyzer.common.AnalyzerPaths;
import org.tizen.dynamicanalyzer.nl.AnalyzerLabels;
import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionUsageProfiler;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingData;
import org.tizen.dynamicanalyzer.ui.userinterface.UIDataManager;
import org.tizen.dynamicanalyzer.utils.Formatter;
if (userInterfaceFunctionTree.size() == 0) {
return;
}
-// System.out.println("input.getName() : " + input.getName());
boolean bTreeSearch = userInterfaceFunctionTree
.contains(makeTreeSetData(input.getName()));
if (bTreeSearch) { // Find Same Api name
int nListSize = getDataList().size();
for (int i = 0; i < nListSize; i++) {
-
if (getDataList().get(i).getSequence()
.equals(input.getSequence())) {
getDataList().remove(i);
bUpdateData = true;
break;
}
- if (getDataList().get(i).getAPIName().equals(input.getParent())) {
+ }
+
+ nListSize = getDataList().size();
+ for (int i = 0; i < nListSize; i++) {
+ if (getDataList().get(i).getAPIName().equals(input.getParent())) { // Check,
+ // Exist
+ // Parent
+ // Node
bExistParentData = true;
break;
}
}
UIFunctionProfilingData pd = new UIFunctionProfilingData();
- FunctionUsageProfiler profiler = FunctionUsageProfiler
- .getInstance();
+ ProfileDataMaker profiler = FunctionUsageProfiler.getInstance()
+ .getProfileDataMaker();
String exTime = "-", inTime = "-", exeTime = "-", inExeTime = "-", exAvgTime = "-", inAvgTime = "-", exeAvgTime = "-", inExeAvgTime = "-"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
try {
exTime = profiler.getCpuTime(input, true);