package org.tizen.dynamicanalyzer.project.callstack;
-import java.sql.ResultSet;
-import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
import org.tizen.dynamicanalyzer.common.Global;
-import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
import org.tizen.dynamicanalyzer.project.BinaryInfo;
import org.tizen.dynamicanalyzer.project.LibraryObject;
import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnitDBTable;
import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfileDataMaker;
-import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable;
-import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionExitDBTable;
import org.tizen.dynamicanalyzer.util.Logger;
public class RuntimeCallstackManager extends BaseCallstackManager {
CallStackInserter.getInstance().pushData(csd);
}
- public NavigableMap<Long, Long> getSeqTimeByTidMap(int tid) {
+ /**
+ * Get sequence time map (for each tid)
+ *
+ * @param tid thread id
+ * @param isCreate whether sequence time map create or not
+ * (true : if the map does not exist for thread, create and return)
+ */
+ public NavigableMap<Long, Long> getSeqTimeByTidMap(int tid, boolean isCreate) {
NavigableMap<Long, Long> seqByTimeMap = seqTimeByTidMap.get(tid);
- if (null == seqByTimeMap) {
+ if (isCreate && null == seqByTimeMap) {
seqByTimeMap = new ConcurrentSkipListMap<Long, Long>();
seqTimeByTidMap.put(tid, seqByTimeMap);
}
List<CallStackItem> userCallstack = getUserCallstack(tid);
int size = userCallstack.size();
- NavigableMap<Long, Long> seqByTimeMap = getSeqTimeByTidMap(tid);
+ NavigableMap<Long, Long> seqByTimeMap = getSeqTimeByTidMap(tid, true);
CallStackUnit callerCallstackUnit = addrMap.get(callerAddr);
if (null == callerCallstackUnit) {
// to make callstack for sample, probe
@Override
public long getSeqOfUserCallstackForTime(int tid, long time) {
- long seq = -1;
- String query;
- long entrySeq = -1, exitSeq = -1;
- ResultSet rs;
- NavigableMap<Long, Long> seqByTimeMap = getSeqTimeByTidMap(tid);
- Long callstackTime = seqByTimeMap.floorKey(time);
-
- if (null != callstackTime) { // found from memory
- seq = seqByTimeMap.get(callstackTime);
- } else { // select from database
- try {
- query = String.format(FunctionEntryDBTable.USERCALLSTACK_QUERY, time);
- rs = SqlConnectionManager.executeQueryRS(query);
- if (rs == null) {
- Logger.error("failed to query seq for given time from functionentry");
- } else {
- if (rs.next()) {
- entrySeq = rs.getLong(1);
- }
- SqlConnectionManager.releaseResultSet(rs);
- }
-
- query = String.format(FunctionExitDBTable.USERCALLSTACK_QUERY, time);
- rs = SqlConnectionManager.executeQueryRS(query);
- if (rs == null) {
- Logger.error("failed to query seq for given time from functionexit");
- } else {
- if (rs.next()) {
- exitSeq = rs.getLong(1);
- }
- SqlConnectionManager.releaseResultSet(rs);
- }
-
- if (entrySeq < exitSeq) { // greater seq which time is less than sample/probe time
- seq = exitSeq;
- } else {
- seq = entrySeq;
- }
- } catch (SQLException e) {
- Logger.exception(e);
+ NavigableMap<Long, Long> seqByTimeMap = getSeqTimeByTidMap(tid, false);
+ if (null != seqByTimeMap) {
+ Long callstackTime = seqByTimeMap.floorKey(time);
+ if (null != callstackTime) { // found from memory
+ return seqByTimeMap.get(callstackTime);
}
}
- return seq;
+ return -1;
}
public List<Long> getCallstackAddrListFromSeq(long seq) {
.makeFunctionUsageProfileData(sampleLog);
// set LastSampleSeq
NavigableMap<Long, Long> seqByTimeMap = Global.getRuntimeCallstackManager()
- .getSeqTimeByTidMap(sampleLog.getTid());
- // find the time of callstackdata which was made
- // right before the current sample time
- // callstackdatas made before that time is needless
- Long lastTime = seqByTimeMap.floorKey(sampleLog.getTime());
- if (lastTime != null) {
- Long lastSeq = seqByTimeMap.get(lastTime);
- setLastSampleSeq(lastSeq);
+ .getSeqTimeByTidMap(sampleLog.getTid(), false);
+
+ if (null != seqByTimeMap) {
+ // find the time of callstackdata which was made
+ // right before the current sample time
+ // callstackdatas made before that time is needless
+ Long lastTime = seqByTimeMap.floorKey(sampleLog.getTime());
+ if (lastTime != null) {
+ Long lastSeq = seqByTimeMap.get(lastTime);
+ setLastSampleSeq(lastSeq);
+ }
}
+
// save to DB
try {
insertRowData.add(new Long(sampleLog.getSeq()));