SRADA-886 Memory Callstack logic implemented.
authorp.privalov <p.privalov@partner.samsung.com>
Thu, 4 Aug 2016 16:27:57 +0000 (19:27 +0300)
committerp.privalov <p.privalov@partner.samsung.com>
Thu, 15 Sep 2016 08:33:42 +0000 (11:33 +0300)
Memory callstack Table now able to fill itself with
callstack appended with allocation function.

Callstack is not complete yet due to lack of information.

Change-Id: I62a7695eb7a644ca72db78852f709d0da2acdeb2

org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/MemoryCallStackView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/table/MemoryCallStackTable.java

index 8cd58f7..6cbc519 100644 (file)
@@ -126,11 +126,7 @@ public class CallstackTable extends DATableComposite {
                                seqNum = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.SEQUENCE_NUMBER.index);
                                pid = (Integer) calltraceData.get(FunctionEntryDBTable.COLUMN.PID.index);
                                time = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.START_TIME.index);
-                       } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_MEM_ALLOCATEDTRACE) {
-                               GridItem gridItem = new GridItem(table, SWT.NONE);
-                               gridItem.setText(0, "Stub for callstack");
-                               return;
-                       }else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_INTERACTIVE) {
+                       } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_INTERACTIVE) {
                                return; // TODO
                        } else { // in case table has LogData
                                LogData logData = tableData.getLogData();
index 26b20d7..3b5759a 100644 (file)
@@ -34,7 +34,7 @@ import org.tizen.dynamicanalyzer.nl.InformationViewLabels;
 import org.tizen.dynamicanalyzer.nl.MemoryPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter;
-import org.tizen.dynamicanalyzer.ui.info.callstack.CallstackTable;
+import org.tizen.dynamicanalyzer.ui.memory.table.MemoryCallStackTable;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite;
 import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener;
 import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite;
@@ -65,7 +65,7 @@ public class MemoryCallStackView extends DAViewComposite {
                contents.setBackground(ColorResources.WINDOW_BG_COLOR);
                contents.setLayout(new FillLayout());
 
-               callstackTableComp = new CallstackTable(contents, SWT.NONE, SWT.SINGLE | SWT.BORDER
+               callstackTableComp = new MemoryCallStackTable(contents, SWT.NONE, SWT.SINGLE | SWT.BORDER
                                | SWT.H_SCROLL | SWT.V_SCROLL);
                callstackTableComp.setTableName("Callstack"); //$NON-NLS-1$
                callstackTableComp.setColumns(columnNames);
@@ -87,7 +87,7 @@ public class MemoryCallStackView extends DAViewComposite {
                DASelectionData seldata = (DASelectionData) data;
 
                if (seldata.getData() instanceof GridItem[]) {
-                       ((CallstackTable) callstackTableComp).updateCallstackTable(seldata);
+                       ((MemoryCallStackTable) callstackTableComp).updateCallstackTable(seldata);
                } else {
                        updateView();
                }
index 15b3163..7f5dd90 100644 (file)
 
 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 {
 
@@ -39,12 +58,180 @@ 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;
        }