package org.tizen.dynamicanalyzer.ui.memory.table;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import org.eclipse.nebula.widgets.grid.GridItem;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Composite;
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;
+import org.tizen.dynamicanalyzer.common.DASelectionData;
+import org.tizen.dynamicanalyzer.common.Global;
import org.tizen.dynamicanalyzer.model.TableInput;
+import org.tizen.dynamicanalyzer.project.callstack.RuntimeCallstackManager;
+import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit;
+import org.tizen.dynamicanalyzer.ui.memory.MemoryAllocationTraceTableView;
+import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineTableView;
+import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar;
import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite;
+import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
+import org.tizen.dynamicanalyzer.util.Logger;
+import org.tizen.dynamicanalyzer.utils.Formatter;
+import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData;
public class MemoryCallStackTable extends DATableComposite {
public MemoryCallStackTable(Composite parent, int compStyle, int tableStyle) {
super(parent, compStyle, tableStyle);
- // TODO Auto-generated constructor stub
+
+ table.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ AnalyzerManager.getCurrentPage().updateView(
+ new DAViewData(TimelineTableView.tabID, null));
+ GridItem[] sels = table.getSelection();
+ if (sels.length <= 0) {
+ return;
+ }
+ table.setFocusItem(sels[0]);
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ applyFilterImage();
+ }
+
+ public void updateCallstackTable(DASelectionData selData) {
+ table.removeAll();
+ if (null == selData) {
+ return;
+ }
+ String viewId = selData.getViewID();
+ if (!viewId.equals(MemoryAllocationTraceTableView.class.getName()))
+ return;
+
+ Object obj = selData.getData();
+ if (obj instanceof GridItem[]) {
+ GridItem[] items = (GridItem[]) obj;
+ if (items.length <= 0) {
+ return;
+ }
+ DATableDataFormat tableData = (DATableDataFormat) items[0].getData();
+
+ long seqNum = -1;
+ List<Integer> pids = new ArrayList<Integer>();
+ long time = -1;
+ long allocAddr;
+ String allocPath;
+ String allocName;
+ if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_MEM_ALLOCATEDTRACE) {
+ List<Object> memAllocationData = tableData.getData();
+ seqNum = (Long) memAllocationData.get(0);
+ allocAddr = (Long) memAllocationData.get(3);
+ allocPath = (String) memAllocationData.get(5);
+ allocName = (String) memAllocationData.get(6);
+ for (int i : Global.getProject().getProcessIDs())
+ pids.add(i);
+ if (Toolbar.INSTANCE.getSelectedPid() > 0)
+ pids.add(Toolbar.INSTANCE.getSelectedPid());
+ time = (Long) memAllocationData.get(1);
+ } else { // in case table has LogData
+ return;
+ }
+
+ for (int pid : pids) {
+ Map<Long, CallStackUnit> addrMap = Global.getRuntimeCallstackManager().getCallStackApiAddrByPidMap(pid);
+ if ((null == addrMap) || (addrMap.isEmpty())) {
+ continue;
+ }
+
+ List<Long> addrs = getAddrs(seqNum);
+
+ if (null == addrs) {
+ addrs = getAddrs(Long.MAX_VALUE); // This case may occured if seq Num is above Long.MAX_VALUE
+ if (null == addrs) {
+ Logger.error("Function entry or exit not found");
+ continue;
+ }
+ }
+
+ {
+ DATableDataFormat callstackTableData = new DATableDataFormat(allocAddr);
+ callstackTableData.setType(AnalyzerConstants.TYPE_TABLE_MEM_CALLSTACK);
+ callstackTableData.setObject(allocAddr);
+ GridItem gridItem = new GridItem(table, SWT.NONE);
+ gridItem.setData(callstackTableData);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_ADDR,
+ allocAddr);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_PID, pid);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_TIME, time);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_LIBNAME, allocPath);
+
+ String addrInput = (allocAddr == 0) ? "" :Formatter.toHexString(Long.toString(allocAddr)); //$NON-NLS-1$
+ gridItem.setText(1, "Unknown");
+ gridItem.setText(0, allocName);
+ gridItem.setText(2, "Unknown");
+
+ gridItem = new GridItem(table, SWT.NONE);
+ gridItem.setData(callstackTableData);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_ADDR,
+ allocAddr);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_PID, pid);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_TIME, time);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_LIBNAME,
+ allocPath);
+
+ gridItem.setText(0, Global.getFunctionName((int) allocAddr));
+ gridItem.setText(1, addrInput);
+ gridItem.setText(2, allocPath);
+
+ }
+
+ int size = addrs.size();
+ for (int i = 0; i < size; i++) {
+ String hexAddr = Formatter.toHexString(addrs.get(i)
+ .toString());
+ CallStackUnit api = addrMap.get(addrs.get(i));
+
+ if (null == api) {
+ Logger.debug("callstackunit for addr : " + hexAddr
+ + " not found");
+ break;
+ }
+
+ String path = api.getPath();
+ if (null == path) {
+ Logger.debug("callstackunit for addr : " + hexAddr
+ + " not found");
+ break;
+ }
+
+ GridItem gridItem = new GridItem(table, SWT.NONE);
+
+ // setData block
+ {
+ long address = addrs.get(i);
+ DATableDataFormat callstackTableData = new DATableDataFormat(
+ address);
+ callstackTableData
+ .setType(AnalyzerConstants.TYPE_TABLE_MEM_CALLSTACK);
+ callstackTableData.setObject(address);
+ gridItem.setData(callstackTableData);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_ADDR,
+ address);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_PID,
+ pid);
+ gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_TIME,
+ time);
+ gridItem.setData(
+ AnalyzerConstants.CALLSTACK_KEY_LIBNAME, path);
+ }
+
+ String addrInput = (addrs.get(i) == 0) ? "" : hexAddr; //$NON-NLS-1$
+ gridItem.setText(1, addrInput);
+
+ String fName = api.getFunctionName();
+
+ gridItem.setText(0, fName);
+ gridItem.setText(2, path);
+ }
+ }
+ }
+ }
+
+ private List<Long> getAddrs(long seqNum) {
+ RuntimeCallstackManager callstackManager = Global.getRuntimeCallstackManager();
+ for (long i = seqNum; i >= 0; i--) {
+ Logger.setLogOn(false);
+ if (null != callstackManager.getCallstackAddrListFromSeq(i)) {
+ Logger.setLogOn(true);
+ return callstackManager.getCallstackAddrListFromSeq(i);
+ }
+ }
+ return null;
}
@Override
protected List<TableInput> makeTableInput() {
- // TODO Auto-generated method stub
return null;
}