package org.tizen.dynamicanalyzer.ui.range;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
import org.tizen.dynamicanalyzer.common.AnalyzerManager;
import org.tizen.dynamicanalyzer.communicator.DACommunicator;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
import org.tizen.dynamicanalyzer.sql.SqlManager;
import org.tizen.dynamicanalyzer.swap.callstack.BaseCallstackManager;
import org.tizen.dynamicanalyzer.swap.callstack.SWAPCallStackManager;
import org.tizen.dynamicanalyzer.ui.summary.failed.FailedChecker;
import org.tizen.dynamicanalyzer.ui.summary.failed.FailedData;
import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDetector;
+import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionSampleDBTable;
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
import org.tizen.dynamicanalyzer.ui.summary.warning.WarningChecker;
import org.tizen.dynamicanalyzer.ui.summary.warning.WarningData;
import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable;
+import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionExitDBTable;
import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
private BaseCallstackManager callstackManager = null;
private BaseCallstackManager swapCallstackManager = null;
+ // function entry/exit queue
+ private List<ProfileData> profileDataList = null;
+
private long markerStartTime = 0;
private long markerEndTime = 0;
private long analysisStartTime = 0;
private long analysisEndTime = 0;
private boolean isBeingAnalyzed = false;
+
+ private enum Function {
+ SEQ(0),
+ PID(1),
+ TID(2),
+ FUNCTIONAME(3),
+ BINARYPATH(4),
+ TIME(5),
+ CALLERPCADDR(6),
+ PCADDR(7);
+
+ public final int index;
+
+ Function(int index) {
+ this.index = index;
+ }
+ }
+
+ private enum Sample {
+ TIME(0),
+ PID(1),
+ TID(2),
+ PCADDR(3);
+
+ public final int index;
+
+ Sample(int index) {
+ this.index = index;
+ }
+ }
private RangeDataManager() {
failedChecker = new FailedChecker();
warningChecker = new WarningChecker();
callstackManager = new CallStackManager();
swapCallstackManager = new SWAPCallStackManager(true);
+ profileDataList = new ArrayList<ProfileData>();
// fileDataMaker = new FileDataMaker(failedChecker, leakDetector,
// warningChecker);
profileDataMakerMap.clear();
if (swapProfileDataMakerMap != null)
swapProfileDataMakerMap.clear();
+ profileDataList.clear();
}
public void initRange() {
boolean contextSkip = false;
for (int i = 0; i < size; i++) {
- /* !! sample db table is null.. */
// case 1 : profile data
// log id = profiling data
if (logId == DataChannelConstants.MSG_FUNCTION_EXIT) {
from = 0;
int to = from + AnalyzerConstants.DATABASE_READ_SIZE;
- while (true) {
- LogPackage logPackage = new LogPackage();
- Logs logs = new Logs(
- DataChannelConstants.LOG_USER_FUNCTION);
- input = SqlManager.getInstance().selectArea2(logId,
- markerStartTime, markerEndTime, from, to);
- if (input.isEmpty()) {
+ while (true) { // load function entry data
+ String query = String.format(FunctionEntryDBTable.SELECT_QUERY,
+ from, to, markerStartTime, markerEndTime);
+
+ List<List<Object>> result = SqlConnectionManager.executeQuery(query);
+ if (null == result || result.size() == 0 || result.get(0).size() == 0) {
break;
}
- logs.setLogs(input);
- logPackage.setLogs(
- DataChannelConstants.LOG_USER_FUNCTION, logs);
- makeRangeData(logPackage);
+ makeProfileData(DataChannelConstants.MSG_FUNCTION_ENTRY, result);
from += AnalyzerConstants.DATABASE_READ_SIZE;
to = from + AnalyzerConstants.DATABASE_READ_SIZE;
}
+
+ from = 0;
+ to = from + AnalyzerConstants.DATABASE_READ_SIZE;
+ while (true) { // load function exit data
+ String query = String.format(FunctionExitDBTable.SELECT_QUERY,
+ from, to, markerStartTime, markerEndTime);
+
+ List<List<Object>> result = SqlConnectionManager.executeQuery(query);
+ if (null == result || result.size() == 0 || result.get(0).size() == 0) {
+ break;
+ }
+ makeProfileData(DataChannelConstants.MSG_FUNCTION_EXIT, result);
+ from += AnalyzerConstants.DATABASE_READ_SIZE;
+ to = from + AnalyzerConstants.DATABASE_READ_SIZE;
+ }
+
+ makeRangeProfileData();
profileSkip = true;
continue;
}
}
- // case 2 : context data
+
+ // case 2 : function sample data
+ if (logId == DataChannelConstants.MSG_DATA_SAMPLE) {
+ from = 0;
+ int to = from + AnalyzerConstants.DATABASE_READ_SIZE;
+ while (true) {
+ LogPackage logPackage = new LogPackage();
+ Logs logs = new Logs(
+ DataChannelConstants.LOG_USER_FUNCTION);
+ List<LogData> logList = new ArrayList<LogData>();
+ String query = String.format(FunctionSampleDBTable.SELECT_QUERY,
+ from, to, markerStartTime, markerEndTime);
+ List<List<Object>> result = SqlConnectionManager.executeQuery(query);
+ if (null == result || result.size() == 0 || result.get(0).size() == 0) {
+ break;
+ }
+
+ int resultSize = result.size();
+ for (int j = 0; j < resultSize; j++) {
+ List<Object> resultData = result.get(j);
+ long time = (Long) resultData.get(Sample.TIME.index);
+ int pid = (Integer) resultData.get(Sample.PID.index);
+ int tid = (Integer) resultData.get(Sample.TID.index);
+ long pcAddr = (Long) resultData.get(Sample.PCADDR.index);
+
+ ProfileData profileData = new ProfileData(time, pid, tid, pcAddr);
+ logList.add(profileData);
+ }
+ logs.setLogs(logList);
+ logPackage.setLogs(
+ DataChannelConstants.LOG_USER_FUNCTION, logs);
+ makeRangeData(logPackage);
+ from += AnalyzerConstants.DATABASE_READ_SIZE;
+ to = from + AnalyzerConstants.DATABASE_READ_SIZE;
+ }
+ continue;
+ }
+
+ // case 3 : context data
if (!contextSkip) {
if (logId == DataChannelConstants.MSG_CONTEXT_SWITCH_ENTRY) {
from = 0;
continue;
}
}
- // case 3 : system data
+ // case 4 : system data
if (logId == DataChannelConstants.MSG_DATA_SYSTEM) {
from = 0;
}
continue;
}
- // case 4 : probe data
+ // case 5 : probe data
if (logId != DataChannelConstants.MSG_DATA_SYSTEM
- && logId != DataChannelConstants.MSG_DATA_SAMPLE
&& logId != DataChannelConstants.MSG_FUNCTION_ENTRY
&& logId != DataChannelConstants.MSG_FUNCTION_EXIT
&& logId != DataChannelConstants.MSG_CONTEXT_SWITCH_ENTRY
}
});
}
-
+ // make ProfileData from database result set and push it to function entry/exit queue
+ private void makeProfileData(int id, List<List<Object>> result) {
+ int resultSize = result.size();
+ for (int j = 0; j < resultSize; j++) {
+ List<Object> resultData = result.get(j);
+ int seq = ((Long) resultData.get(Function.SEQ.index)).intValue();
+ int pid = (Integer) resultData.get(Function.PID.index);
+ int tid = (Integer) resultData.get(Function.TID.index);
+ String functionName = (String) resultData.get(Function.FUNCTIONAME.index);
+ String binaryPath = (String) resultData.get(Function.BINARYPATH.index);
+ long time = (Long) resultData.get(Function.TIME.index);
+ long callerPcAddr = (Long) resultData.get(Function.CALLERPCADDR.index);
+ long pcAddr = (Long) resultData.get(Function.PCADDR.index);
+
+ ProfileData profileData = new ProfileData(id, seq, pid, tid, functionName,
+ binaryPath, time, callerPcAddr, pcAddr);
+ profileDataList.add(profileData);
+ }
+ }
+
+ private void makeRangeProfileData() {
+ if (profileDataList.isEmpty()) {
+ return;
+ }
+ // sort by sequence number
+ // function entry/exit log must be handled by exact order
+ Collections.sort(profileDataList, new Comparator<ProfileData>() {
+ public int compare(ProfileData pData1, ProfileData pData2) {
+ return pData1.getSeq() - pData2.getSeq();
+ }
+ });
+
+ int size = profileDataList.size();
+ for (int i = 0; i < size; i++) {
+ ProfileData input = profileDataList.get(i);
+ ProfileDataMaker profileDataMaker = getProfileDataMakerByPid(input
+ .getPid());
+ // function_exit log doesn't have probe type yet
+// if (input.getProbeType()
+// == AnalyzerConstants.FUNCTION_TYPE_APPINST) {
+ swapCallstackManager.makeUserCallstack(input, profileDataMaker);
+// }
+ }
+ }
+
private void makeRangeData(LogPackage logPack) {
Logs logs = logPack.getLogs(DataChannelConstants.LOG_USER_FUNCTION);
if (null != logs) {
- if (DACommunicator.isSWAPVersion()) {
- List<LogData> profileData = logs.getRawLogs();
- int size = profileData.size();
- for (int i = 0; i < size; i++) {
- ProfileData input = (ProfileData) profileData.get(i);
- ProfileDataMaker profileDataMaker = getProfileDataMakerByPid(input
- .getPid());
- if (input.getId() != DataChannelConstants.MSG_DATA_SAMPLE) {
- // function_exit log doesn't have probe type yet
-// if (input.getProbeType()
-// == AnalyzerConstants.FUNCTION_TYPE_APPINST) {
- swapCallstackManager.makeUserCallstack(input,
- profileDataMaker);
-// }
- } else {
- profileDataMaker.makeFunctionUsageProfileData(input);
- }
- }
+ List<LogData> profileData = logs.getRawLogs();
+ int size = profileData.size();
+ for (int i = 0; i < size; i++) {
+ ProfileData input = (ProfileData) profileData.get(i);
+ ProfileDataMaker profileDataMaker = getProfileDataMakerByPid(input
+ .getPid());
+ profileDataMaker.makeFunctionUsageProfileData(input);
}
}
- // logs = logPack.getLogs(DataChannelConstants.LOG_USER_FUNCTION);
- // if (null != logs) {
- // List<LogData> profilingInputs = logs.getLogs();
- // /* profiling data make */
- // int size = profilingInputs.size();
- // for (int i = 0; i < size; i++) {
- // ProfileData input = (ProfileData) profilingInputs.get(i);
- // if (input.getId() == DataChannelConstants.MSG_DATA_SAMPLE) {
- // profileDataMaker.makeFunctionUsageProfileData(input);
- // }
- // }
- // }
-
logs = logPack.getLogs(DataChannelConstants.MSG_PROBE_FILE);
if (null != logs) {
List<LogData> resourceInputs = logs.getRawLogs();