Summary : process for the internal allocation data 54/36454/3
authorseokgil.kang <seokgil.kang@samsung.com>
Fri, 6 Mar 2015 12:20:31 +0000 (21:20 +0900)
committerseokgil.kang <seokgil.kang@samsung.com>
Fri, 3 Apr 2015 09:47:48 +0000 (18:47 +0900)
Change-Id: Ie42b58e7c8efd64648a81b491eb2e038cb9461a4
Signed-off-by: seokgil.kang <seokgil.kang@samsung.com>
15 files changed:
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/model/data/ProbeCommonData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/range/RangeDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/SummaryDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/CommonLeakData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalLeakData.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalLeakDataBundle.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalMemoryAllocationDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDataBundle.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDataMaker.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDetector.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/MemoryAllocationDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java

index 7c20ead..3f2f35c 100644 (file)
@@ -61,7 +61,7 @@ public class ProbeCommonData extends LogData {
 
        /* load from Database */
        public ProbeCommonData(long seq, long time, int apiId, int pid, int tid, String args,
-                       String ret, int errno) {
+                       String ret, long errno) {
                this.seq = seq;
                this.time = time;
                this.apiId = apiId;
index 246e366..9dbd2e8 100644 (file)
@@ -50,6 +50,8 @@ import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
 import org.tizen.dynamicanalyzer.swap.model.data.ProfileData;
 import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.GroupLeakData;
+import org.tizen.dynamicanalyzer.ui.summary.leaks.InternalLeakData;
+import org.tizen.dynamicanalyzer.ui.summary.leaks.InternalLeakDataBundle;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakData;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDataBundle;
 import org.tizen.dynamicanalyzer.ui.summary.profiling.FunctionSampleDBTable;
@@ -73,7 +75,8 @@ public class RangeDataManager implements Runnable {
        private HashMap<Integer, ProfileDataMaker> profileDataMakerMap = null;
        private HashMap<Integer, ProfileDataMaker> swapProfileDataMakerMap = null;
        private BaseCallstackManager swapCallstackManager = null;
-       private HashMap<Integer, List<GroupLeakData>> rangeGroupDataHashMap;
+       private Map<Integer, List<GroupLeakData>> rangeGroupDataHashMap;
+       private Map<Integer, List<InternalLeakData>> rangeInternalDataHashMap;
 
        private long markerStartTime = 0;
        private long markerEndTime = 0;
@@ -124,6 +127,8 @@ public class RangeDataManager implements Runnable {
                        swapProfileDataMakerMap.clear();
                if (rangeGroupDataHashMap != null)
                        rangeGroupDataHashMap.clear();
+               if (rangeInternalDataHashMap != null)
+                       rangeInternalDataHashMap.clear();
        }
 
        public void initRange() {
@@ -207,7 +212,7 @@ public class RangeDataManager implements Runnable {
                }
        }
        
-       public HashMap<Integer, List<GroupLeakData>> getRangeGroupDataHashMap() {
+       public Map<Integer, List<GroupLeakData>> getRangeGroupDataHashMap() {
                if (rangeGroupDataHashMap == null) {
                        rangeGroupDataHashMap = new HashMap<Integer, List<GroupLeakData>>();
                }
@@ -215,12 +220,33 @@ public class RangeDataManager implements Runnable {
                return rangeGroupDataHashMap;
        }
        
-       public HashMap<Integer, List<GroupLeakData>> getSelectedRangeGroupDataHashMap(List<Integer> selectedPids) {
-               if (selectedPids.size() == 1 && selectedPids.get(0) == 0)       // All process
+       public Map<Integer, List<InternalLeakData>> getRangeInternalDataHashMap() {
+               if (rangeInternalDataHashMap == null) {
+                       rangeInternalDataHashMap = new HashMap<Integer, List<InternalLeakData>>();
+               }
+               
+               return rangeInternalDataHashMap;
+       }
+       
+       public Map<Integer, List<GroupLeakData>> getSelectedRangeGroupDataHashMap(
+                       List<Integer> selectedPIDs) {
+               if (selectedPIDs.size() == 1 && selectedPIDs.get(0) == 0) // All process
                        return getRangeGroupDataHashMap();
-               HashMap<Integer, List<GroupLeakData>> selectedData = new HashMap<Integer, List<GroupLeakData>>();
+               Map<Integer, List<GroupLeakData>> selectedData = new HashMap<Integer, List<GroupLeakData>>();
+               for (Integer selectedPID : selectedPIDs) {
+                       selectedData.put(selectedPID, getRangeGroupDataHashMap().get(selectedPID));
+               }
+
+               return selectedData;
+       }
+       
+       public Map<Integer, List<InternalLeakData>> getSelectedRangeInternalDataHashMap(
+                       List<Integer> selectedPids) {
+               if (selectedPids.size() == 1 && selectedPids.get(0) == 0) // All process
+                       return getRangeInternalDataHashMap();
+               Map<Integer, List<InternalLeakData>> selectedData = new HashMap<Integer, List<InternalLeakData>>();
                for (Integer selectedPid : selectedPids) {
-                       selectedData.put(selectedPid, getRangeGroupDataHashMap().get(selectedPid));
+                       selectedData.put(selectedPid, getRangeInternalDataHashMap().get(selectedPid));
                }
 
                return selectedData;
@@ -392,8 +418,9 @@ public class RangeDataManager implements Runnable {
                        }
                }
 
-               // make range group data
+               // make range data for memory
                makeRangeData();
+               makeInternalRangeData();
 
                AnalyzerUtil.changePage(RangePage.pageID);
                final DAPageComposite page = AnalyzerManager.getCurrentPage();
@@ -441,7 +468,7 @@ public class RangeDataManager implements Runnable {
        }
        
        private void makeRangeData() {
-               HashMap<Integer, List<GroupLeakData>> rangeDataHashMap = getRangeGroupDataHashMap();
+               Map<Integer, List<GroupLeakData>> rangeDataHashMap = getRangeGroupDataHashMap();
                
                for (Map.Entry<Integer, LeakDataBundle> bundleEntry : AnalyzerManager.getLeakDetector()
                                .getLeakDataBundleHashMap().entrySet()) {
@@ -452,8 +479,8 @@ public class RangeDataManager implements Runnable {
                                        .getLeakDataMaker()
                                        .getLeakDataForRange(bundleEntry.getKey().intValue(),
                                                        Long.valueOf(markerStartTime), Long.valueOf(markerEndTime));
-                       if (rangeRSFromDB == null)
-                               return;
+//                     if (rangeRSFromDB == null)
+//                             return;
                        
                        List<GroupLeakData> groupDataList = leakBundle.makeRangeGroupData(rangeRSFromDB,
                                        markerStartTime, markerEndTime);
@@ -462,4 +489,25 @@ public class RangeDataManager implements Runnable {
                                rangeDataHashMap.put(bundleEntry.getKey(), groupDataList);
                }
        }
+       
+       private void makeInternalRangeData() {
+               Map<Integer, List<InternalLeakData>> rangeInternalDataHashMap = getRangeInternalDataHashMap();
+               
+               for (Map.Entry<Integer, InternalLeakDataBundle> bundleEntry : AnalyzerManager
+                               .getLeakDetector().getInternalLeakDataBundleHashMap().entrySet()) {
+                       InternalLeakDataBundle internalLeakBundle = bundleEntry.getValue();
+                       
+                       ResultSet internalRangeRSFromDB = SummaryDataManager
+                                       .getInstance()
+                                       .getLeakDataMaker()
+                                       .getInernalLeakDataForRange(bundleEntry.getKey().intValue(),
+                                                       Long.valueOf(markerStartTime), Long.valueOf(markerEndTime));
+                       
+                       List<InternalLeakData> internalDataList = internalLeakBundle.makeRangeInternalData(
+                                       internalRangeRSFromDB, markerStartTime, markerEndTime);
+                       
+                       if (internalDataList != null)
+                               rangeInternalDataHashMap.put(bundleEntry.getKey(), internalDataList);
+               }
+       }
 }
index 0b1d68e..a5129ed 100644 (file)
@@ -43,6 +43,9 @@ import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.ui.summary.failed.FailedApiDataDBTable;
 import org.tizen.dynamicanalyzer.ui.summary.failed.FailedApiDataMaker;
+import org.tizen.dynamicanalyzer.ui.summary.leaks.InternalLeakData;
+import org.tizen.dynamicanalyzer.ui.summary.leaks.InternalLeakDataBundle;
+import org.tizen.dynamicanalyzer.ui.summary.leaks.InternalMemoryAllocationDBTable;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDataBundle;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDataMaker;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.MemoryAllocationDBTable;
@@ -50,6 +53,7 @@ import org.tizen.dynamicanalyzer.ui.summary.leaks.LeakDetector;
 import org.tizen.dynamicanalyzer.ui.summary.leaks.MemoryAllocationDBTable.COLUMN;
 import org.tizen.dynamicanalyzer.ui.summary.warning.WarningDataDBTable;
 import org.tizen.dynamicanalyzer.ui.summary.warning.WarningDataMaker;
+import org.tizen.dynamicanalyzer.util.Logger;
 
 public class SummaryDataManager extends PageDataManager {
        private static SummaryDataManager instance = null;
@@ -58,15 +62,18 @@ public class SummaryDataManager extends PageDataManager {
        private WarningDataMaker warningDataMaker = null;
 
        private MemoryAllocationDBTable memoryAllocationTable = null;
+       private InternalMemoryAllocationDBTable internalMemoryAllocationTable = null;
        private FailedApiDataDBTable failedApiDataTable = null;
        private WarningDataDBTable warningDataDBTable = null;
 
        private SummaryDataManager() {
                memoryAllocationTable = new MemoryAllocationDBTable();
+               internalMemoryAllocationTable = new InternalMemoryAllocationDBTable();
                failedApiDataTable = new FailedApiDataDBTable();
                warningDataDBTable = new WarningDataDBTable();
 
-               leakDataMaker = new LeakDataMaker(DBInsertManager.makeInserter(memoryAllocationTable));
+               leakDataMaker = new LeakDataMaker(DBInsertManager.makeInserter(memoryAllocationTable),
+                               DBInsertManager.makeInserter(internalMemoryAllocationTable));
                failedApiDataMaker = new FailedApiDataMaker(
                                DBInsertManager.makeInserter(failedApiDataTable));
                warningDataMaker = new WarningDataMaker(warningDataDBTable);
@@ -87,6 +94,10 @@ public class SummaryDataManager extends PageDataManager {
        public DBTable getMemoryAllocationDBTable() {
                return memoryAllocationTable;
        }
+       
+       public DBTable getInternalMemoryAllocationDBTable() {
+               return internalMemoryAllocationTable;
+       }
 
        public DBTable getFailedApiDataDBTable() {
                return failedApiDataTable;
@@ -124,44 +135,67 @@ public class SummaryDataManager extends PageDataManager {
 
        @Override
        public void saveData(Map<String, String> dataMap) {
-               // Grouping - user direct allocation
-               leakDataMaker.saveLeakDataForGroup();
-               warningDataMaker.insertDBWhenSave();
+               // Memory
+               leakDataMaker.saveLeakDataForGroup();   // Grouping - user direct allocation
+               leakDataMaker.saveInternalLeakData();   // Internal allocation
+               
+               // Warning
+               warningDataMaker.insertDBWhenSave();    
        }
        
        @Override
        public void openData(Map<String, String> dataMap) {
-               // Grouping - user direct allocation
-               ResultSet rs = leakDataMaker.getLeakDataForGroupFromDB();
-               if (rs == null)
-                       return;
-               
                LeakDetector leakDetector = AnalyzerManager.getLeakDetector();
                leakDetector.clear();
                
-               HashMap<Integer, LeakDataBundle> leakDataBundleHashMap = leakDetector
-                               .getLeakDataBundleHashMap();
-               // TODO : optimize - get all process's range leak data
-               try {
-                       while (rs.next()) {
-                               int pid = rs.getInt(MemoryAllocationDBTable.COLUMN.PROCESS_ID.index + 1);
-                               LeakDataBundle bundleData = leakDataBundleHashMap.get(pid);
-                               if (bundleData == null) {
-                                       bundleData = new LeakDataBundle(pid);
+               // Memory (Grouping - user direct allocation)
+               ResultSet rs = leakDataMaker.getLeakDataForGroupFromDB();
+               if (rs != null) {
+                       Map<Integer, LeakDataBundle> leakDataBundleHashMap = leakDetector
+                                       .getLeakDataBundleHashMap();
+                       // TODO : optimize - get all process's range leak data
+                       try {
+                               while (rs.next()) {
+                                       int pid = rs.getInt(MemoryAllocationDBTable.COLUMN.PROCESS_ID.index + 1);
+                                       LeakDataBundle bundleData = leakDataBundleHashMap.get(pid);
+                                       if (bundleData == null) {
+                                               bundleData = new LeakDataBundle(pid);
+//                                             leakDataBundleHashMap.put(Integer.valueOf(pid), bundleData);
+                                       }
+                                       
+                                       bundleData.addLeakDataForOpen(rs);
                                        leakDataBundleHashMap.put(Integer.valueOf(pid), bundleData);
                                }
-                               
-                               bundleData.addLeakDataForOpen(rs);
-                               leakDataBundleHashMap.put(Integer.valueOf(pid), bundleData);
-                       }
-               } catch (SQLException e) {
-                       e.printStackTrace();
-               } finally {
-                       SqlConnectionManager.releaseResultSet(rs);
+                       } catch (SQLException e) {
+                               Logger.exception(e);
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(rs);
+                       }                       
                }
                
-               // TODO : Internal allocation
+               // Memory (Internal allocation)
+               ResultSet internalRS = leakDataMaker.getInternalLeakDataFromDB();
+               if (internalRS != null) {
+                       Map<Integer, InternalLeakDataBundle> internalLeakDataBundleHashMap = leakDetector
+                                       .getInternalLeakDataBundleHashMap();
+                       try {
+                               while (internalRS.next()) {
+                                       int pid = internalRS.getInt(InternalMemoryAllocationDBTable.COLUMN.PROCESS_ID.index + 1);
+                                       InternalLeakDataBundle bundleData = internalLeakDataBundleHashMap.get(pid);
+                                       if (bundleData == null) 
+                                               bundleData = new InternalLeakDataBundle(pid);
+                                       
+                                       bundleData.addInternalLeakData(internalRS);
+                                       internalLeakDataBundleHashMap.put(Integer.valueOf(pid), bundleData);
+                               }
+                       } catch (SQLException e) {
+                               Logger.exception(e);
+                       } finally {
+                               SqlConnectionManager.releaseResultSet(internalRS);
+                       }
+               }
                
+               // Warning
                warningDataMaker.selectDBWhenOpen();
        }
 }
index 47369e3..829772b 100644 (file)
@@ -267,25 +267,16 @@ public class FailedApiTable extends DATableComposite {
                                        .get(FailedApiDataDBTable.COLUMN_INDEX_CALLER_LIBRARY_NAME);
                        data.add(libName);
 
-                       // create images
-
                        // create DATableDataFormat
                        DATableDataFormat tableData = new DATableDataFormat(seq);
-                       // tableData.setObject(failedData);
                        // make ProbeCommonData for table data
-                       ProbeCommonData probeData = new ProbeCommonData();
-                       probeData.setSeq(seq);
-                       probeData.setApiName(apiName);
-                       probeData.setPid(pid);
-                       probeData.setTime(time);
-                       probeData.setArgs(args);
-                       probeData.setReturn(retValue);
-                       probeData.setErrNo(errNum);
+                       ProbeCommonData probeData = new ProbeCommonData(seq, time, apiId, pid, 0, args,
+                                       retValue, errNum);
+                       probeData.setId((Integer) idata.get(FailedApiDataDBTable.COLUMN_INDEX_MESSAGE_ID));
                        probeData.setCallerAddress(callerPcAddr);
                        probeData.setLibName(libName);
-                       probeData.setId((Integer) idata.get(FailedApiDataDBTable.COLUMN_INDEX_MESSAGE_ID));
+                       
                        tableData.setLogData(probeData);
-                       // tableData.setLogData(failedData.getData());
                        tableData.getData().addAll(data);
                        tableData.setType(AnalyzerConstants.TYPE_TABLE_FAILED);
 
index 44ae2a1..e05334f 100644 (file)
@@ -30,13 +30,13 @@ public class CommonLeakData {
        private int threadID;
        private int functionID;         // for api name
        private int binaryID;                   // for caller library name
-       private int apiID; // for double click action on table item
+       private int msgID; // for double click action on table item
        
-       public CommonLeakData(int threadID, int functionID, int binaryID, int apiID) {
+       public CommonLeakData(int threadID, int functionID, int binaryID, int msgID) {
                this.threadID = threadID;
                this.functionID = functionID;
                this.binaryID = binaryID;
-               this.apiID = apiID;
+               this.msgID = msgID;
        }
        
        public int getThreadID() {
@@ -51,7 +51,7 @@ public class CommonLeakData {
                return binaryID;
        }
        
-       public int getApiID() {
-               return apiID;
+       public int getMsgID() {
+               return msgID;
        }
 }
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalLeakData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalLeakData.java
new file mode 100644 (file)
index 0000000..d4a7e77
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.summary.leaks;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.tizen.dynamicanalyzer.common.Global;
+import org.tizen.dynamicanalyzer.project.LibraryObject;
+import org.tizen.dynamicanalyzer.project.ProcessInformation;
+import org.tizen.dynamicanalyzer.project.ProcessMemoryMap;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.swap.model.data.MemoryData;
+import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class InternalLeakData {
+       private long seq;
+       private int threadID;
+       private int functionID;         // for api name
+       private int binaryID;                   // for caller library name
+       private int msgID;      // for double click action on table item
+       private long callerPCAddr;
+       private long allocatedTime;
+       private long allocatedMemorySize;
+       
+       public InternalLeakData(LogData log) {
+               this.seq = log.getSeq();
+               this.threadID = ((ProbeCommonData) log).getTid();
+               this.functionID = ((ProbeCommonData) log).getApiId();
+               this.binaryID = getBinaryIDFromLogData(log);
+               this.msgID = log.getId();
+               this.callerPCAddr = ((ProbeCommonData) log).getCallerPcAddr();
+               this.allocatedTime = log.getTime();
+               this.allocatedMemorySize = ((MemoryData) log).getSize();
+       }
+       
+       public InternalLeakData(ResultSet rs) throws SQLException {
+               this.seq = rs.getLong(InternalMemoryAllocationDBTable.COLUMN.SEQUENCE_NUMBER.index + 1);
+               this.threadID = rs.getInt(InternalMemoryAllocationDBTable.COLUMN.THREAD_ID.index + 1);
+               this.functionID = rs.getInt(InternalMemoryAllocationDBTable.COLUMN.FUNCTION_ID.index + 1);
+               this.binaryID = rs.getInt(InternalMemoryAllocationDBTable.COLUMN.BINARY_ID.index + 1);
+               this.msgID = rs.getInt(InternalMemoryAllocationDBTable.COLUMN.MESSAGE_ID.index + 1);
+               this.callerPCAddr = rs
+                               .getLong(InternalMemoryAllocationDBTable.COLUMN.CALLER_PC_ADDRESS.index + 1);
+               this.allocatedTime = rs
+                               .getLong(InternalMemoryAllocationDBTable.COLUMN.ALLOCATED_TIME.index + 1);
+               this.allocatedMemorySize = rs
+                               .getLong(InternalMemoryAllocationDBTable.COLUMN.ALLOCATED_MEMORY_SIZE.index);   
+       }
+       
+       public long getSequenceNumber() {
+               return seq;
+       }
+       
+       public int getThreadID() {
+               return threadID;
+       }
+       
+       public int getFunctionID() {
+               return functionID;
+       }
+       
+       public int getBinaryID() {
+               return binaryID;
+       }
+       
+       public int getMsgID() {
+               return msgID;
+       }
+       
+       public long getCallerPCAddress() {
+               return callerPCAddr;
+       }
+       
+       public long getAllocatedTime() {
+               return allocatedTime;
+       }
+       
+       public long getAllocatedMemorySize() {
+               return allocatedMemorySize;
+       }
+       
+       private int getBinaryIDFromLogData(LogData log) {
+               ProcessInformation process = Global.getProject().getProcessInformation(log.getPid());
+               long time = log.getTime();
+               if (time > 0) {
+                       LibraryObject obj = null;
+                       ProcessMemoryMap pmap = process.getProcessMemoryMap(time);
+                       if (pmap == null
+                                       || (obj = pmap.getLibraryByAddress(((ProbeCommonData) log).getCallerPcAddr())) == null) {
+                               return -1;
+                       } else {
+                               return obj.getBinaryID();
+                       }
+               } else {
+                       return -1;
+               }
+       }
+
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalLeakDataBundle.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalLeakDataBundle.java
new file mode 100644 (file)
index 0000000..671942c
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.summary.leaks;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.swap.model.data.MemoryData;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class InternalLeakDataBundle {
+       private int pid;
+       private Map<Long, InternalLeakData> internalLeakDataHashMap;
+       private Map<Long, InternalLeakData> rangeInternalLeakDataHashMap;
+       
+       public InternalLeakDataBundle(int pid) {
+               this.pid = pid;
+               internalLeakDataHashMap = new ConcurrentHashMap<Long, InternalLeakData>();
+               rangeInternalLeakDataHashMap = new HashMap<Long, InternalLeakData>();
+       }
+       
+       public Map<Long, InternalLeakData> getInternalLeakDataHashMap() {
+               return internalLeakDataHashMap;
+       }
+       
+       public Map<Long, InternalLeakData> getRangeInternalLeakDataHashMap() {
+               return rangeInternalLeakDataHashMap;
+       }
+       
+       public InternalLeakData getInternalLeakData(long allocatedAddress) {
+               return internalLeakDataHashMap.get((Long) allocatedAddress);
+       }
+       
+       public void addInternalLeakData(LogData log) {
+               checkReallocApi(log);
+               InternalLeakData data = new InternalLeakData(log);
+               internalLeakDataHashMap.put(Long.valueOf(((MemoryData) log).getAddress()), data);
+       }
+       
+       public void addInternalLeakData(ResultSet rs) throws SQLException {
+               InternalLeakData internalData = new InternalLeakData(rs);
+               internalLeakDataHashMap.put(Long.valueOf(rs
+                               .getLong(InternalMemoryAllocationDBTable.COLUMN.ALLOCATED_ADDRESS.index + 1)),
+                               internalData);
+       }
+       
+       public void removeInternalLeakData(long address) {
+               InternalLeakData data = internalLeakDataHashMap.remove((Long) address);
+               if (data == null) {
+                       Logger.error("Management of InternalLeakData is failed !!");
+               }
+       }
+       
+       public List<InternalLeakData> makeRangeInternalData(ResultSet rangeRSFromDB, long startTime,
+                       long endTime) {
+               if (rangeInternalLeakDataHashMap != null && rangeInternalLeakDataHashMap.size() > 0)
+                       rangeInternalLeakDataHashMap.clear();
+               
+               List<InternalLeakData> internalDataList = new ArrayList<InternalLeakData>();
+               
+               // make range data - memory data
+               Iterator<Map.Entry<Long, InternalLeakData>> iter = internalLeakDataHashMap.entrySet().iterator();
+               while (iter.hasNext()) {
+                       Map.Entry<Long, InternalLeakData> iterData = iter.next();
+                       Long key = iterData.getKey();
+                       InternalLeakData internalData = iterData.getValue();
+                       if (internalData != null) {
+                               if (internalData.getAllocatedTime() >= startTime && internalData.getAllocatedTime() <= endTime) {
+                                       rangeInternalLeakDataHashMap.put(key, internalData);
+                               }                               
+                       }
+               }
+               
+               // make range data - db data
+               if (rangeRSFromDB != null)
+                       addInternalDataFromDBForRange(rangeRSFromDB);
+               
+               internalDataList.addAll(rangeInternalLeakDataHashMap.values());
+               return internalDataList;
+       }
+       
+       private void checkReallocApi(LogData log) {
+               if (log instanceof MemoryData) {
+                       MemoryData mlog = (MemoryData) log;
+                       if (mlog.getApiName().contains("realloc")) {
+                               String inputParam = mlog.getArgs();
+                               String[] splitInputParam = inputParam.split("\\,"); //$NON-NLS-1$
+                               String param = String.valueOf(splitInputParam[0]);
+                               long rmKey = -1;
+                               try {
+                                       if (param.contains("0x")) {
+                                               // The 'param' is a decoding value and it was a memory address assigned previously.
+                                               // This part is actually used.
+                                               rmKey = Long.decode(param);
+                                       } else {
+                                               rmKey = Long.parseLong(splitInputParam[0]);
+                                       }
+                                       internalLeakDataHashMap.remove(rmKey);
+                               } catch (NumberFormatException e) {
+                                       Logger.exception(e);
+                               }
+                       }
+               }
+       }
+       
+       private void addInternalDataFromDBForRange(ResultSet rs) {
+               try {
+                       while (rs.next()) {
+                               rangeInternalLeakDataHashMap
+                                               .put(rs.getLong(InternalMemoryAllocationDBTable.COLUMN.ALLOCATED_ADDRESS.index + 1),
+                                                               new InternalLeakData(rs));
+                       }
+               } catch (SQLException e) {
+                       Logger.exception(e);
+               } finally {
+                       SqlConnectionManager.releaseResultSet(rs);
+               }
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalMemoryAllocationDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/InternalMemoryAllocationDBTable.java
new file mode 100644 (file)
index 0000000..5e161f1
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * Seokgil Kang <seokgil.kang@samsung.com>
+ * Juyoung Kim <j0.kim@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * Contributors:
+ * - S-Core Co., Ltd
+ * 
+ */
+
+package org.tizen.dynamicanalyzer.ui.summary.leaks;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+import org.tizen.dynamicanalyzer.util.Logger;
+
+public class InternalMemoryAllocationDBTable extends DBTable {
+       private static final String TABLENAME = "INTERNAL_MEMORY_ALLOCATION";
+       
+       public static final String SELECT_COLUMN_FOR_RANGE = 
+                       COLUMN.SEQUENCE_NUMBER.name + CommonConstants.COMMA + 
+                       COLUMN.PROCESS_ID.name + CommonConstants.COMMA + 
+                       COLUMN.THREAD_ID.name + CommonConstants.COMMA +
+                       COLUMN.BINARY_ID.name + CommonConstants.COMMA +
+                       COLUMN.FUNCTION_ID.name + CommonConstants.COMMA + 
+                       COLUMN.MESSAGE_ID.name + CommonConstants.COMMA +
+                       COLUMN.CALLER_PC_ADDRESS.name + CommonConstants.COMMA +
+                       COLUMN.ALLOCATED_ADDRESS.name + CommonConstants.COMMA +
+                       COLUMN.ALLOCATED_TIME.name + CommonConstants.COMMA +
+                       COLUMN.ALLOCATED_MEMORY_SIZE.name;
+       
+       public static final String INTERNAL_RANGE_SELECT_QUERY_WITH_PID = 
+                       "select " + InternalMemoryAllocationDBTable.SELECT_COLUMN_FOR_RANGE + 
+                       " from " + TABLENAME +
+                       " where " + COLUMN.PROCESS_ID.name + " = %s and " +
+                       COLUMN.ALLOCATED_TIME.name + " between %s and %s and (" +
+                       COLUMN.FREE_TIME.name + " > %s)";
+       
+       public static final String OPEN_INTERNAL_DATA_SELECT_QUERY =
+                       "select " + InternalMemoryAllocationDBTable.SELECT_COLUMN_FOR_RANGE +
+                       " from " + TABLENAME +
+                       " where " + COLUMN.FREE_TIME.name + " = -1";
+       
+       public enum COLUMN {
+               SEQUENCE_NUMBER(0, DBConstants.DBCOLUMN_SEQUENCE_NUMBER),
+               PROCESS_ID(1, DBConstants.DBCOLUMN_PROCESS_ID),
+               THREAD_ID(2, DBConstants.DBCOLUMN_THREAD_ID),
+               BINARY_ID(3, "BINARY_ID"),
+               FUNCTION_ID(4, DBConstants.DBCOLUMN_FUNCTION_ID),
+               MESSAGE_ID(5, "MESSAGE_ID"),
+               CALLER_PC_ADDRESS(6, DBConstants.DBCOLUMN_CALLER_PC_ADDRESS),
+               ALLOCATED_ADDRESS(7, "ALLOCATED_ADDRESS"),
+               ALLOCATED_TIME(8, "ALLOCATED_TIME"),
+               FREE_TIME(9, "FREE_TIME"),
+               ALLOCATED_MEMORY_SIZE(10, "ALLOCATED_MEMORY_SIZE");
+               
+               public final int index;
+               public final String name;
+               
+               COLUMN(int index, String name) {
+                       this.index = index;
+                       this.name = name;
+               }
+       }               
+                       
+       @Override
+       public String getTableName() {
+               return TABLENAME;
+       }
+       
+       public InternalMemoryAllocationDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQUENCE_NUMBER.name, DBConstants.PRIMARY_KEY,
+                               DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.PROCESS_ID.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.THREAD_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.BINARY_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.FUNCTION_ID.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.MESSAGE_ID.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.CALLER_PC_ADDRESS.name, DBConstants.EMPTY,
+                               DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.ALLOCATED_ADDRESS.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG)); // default:-1
+               addColumn(new DBColumn(COLUMN.ALLOCATED_TIME.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.FREE_TIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.ALLOCATED_MEMORY_SIZE.name, DBConstants.NOT_NULL,
+                               DBConstants.DBTYPE_LONG));
+               setIndexColumn(COLUMN.ALLOCATED_TIME.index);
+               setIndexColumn(COLUMN.FREE_TIME.index);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setLong(COLUMN.SEQUENCE_NUMBER.index + 1,
+                                               (Long) (rowData.get(COLUMN.SEQUENCE_NUMBER.index)));
+                               prep.setInt(COLUMN.PROCESS_ID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.PROCESS_ID.index)));
+                               prep.setInt(COLUMN.THREAD_ID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.THREAD_ID.index)));
+                               prep.setInt(COLUMN.BINARY_ID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.BINARY_ID.index)));
+                               prep.setInt(COLUMN.FUNCTION_ID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.FUNCTION_ID.index)));
+                               prep.setInt(COLUMN.MESSAGE_ID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.MESSAGE_ID.index)));
+                               prep.setLong(COLUMN.CALLER_PC_ADDRESS.index + 1,
+                                               (Long) (rowData.get(COLUMN.CALLER_PC_ADDRESS.index)));
+                               prep.setLong(COLUMN.ALLOCATED_ADDRESS.index + 1,
+                                               (Long) (rowData.get(COLUMN.ALLOCATED_ADDRESS.index)));
+                               prep.setLong(COLUMN.ALLOCATED_TIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.ALLOCATED_TIME.index)));
+                               prep.setLong(COLUMN.FREE_TIME.index + 1,
+                                               (Long) (rowData.get(COLUMN.FREE_TIME.index)));
+                               prep.setLong(COLUMN.ALLOCATED_MEMORY_SIZE.index + 1,
+                                               (Long) (rowData.get(COLUMN.ALLOCATED_MEMORY_SIZE.index)));
+                       } catch (SQLException e) {
+                               Logger.exception(e);
+                               isPrepared = false;
+                       }
+               }
+
+               return isPrepared;
+       }
+
+       @Override
+       public List<Object> extractDataFromResultSet(ResultSet rs) {
+               List<Object> row = new ArrayList<Object>();
+               try {
+                       row.add(Long.valueOf(rs.getLong(COLUMN.SEQUENCE_NUMBER.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PROCESS_ID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.THREAD_ID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.BINARY_ID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.FUNCTION_ID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.MESSAGE_ID.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.CALLER_PC_ADDRESS.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ALLOCATED_ADDRESS.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ALLOCATED_TIME.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.FREE_TIME.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ALLOCATED_MEMORY_SIZE.index + 1)));
+               } catch (SQLException e) {
+                       Logger.exception(e);
+                       return null;
+               }
+               
+               return row;
+       }
+}
index f9fac69..d09eab3 100644 (file)
@@ -48,10 +48,10 @@ import org.tizen.dynamicanalyzer.util.Logger;
 public class LeakDataBundle {
        private int pid;
        private ArrayList<CommonLeakData> commonLeakDataList;
-       private HashMap<Integer, Integer> commonLeakDataIndexHashMap;
+       private Map<Integer, Integer> commonLeakDataIndexHashMap;
        private HashMap<Long, LeakData> leakDataHashMap;
-       private HashMap<Integer, GroupLeakData> groupLeakDataHashMap;
-       private HashMap<Integer, GroupLeakData> rangeGroupLeakDataHashMap;
+       private Map<Integer, GroupLeakData> groupLeakDataHashMap;
+       private Map<Integer, GroupLeakData> rangeGroupLeakDataHashMap;
 
        public LeakDataBundle(int pid) {
                this.pid = pid;
@@ -66,7 +66,7 @@ public class LeakDataBundle {
                return commonLeakDataList;
        }
 
-       public HashMap<Integer, Integer> getCommonLeakDataIndexHashMap() {
+       public Map<Integer, Integer> getCommonLeakDataIndexHashMap() {
                return commonLeakDataIndexHashMap;
        }
 
@@ -74,11 +74,11 @@ public class LeakDataBundle {
                return leakDataHashMap;
        }
 
-       public HashMap<Integer, GroupLeakData> getGroupLeakDataHashMap() {
+       public Map<Integer, GroupLeakData> getGroupLeakDataHashMap() {
                return groupLeakDataHashMap;
        }
        
-       public HashMap<Integer, GroupLeakData> getRangeGroupLeakDataHashMap() {
+       public Map<Integer, GroupLeakData> getRangeGroupLeakDataHashMap() {
                return rangeGroupLeakDataHashMap;
        }
 
@@ -117,8 +117,7 @@ public class LeakDataBundle {
                /* remove leak data */
                LeakData data = leakDataHashMap.remove(Long.valueOf(allocatedAddress));
                if (data == null) {
-                       // TODO : remove when support the running process
-                       Logger.debug("LeakData is null !!");
+                       Logger.error("Management of LeakData is failed !!");
                        return;
                }
 
@@ -128,7 +127,7 @@ public class LeakDataBundle {
        
        public List<GroupLeakData> makeRangeGroupData(ResultSet rangeRSFromDB, long startTime,
                        long endTime) {
-               if (rangeGroupLeakDataHashMap != null)
+               if (rangeGroupLeakDataHashMap != null && rangeGroupLeakDataHashMap.size() > 0)
                        rangeGroupLeakDataHashMap.clear();
                
                List<GroupLeakData> groupDataList = new ArrayList<GroupLeakData>();
@@ -151,9 +150,12 @@ public class LeakDataBundle {
                }
                
                // make range group - db data
-               updateGroupDataForRange(rangeRSFromDB);
+               if (rangeRSFromDB != null)
+                       updateGroupDataForRange(rangeRSFromDB);
+               
+               if (rangeGroupLeakDataHashMap != null)
+                       groupDataList.addAll(rangeGroupLeakDataHashMap.values());
                
-               groupDataList.addAll(rangeGroupLeakDataHashMap.values());
                return groupDataList;
        }
 
@@ -224,14 +226,14 @@ public class LeakDataBundle {
                int threadID = ((ProbeCommonData) log).getTid();
                int functionID = ((ProbeCommonData) log).getApiId();
                int binaryID = getBinaryIDFromLogData(log);
-               int apiID = log.getId();
+               int msgID = log.getId();
                // TODO : validation check for binary ID
 
                int key = makeCommonLeakDataKey(threadID, functionID, binaryID);
                commonDataIndex = commonLeakDataIndexHashMap.get(Integer.valueOf(key));
                if (commonDataIndex == null) {
                        commonDataIndex = Integer
-                                       .valueOf(addLeakCommonData(threadID, functionID, binaryID, apiID, key));
+                                       .valueOf(addLeakCommonData(threadID, functionID, binaryID, msgID, key));
                }
 
                return commonDataIndex.intValue();
@@ -242,14 +244,14 @@ public class LeakDataBundle {
                int threadID = rs.getInt(MemoryAllocationDBTable.COLUMN.THREAD_ID.index + 1);
                int functionID = rs.getInt(MemoryAllocationDBTable.COLUMN.FUNCTION_ID.index + 1);
                int binaryID = rs.getInt(MemoryAllocationDBTable.COLUMN.BINARY_ID.index + 1);
-               int apiID = rs.getInt(MemoryAllocationDBTable.COLUMN.API_ID.index + 1);
+               int msgID = rs.getInt(MemoryAllocationDBTable.COLUMN.MESSAGE_ID.index + 1);
                // TODO : validation check for binary ID
 
                int key = makeCommonLeakDataKey(threadID, functionID, binaryID);
                commonDataIndex = commonLeakDataIndexHashMap.get(Integer.valueOf(key));
                if (commonDataIndex == null) {
                        commonDataIndex = Integer
-                                       .valueOf(addLeakCommonData(threadID, functionID, binaryID, apiID, key));
+                                       .valueOf(addLeakCommonData(threadID, functionID, binaryID, msgID, key));
                }
 
                return commonDataIndex.intValue();
index 62e441f..5f2c58f 100644 (file)
@@ -42,90 +42,174 @@ import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
 public class LeakDataMaker {
        private LeakDetector leakDetector = AnalyzerManager.getLeakDetector();
        private ArrayList<List<Object>> memoryDataList;
+       private ArrayList<List<Object>> internalMemoryDataList;
        private DBInserter memoryDBInserter = null;
-       
-       public LeakDataMaker(DBInserter allocInserter) {
+       private DBInserter internalMemoryDBInserter = null;
+
+       public LeakDataMaker(DBInserter allocInserter, DBInserter internalAllocInserter) {
                memoryDataList = new ArrayList<List<Object>>();
+               internalMemoryDataList = new ArrayList<List<Object>>();
                memoryDBInserter = allocInserter;
+               internalMemoryDBInserter = internalAllocInserter;
        }
-       
+
        public void makeData(CommonLeakData commonData, LeakData leakData, LogData log) {
                ArrayList<Object> dbLeakData = new ArrayList<Object>();
                MemoryData mData = (MemoryData) log;
-               
+
                dbLeakData.add(Long.valueOf(leakData.getSequenceNumber()));
                dbLeakData.add(Integer.valueOf(mData.getPid()));
                dbLeakData.add(Integer.valueOf(commonData.getThreadID()));
                dbLeakData.add(Integer.valueOf(commonData.getBinaryID()));
                dbLeakData.add(Integer.valueOf(commonData.getFunctionID()));
-               dbLeakData.add(Integer.valueOf(commonData.getApiID()));
+               dbLeakData.add(Integer.valueOf(commonData.getMsgID()));
                dbLeakData.add(Long.valueOf(leakData.getCallerPCAddress()));
                dbLeakData.add(Long.valueOf(mData.getAddress()));
                dbLeakData.add(Long.valueOf(leakData.getAllocatedTime()));
                dbLeakData.add(Long.valueOf(mData.getTime()));
                dbLeakData.add(Long.valueOf(leakData.getAllocatedMemorySize()));
-               
+
                memoryDataList.add(dbLeakData);
                @SuppressWarnings("unchecked")
                List<List<Object>> mList = (List<List<Object>>) memoryDataList.clone();
                memoryDataList.clear();
-               
-               memoryDBInserter.pushData(mList);               
+
+               memoryDBInserter.pushData(mList);
        }
-       
+
+       public void makeInternalData(InternalLeakData leakData, LogData log) {
+               ArrayList<Object> dbInternalLeakData = new ArrayList<Object>();
+               MemoryData mData = (MemoryData) log;
+
+               dbInternalLeakData.add(Long.valueOf(leakData.getSequenceNumber()));
+               dbInternalLeakData.add(Integer.valueOf(mData.getPid()));
+               dbInternalLeakData.add(Integer.valueOf(leakData.getThreadID()));
+               dbInternalLeakData.add(Integer.valueOf(leakData.getBinaryID()));
+               dbInternalLeakData.add(Integer.valueOf(leakData.getFunctionID()));
+               dbInternalLeakData.add(Integer.valueOf(leakData.getMsgID()));
+               dbInternalLeakData.add(Long.valueOf(leakData.getCallerPCAddress()));
+               dbInternalLeakData.add(Long.valueOf(mData.getAddress()));
+               dbInternalLeakData.add(Long.valueOf(leakData.getAllocatedTime()));
+               dbInternalLeakData.add(Long.valueOf(mData.getTime()));
+               dbInternalLeakData.add(Long.valueOf(leakData.getAllocatedMemorySize()));
+
+               internalMemoryDataList.add(dbInternalLeakData);
+               @SuppressWarnings("unchecked")
+               List<List<Object>> mList = (List<List<Object>>) internalMemoryDataList.clone();
+               internalMemoryDataList.clear();
+
+               internalMemoryDBInserter.pushData(mList);
+       }
+
        public void saveLeakDataForGroup() {
-               HashMap<Integer, LeakDataBundle> leakDataBundleHashMap = leakDetector.getLeakDataBundleHashMap();
+               Map<Integer, LeakDataBundle> leakDataBundleHashMap = leakDetector
+                               .getLeakDataBundleHashMap();
                for (Map.Entry<Integer, LeakDataBundle> bundleEntry : leakDataBundleHashMap.entrySet()) {
                        LeakDataBundle iLeakDataBundle = bundleEntry.getValue();
-                       makeMemoryAllocationDBRecord(bundleEntry.getKey().intValue(),
-                                       iLeakDataBundle);
+                       makeMemoryAllocationDBRecord(bundleEntry.getKey().intValue(), iLeakDataBundle);
                }
-               
+
                @SuppressWarnings("unchecked")
                List<List<Object>> mList = (List<List<Object>>) memoryDataList.clone();
                memoryDataList.clear();
-               
+
                SummaryDataManager.getInstance().getMemoryAllocationDBTable().insertData(mList);
        }
+
+       public void saveInternalLeakData() {
+               Map<Integer, InternalLeakDataBundle> internalLeakDataBundleHashMap = leakDetector
+                               .getInternalLeakDataBundleHashMap();
+               for (Map.Entry<Integer, InternalLeakDataBundle> bundleEntry : internalLeakDataBundleHashMap
+                               .entrySet()) {
+                       InternalLeakDataBundle iInternalLeakDataBundle = bundleEntry.getValue();
+                       makeInternalMemoryAllocationDBRecord(bundleEntry.getKey().intValue(), iInternalLeakDataBundle);
+               }
+               
+               @SuppressWarnings("unchecked")
+               List<List<Object>> mList = (List<List<Object>>) internalMemoryDataList.clone();
+               internalMemoryDataList.clear();
+
+               SummaryDataManager.getInstance().getInternalMemoryAllocationDBTable().insertData(mList);
+       }
+
+       public void clear() {
+               memoryDataList.clear();
+               internalMemoryDataList.clear();
+               memoryDBInserter.clear();
+               internalMemoryDBInserter.clear();
+       }
+
+       public ResultSet getLeakDataForGroupFromDB() {
+               String query = String.format(MemoryAllocationDBTable.OPEN_DATA_SELECT_QUERY);
+               return SqlConnectionManager.executeQueryRS(query);
+       }
+       
+       public ResultSet getInternalLeakDataFromDB() {
+               String query = String
+                               .format(InternalMemoryAllocationDBTable.OPEN_INTERNAL_DATA_SELECT_QUERY);
+               return SqlConnectionManager.executeQueryRS(query);
+       }
+
+       public ResultSet getLeakDataForRange(int pid, long startTime, long endTime) {
+               String query = String.format(MemoryAllocationDBTable.RANGE_SELECT_QUERY_WITH_PID, pid, Long
+                               .valueOf(startTime).toString(), Long.valueOf(endTime).toString(),
+                               Long.valueOf(endTime).toString());
+               return SqlConnectionManager.executeQueryRS(query);
+       }
+
+       public ResultSet getInernalLeakDataForRange(int pid, long startTime, long endTime) {
+               String query = String.format(
+                               InternalMemoryAllocationDBTable.INTERNAL_RANGE_SELECT_QUERY_WITH_PID, pid, Long
+                                               .valueOf(startTime).toString(), Long.valueOf(endTime).toString(), Long
+                                               .valueOf(endTime).toString());
+               return SqlConnectionManager.executeQueryRS(query);
+       }
        
        private void makeMemoryAllocationDBRecord(int pid, LeakDataBundle bundleData) {
                HashMap<Long, LeakData> leakDataHashMap = bundleData.getLeakDataHashMap();
                for (Map.Entry<Long, LeakData> leakEntry : leakDataHashMap.entrySet()) {
                        List<Object> leakData = new ArrayList<Object>();
-                       
+
                        LeakData iLeakData = leakEntry.getValue();
-                       CommonLeakData commonData = bundleData.getCommonLeakData(leakEntry.getKey().longValue());
-                       
+                       CommonLeakData commonData = bundleData
+                                       .getCommonLeakData(leakEntry.getKey().longValue());
+
                        leakData.add(Long.valueOf(iLeakData.getSequenceNumber()));
                        leakData.add(Integer.valueOf(pid));
                        leakData.add(Integer.valueOf(commonData.getThreadID()));
                        leakData.add(Integer.valueOf(commonData.getBinaryID()));
                        leakData.add(Integer.valueOf(commonData.getFunctionID()));
-                       leakData.add(Integer.valueOf(commonData.getApiID()));
+                       leakData.add(Integer.valueOf(commonData.getMsgID()));
                        leakData.add(Long.valueOf(iLeakData.getCallerPCAddress()));
                        leakData.add(leakEntry.getKey());
                        leakData.add(Long.valueOf(iLeakData.getAllocatedTime()));
-                       leakData.add(Long.valueOf(-1));         // free time - default value (-1)
+                       leakData.add(Long.valueOf(-1)); // free time - default value (-1)
                        leakData.add(Long.valueOf(iLeakData.getAllocatedMemorySize()));
-                       
+
                        memoryDataList.add(leakData);
                }
        }
-
-       public void clear() {
-               memoryDataList.clear(); 
-               memoryDBInserter.clear();
-       }
        
-       public ResultSet getLeakDataForGroupFromDB() {
-               String query = String.format(MemoryAllocationDBTable.OPEN_DATA_SELECT_QUERY);
-               return SqlConnectionManager.executeQueryRS(query);
-       }
-       
-       public ResultSet getLeakDataForRange(int pid, long startTime, long endTime) {
-               String query = String.format(MemoryAllocationDBTable.RANGE_SELECT_QUERY_WITH_PID, pid, 
-                               Long.valueOf(startTime).toString(), Long.valueOf(endTime).toString(),
-                               Long.valueOf(endTime).toString());
-               return SqlConnectionManager.executeQueryRS(query);
+       private void makeInternalMemoryAllocationDBRecord(int pid, InternalLeakDataBundle bundleData) {
+               Map<Long, InternalLeakData> internalDataHashMap = bundleData.getInternalLeakDataHashMap();
+               for (Map.Entry<Long, InternalLeakData> leakEntry : internalDataHashMap.entrySet()) {
+                       List<Object> internalData = new ArrayList<Object>();
+
+                       InternalLeakData iInternalData = leakEntry.getValue();
+
+                       internalData.add(Long.valueOf(iInternalData.getSequenceNumber()));
+                       internalData.add(Integer.valueOf(pid));
+                       internalData.add(Integer.valueOf(iInternalData.getThreadID()));
+                       internalData.add(Integer.valueOf(iInternalData.getBinaryID()));
+                       internalData.add(Integer.valueOf(iInternalData.getFunctionID()));
+                       internalData.add(Integer.valueOf(iInternalData.getMsgID()));
+                       internalData.add(Long.valueOf(iInternalData.getCallerPCAddress()));
+                       internalData.add(leakEntry.getKey());
+                       internalData.add(Long.valueOf(iInternalData.getAllocatedTime()));
+                       internalData.add(Long.valueOf(-1)); // free time - default value (-1)
+                       internalData.add(Long.valueOf(iInternalData.getAllocatedMemorySize()));
+
+                       internalMemoryDataList.add(internalData);
+               }
        }
 }
index 19d11b7..21cbb8b 100644 (file)
@@ -29,6 +29,7 @@ package org.tizen.dynamicanalyzer.ui.summary.leaks;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.tizen.dynamicanalyzer.common.DALimit;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
@@ -40,26 +41,47 @@ import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
 import org.tizen.dynamicanalyzer.ui.toolbar.setting.data.SettingConstants;
 import org.tizen.dynamicanalyzer.ui.toolbar.setting.data.SettingDataManager;
 import org.tizen.dynamicanalyzer.ui.toolbar.setting.data.TargetData;
+import org.tizen.dynamicanalyzer.util.Logger;
 
 public class LeakDetector {
-       HashMap<Integer, LeakDataBundle> leakDataBundleHashMap;
+       Map<Integer, LeakDataBundle> leakDataBundleHashMap;
+       Map<Integer, InternalLeakDataBundle> internalLeakDataBundleHashMap;
 
        public LeakDetector() {
        }
        
-       public HashMap<Integer, LeakDataBundle> getLeakDataBundleHashMap() {
+       public Map<Integer, LeakDataBundle> getLeakDataBundleHashMap() {
                if (leakDataBundleHashMap == null) {
-                       leakDataBundleHashMap = new HashMap<Integer, LeakDataBundle>();
+                       leakDataBundleHashMap = new ConcurrentHashMap<Integer, LeakDataBundle>();
                }
                return leakDataBundleHashMap;
        }
        
-       public HashMap<Integer, LeakDataBundle> getSelectedLeakDataBundleHashMap(List<Integer> selectedPids) {
-               if (selectedPids.size() == 1 && selectedPids.get(0) == 0) // All process
+       public Map<Integer, InternalLeakDataBundle> getInternalLeakDataBundleHashMap() {
+               if (internalLeakDataBundleHashMap == null) {
+                       internalLeakDataBundleHashMap = new ConcurrentHashMap<Integer, InternalLeakDataBundle>();
+               }
+               return internalLeakDataBundleHashMap;
+       }
+       
+       public Map<Integer, LeakDataBundle> getSelectedLeakDataBundleHashMap(List<Integer> selectedPIDs) {
+               if (selectedPIDs.size() == 1 && selectedPIDs.get(0) == 0) // All process
                        return getLeakDataBundleHashMap();
-               HashMap<Integer, LeakDataBundle> selectedBundle = new HashMap<Integer, LeakDataBundle>();
+               Map<Integer, LeakDataBundle> selectedBundle = new HashMap<Integer, LeakDataBundle>();
+               for (Integer selectedPID : selectedPIDs) {
+                       selectedBundle.put(selectedPID, getLeakDataBundleHashMap().get(selectedPID));
+               }
+
+               return selectedBundle;
+       }
+       
+       public Map<Integer, InternalLeakDataBundle> getSelectedInternalLeakDataBundleHashMap(
+                       List<Integer> selectedPids) {
+               if (selectedPids.size() == 1 && selectedPids.get(0) == 0) // All process
+                       return getInternalLeakDataBundleHashMap();
+               Map<Integer, InternalLeakDataBundle> selectedBundle = new HashMap<Integer, InternalLeakDataBundle>();
                for (Integer selectedPid : selectedPids) {
-                       selectedBundle.put(selectedPid, getLeakDataBundleHashMap().get(selectedPid));
+                       selectedBundle.put(selectedPid, getInternalLeakDataBundleHashMap().get(selectedPid));
                }
 
                return selectedBundle;
@@ -87,35 +109,67 @@ public class LeakDetector {
                        return;
 
                if (logData instanceof MemoryData) {
-                       HashMap<Integer, LeakDataBundle> leaks = getLeakDataBundleHashMap();
                        MemoryData mlog = (MemoryData) logData;
+                       int pid = mlog.getPid();
                        // filtering for the failed malloc
                        if (mlog.getReturn().equalsIgnoreCase(String.valueOf("0x0")))   
                                return;
                        
                        if (!mlog.isInternal()) {               // Grouping - user direct allocation
-                               int pid = mlog.getPid();
+                               Map<Integer, LeakDataBundle> leaks = getLeakDataBundleHashMap();
                                LeakDataBundle bundleData = leaks.get(Integer.valueOf(pid));
                                if (mlog.getMemoryApiType() == LogCenterConstants.MEMORY_API_ALLOC) {
                                        if (bundleData == null) {
                                                bundleData = new LeakDataBundle(pid);
-                                               leaks.put(Integer.valueOf(pid), bundleData);
                                        }
 
                                        bundleData.addLeakData(logData);
                                        leaks.put(Integer.valueOf(pid), bundleData);
                                } else if (mlog.getMemoryApiType() == LogCenterConstants.MEMORY_API_FREE) {
-                                       if (bundleData == null)
+                                       if (bundleData == null) {
+                                               // If the running process is analyzing, this case is not error.
+                                               Logger.debug("There is no LeakDataBundle for this PID : %d", pid);
                                                return;
+                                       }
                                        long allocatedAddress = mlog.getAddress();
                                        CommonLeakData commonData = bundleData.getCommonLeakData(allocatedAddress);
                                        LeakData leakData = bundleData.getLeakData(allocatedAddress);
+                                       if (commonData == null || leakData == null) {
+                                               // If the running process is analyzing, this case is not error.
+                                               Logger.debug("There is no allocated data for this free data !!");
+                                               return;
+                                       }
                                        SummaryDataManager.getInstance().getLeakDataMaker()
                                                        .makeData(commonData, leakData, mlog);
                                        bundleData.removeLeakData(allocatedAddress);
                                }
-                       } else {        
-                               // TODO : Internal allocation
+                       } else {        // Internal allocation  
+                               Map<Integer, InternalLeakDataBundle> internalLeaks = getInternalLeakDataBundleHashMap();
+                               InternalLeakDataBundle bundleData = internalLeaks.get(Integer.valueOf(pid));
+                               if (mlog.getMemoryApiType() == LogCenterConstants.MEMORY_API_ALLOC) {
+                                       if (bundleData == null) {
+                                               bundleData = new InternalLeakDataBundle(pid);
+                                       }
+                                       
+                                       bundleData.addInternalLeakData(logData);
+                                       internalLeaks.put(Integer.valueOf(pid), bundleData);
+                               } else if (mlog.getMemoryApiType() == LogCenterConstants.MEMORY_API_FREE) {
+                                       if (bundleData == null) {
+                                               // If the running process is analyzing, this case is not error.
+                                               Logger.debug("There is no InternalLeakDataBundle for this PID : %d", pid);
+                                               return;
+                                       }
+                                       long allocatedAddress = mlog.getAddress();
+                                       InternalLeakData leakData = bundleData.getInternalLeakData(allocatedAddress);
+                                       if (leakData == null) {
+                                               // If the running process is analyzing, this case is not error.
+                                               Logger.debug("There is no internal allocated data for this free data !!");
+                                               return;
+                                       }
+                                       SummaryDataManager.getInstance().getLeakDataMaker()
+                                                       .makeInternalData(leakData, mlog);
+                                       bundleData.removeInternalLeakData(allocatedAddress);
+                               }
                                
                        }
                } 
@@ -123,9 +177,19 @@ public class LeakDetector {
        
        public int getLeakDataSize() {
                int sum = 0;
-               for (Map.Entry<Integer, LeakDataBundle> entry : getLeakDataBundleHashMap().entrySet()) {
-                       LeakDataBundle bundle = entry.getValue();
-                       sum += bundle.getLeakDataHashMap().size();
+               if (getLeakDataBundleHashMap() != null) {
+                       for (Map.Entry<Integer, LeakDataBundle> entry : getLeakDataBundleHashMap().entrySet()) {
+                               if (entry.getValue() != null)
+                                       sum += entry.getValue().getLeakDataHashMap().size();
+                       }
+               }
+               
+               if (getInternalLeakDataBundleHashMap() != null) {
+                       for (Map.Entry<Integer, InternalLeakDataBundle> entry : getInternalLeakDataBundleHashMap()
+                                       .entrySet()) {
+                               if (entry.getValue() != null)
+                                       sum += entry.getValue().getInternalLeakDataHashMap().size();
+                       }
                }
                
                return sum;
@@ -144,5 +208,6 @@ public class LeakDetector {
 
        public void clear() {
                getLeakDataBundleHashMap().clear();
+               getInternalLeakDataBundleHashMap().clear();
        }
 }
index b7ce2c9..9267f23 100644 (file)
@@ -52,9 +52,11 @@ import org.tizen.dynamicanalyzer.ui.summary.SummaryPage;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite;
+import org.tizen.dynamicanalyzer.util.Logger;
 
 public class LeakTable extends DATreeComposite {
        private boolean isRange = false;
+       private long tableDataIndex = 0;
 
        public LeakTable(Composite parent, int compStyle, int tableStyle) {
                super(parent, compStyle, tableStyle);
@@ -108,63 +110,96 @@ public class LeakTable extends DATreeComposite {
        
        @Override
        public List<TreeInput> makeTreeInput() {
+               clearTableDataIndex();
                List<TreeInput> output = new ArrayList<TreeInput>();
                List<Integer> selectedPids = new ArrayList<Integer>();  // for multiple processes selection
                selectedPids.add(Integer.valueOf(ToolbarArea.getInstance().getSelectedPid()));
 
                if (isRange) {
                        // Grouping - user direct allocation
-                       HashMap<Integer, List<GroupLeakData>> rangeGroupData = RangeDataManager.getInstance()
+                       Map<Integer, List<GroupLeakData>> rangeGroupData = RangeDataManager.getInstance()
                                        .getSelectedRangeGroupDataHashMap(selectedPids);
-                       if (rangeGroupData == null || rangeGroupData.size() < 1)
-                               return output;
-                       
-                       for (Map.Entry<Integer, List<GroupLeakData>> entry : rangeGroupData.entrySet()) {
-                               output.addAll(makeTreeInputForRangeGroupData(entry.getKey().intValue(),
-                                               entry.getValue()));
+                       if (rangeGroupData != null && rangeGroupData.size() > 0) {
+                               for (Map.Entry<Integer, List<GroupLeakData>> entry : rangeGroupData.entrySet()) {
+                                       output.addAll(makeTreeInputListForRangeGroupData(entry.getKey().intValue(),
+                                                       entry.getValue()));
+                               }
                        }
                        
-                       // TODO : Internal allocation
+                       // Internal allocation
+                       Map<Integer, List<InternalLeakData>> rangeInternalData = RangeDataManager.getInstance()
+                                       .getSelectedRangeInternalDataHashMap(selectedPids);
+                       if (rangeInternalData != null && rangeInternalData.size() > 0) {
+                               for (Map.Entry<Integer, List<InternalLeakData>> entry : rangeInternalData.entrySet()) {
+                                       output.addAll(makeTreeInputListForRangeInternalData(entry.getKey().intValue(),
+                                                       entry.getValue()));
+                               }
+                       }
                } else {
                        // Grouping - user direct allocation
-                       HashMap<Integer, LeakDataBundle> leaks = AnalyzerManager.getLeakDetector()
+                       Map<Integer, LeakDataBundle> leaks = AnalyzerManager.getLeakDetector()
                                        .getSelectedLeakDataBundleHashMap(selectedPids);
-                       if (leaks == null || leaks.size() < 1)
-                               return output;
+                       if (leaks != null && leaks.size() > 0) {
+                               for (Map.Entry<Integer, LeakDataBundle> entry : leaks.entrySet()) {
+                                       output.addAll(makeTreeInputListForGroupData(entry.getKey().intValue(),
+                                                       entry.getValue()));
+                               }
+                       }
 
-                       for (Map.Entry<Integer, LeakDataBundle> entry : leaks.entrySet()) {
-                               output.addAll(makeTreeInputForGroupData(entry.getKey().intValue(), entry.getValue()));
+                       // Internal allocation
+                       Map<Integer, InternalLeakDataBundle> internalLeaks = AnalyzerManager.getLeakDetector()
+                                       .getSelectedInternalLeakDataBundleHashMap(selectedPids);
+                       if (internalLeaks != null && internalLeaks.size() > 0) {
+                               for (Map.Entry<Integer, InternalLeakDataBundle> internalEntry : internalLeaks.entrySet()) {
+                                       output.addAll(makeTreeInputListForInternalLeakData(internalEntry.getKey()
+                                                       .intValue(), internalEntry.getValue()));
+                               }                               
                        }
-                       
-                       // TODO : Internal allocation
                }
                
                return output;
        }
        
-       private List<TreeInput> makeTreeInputForGroupData(int pid, LeakDataBundle leakDataBundle) {
-               int index = 0;
+       private List<TreeInput> makeTreeInputListForGroupData(int pid, LeakDataBundle leakDataBundle) {
                List<TreeInput> output = new ArrayList<TreeInput>();
-               HashMap<Integer, GroupLeakData> groupDataHashMap = leakDataBundle.getGroupLeakDataHashMap();
+               Map<Integer, GroupLeakData> groupDataHashMap = leakDataBundle.getGroupLeakDataHashMap();
                
                for (Map.Entry<Integer, GroupLeakData> entry : groupDataHashMap.entrySet()) {
                        GroupLeakData iGroupData = entry.getValue();
                        if (iGroupData == null) continue;
                        CommonLeakData commonLeakData = leakDataBundle.getCommonLeakDataList().get(
                                        iGroupData.getCommonLeakDataIndex()); 
-                       TreeInput groupInput = makeTreeInputData(commonLeakData, iGroupData,
-                                       pid, index);
+                       TreeInput groupInput = makeTreeInputData(commonLeakData, iGroupData, pid);
                        if (groupInput != null) {
                                output.add(groupInput);
-                               index++;
+                               increaseTableDataIndex();
+                       }
+               }
+               
+               return output;
+       }
+       
+       private List<TreeInput> makeTreeInputListForInternalLeakData(int pid,
+                       InternalLeakDataBundle internalLeakDatabundle) {
+               List<TreeInput> output = new ArrayList<TreeInput>();
+               Map<Long, InternalLeakData> internalLeakDataHashMap = internalLeakDatabundle
+                               .getInternalLeakDataHashMap();
+               
+               for (Map.Entry<Long, InternalLeakData> entry : internalLeakDataHashMap.entrySet()) {
+                       InternalLeakData iInternalData = entry.getValue();
+                       if (iInternalData == null)      continue;
+                       TreeInput internalInput = makeTreeInputData(iInternalData, pid);
+                       if (internalInput != null) {
+                               output.add(internalInput);
+                               increaseTableDataIndex();
                        }
                }
                
                return output;
        }
        
-       private List<TreeInput> makeTreeInputForRangeGroupData(int pid, List<GroupLeakData> groupDataList) {
-               int index = 0;
+       private List<TreeInput> makeTreeInputListForRangeGroupData(int pid,
+                       List<GroupLeakData> groupDataList) {
                List<TreeInput> output = new ArrayList<TreeInput>();
 
                ArrayList<CommonLeakData> commonLeakDataList = AnalyzerManager.getLeakDetector()
@@ -175,19 +210,36 @@ public class LeakTable extends DATreeComposite {
                                continue;
                        CommonLeakData commonLeakData = commonLeakDataList.get(iGroupData
                                        .getCommonLeakDataIndex());
-                       TreeInput groupInput = makeTreeInputData(commonLeakData, iGroupData, pid, index);
+                       TreeInput groupInput = makeTreeInputData(commonLeakData, iGroupData, pid);
                        if (groupInput != null) {
                                output.add(groupInput);
-                               index++;
+                               increaseTableDataIndex();
                        }
                }
 
                return output;
        }
        
+       private List<TreeInput> makeTreeInputListForRangeInternalData(int pid,
+                       List<InternalLeakData> internalDataList) {
+               List<TreeInput> output = new ArrayList<TreeInput>();
+               
+               for (InternalLeakData iInternalData : internalDataList) {
+                       if (iInternalData == null)
+                               continue;
+                       TreeInput internalInput = makeTreeInputData(iInternalData, pid);
+                       if (internalInput != null) {
+                               output.add(internalInput);
+                               increaseTableDataIndex();
+                       }
+               }
+               
+               return output;
+       }
+       
        private TreeInput makeTreeInputData(CommonLeakData commonData, GroupLeakData groupData,
-                       int pid, int index) {
-               DATableDataFormat tableData = new DATableDataFormat(index);
+                       int pid) {
+               DATableDataFormat tableData = new DATableDataFormat(getTableDataIndex());
                
                List<String> text = new ArrayList<String>();
                List<Object> data = new ArrayList<Object>();
@@ -220,28 +272,18 @@ public class LeakTable extends DATreeComposite {
                }
                text.add(libName);
                data.add(libName);
-               // TODO - for ToolTip Listener (need to check it out)
-//             // 6 : caller pc address
-//             long callerPCAddress = groupData.getCallerPCAddress(); 
-//             data.add(Long.valueOf(callerPCAddress));
-//             // 7 : allocated time
-//             long allocatedTime = groupData.getFirstAllocatedTime();
-//             text.add(Long.toString(allocatedTime));
-//             data.add(Long.valueOf(allocatedTime));
-
-               tableData.getData().addAll(data);
-               tableData.setType(AnalyzerConstants.TYPE_TABLE_LEAK);
                
-               ProbeCommonData probeData = new ProbeCommonData();
-               probeData.setSeq(sequenceNumber);
-               probeData.setApiName(apiName);
-               probeData.setId(commonData.getApiID());
-               probeData.setPid(pid);
-               probeData.setTime(groupData.getFirstAllocatedTime());
+               ProbeCommonData probeData = new ProbeCommonData(sequenceNumber,
+                               groupData.getFirstAllocatedTime(), commonData.getFunctionID(), pid,
+                               commonData.getThreadID(), null, null, 0);
+               probeData.setId(commonData.getMsgID());
                probeData.setCallerAddress(groupData.getCallerPCAddress());
                probeData.setLibName(libName);
-               tableData.setLogData(probeData);
                
+               tableData.getData().addAll(data);
+               tableData.setType(AnalyzerConstants.TYPE_TABLE_LEAK);
+               tableData.setLogData(probeData);
+
                output = new TreeInput();
                output.setText(text);
                output.setData(tableData);
@@ -259,4 +301,78 @@ public class LeakTable extends DATreeComposite {
                
                return output;
        }
+       
+       private TreeInput makeTreeInputData(InternalLeakData internalData, int pid) {
+               DATableDataFormat tableData = new DATableDataFormat(getTableDataIndex());
+               
+               List<String> text = new ArrayList<String>();
+               List<Object> data = new ArrayList<Object>();
+               TreeInput output = null;
+               
+               // 0 : Sequence Number - hidden column for sorting
+               long sequenceNumber = internalData.getSequenceNumber();
+               text.add(Long.toString(sequenceNumber));
+               data.add(Long.valueOf(sequenceNumber));
+               // 1 : API name
+               String apiName = Global.getFunctionName(internalData.getFunctionID());
+               text.add(apiName);
+               data.add(apiName);
+               // 2 : PID
+               text.add(Integer.toString(pid));
+               data.add(Integer.valueOf(pid)); 
+               // 3 : call count
+               int callCount = 1;
+               text.add(Integer.toString(callCount));
+               data.add(Integer.valueOf(callCount));
+               // 4 : leak size
+               long leakSize = internalData.getAllocatedMemorySize();
+               text.add(Long.toString(leakSize));
+               data.add(Long.valueOf(leakSize));
+               // 5 : library name
+               String libName = Global.getProject().getDeviceStatusInfo()
+                               .getBinaryInfo(internalData.getBinaryID()).getTargetBinaryPath();
+               if (libName == null || libName.isEmpty()) {
+                       libName = "unknown";
+               }
+               text.add(libName);
+               data.add(libName);
+               
+               ProbeCommonData probeData = new ProbeCommonData(sequenceNumber,
+                               internalData.getAllocatedTime(), internalData.getFunctionID(), pid,
+                               internalData.getThreadID(), null, null, 0);
+               probeData.setId(internalData.getMsgID());       // set message ID
+               probeData.setCallerAddress(internalData.getCallerPCAddress());
+               probeData.setLibName(libName);
+               
+               tableData.getData().addAll(data);
+               tableData.setType(AnalyzerConstants.TYPE_TABLE_LEAK);
+               tableData.setLogData(probeData);
+               
+               output = new TreeInput();
+               output.setText(text);
+               output.setData(tableData);
+               
+               if (RangeDataManager.getInstance().isBeingAnalyzed()) {
+                       long allocatedTime = internalData.getAllocatedTime();
+                       long startTime = RangeDataManager.getInstance().getAnalysisStartTime();
+                       long endTime = RangeDataManager.getInstance().getAnalysisEndTime();
+                       if (allocatedTime >= startTime && allocatedTime <= endTime) {
+                               output.setInRange(true);
+                       }
+               }
+               
+               return output;
+       }
+       
+       private long getTableDataIndex() {
+               return tableDataIndex;
+       }
+       
+       private void increaseTableDataIndex() {
+               tableDataIndex++;
+       }
+       
+       private void clearTableDataIndex() {
+               tableDataIndex = 0;
+       }
 }
index 34df694..183007f 100644 (file)
@@ -46,7 +46,7 @@ public class MemoryAllocationDBTable extends DBTable {
                        COLUMN.THREAD_ID.name + CommonConstants.COMMA +
                        COLUMN.BINARY_ID.name + CommonConstants.COMMA +
                        COLUMN.FUNCTION_ID.name + CommonConstants.COMMA + 
-                       COLUMN.API_ID.name + CommonConstants.COMMA +
+                       COLUMN.MESSAGE_ID.name + CommonConstants.COMMA +
                        COLUMN.CALLER_PC_ADDRESS.name + CommonConstants.COMMA +
                        COLUMN.ALLOCATED_ADDRESS.name + CommonConstants.COMMA +
                        COLUMN.ALLOCATED_TIME.name + CommonConstants.COMMA +
@@ -70,7 +70,7 @@ public class MemoryAllocationDBTable extends DBTable {
                THREAD_ID(2, DBConstants.DBCOLUMN_THREAD_ID),
                BINARY_ID(3, "BINARY_ID"),
                FUNCTION_ID(4, DBConstants.DBCOLUMN_FUNCTION_ID),
-               API_ID(5, "API_ID"),
+               MESSAGE_ID(5, "MESSAGE_ID"),
                CALLER_PC_ADDRESS(6, DBConstants.DBCOLUMN_CALLER_PC_ADDRESS),
                ALLOCATED_ADDRESS(7, "ALLOCATED_ADDRESS"),
                ALLOCATED_TIME(8, "ALLOCATED_TIME"),
@@ -100,7 +100,7 @@ public class MemoryAllocationDBTable extends DBTable {
                addColumn(new DBColumn(COLUMN.BINARY_ID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.FUNCTION_ID.name, DBConstants.NOT_NULL,
                                DBConstants.DBTYPE_INT4));
-               addColumn(new DBColumn(COLUMN.API_ID.name, DBConstants.NOT_NULL,
+               addColumn(new DBColumn(COLUMN.MESSAGE_ID.name, DBConstants.NOT_NULL,
                                DBConstants.DBTYPE_INT4));
                addColumn(new DBColumn(COLUMN.CALLER_PC_ADDRESS.name, DBConstants.EMPTY,
                                DBConstants.DBTYPE_LONG));
@@ -134,8 +134,8 @@ public class MemoryAllocationDBTable extends DBTable {
                                                (Integer) (rowData.get(COLUMN.BINARY_ID.index)));
                                prep.setInt(COLUMN.FUNCTION_ID.index + 1,
                                                (Integer) (rowData.get(COLUMN.FUNCTION_ID.index)));
-                               prep.setInt(COLUMN.API_ID.index + 1,
-                                               (Integer) (rowData.get(COLUMN.API_ID.index)));
+                               prep.setInt(COLUMN.MESSAGE_ID.index + 1,
+                                               (Integer) (rowData.get(COLUMN.MESSAGE_ID.index)));
                                prep.setLong(COLUMN.CALLER_PC_ADDRESS.index + 1,
                                                (Long) (rowData.get(COLUMN.CALLER_PC_ADDRESS.index)));
                                prep.setLong(COLUMN.ALLOCATED_ADDRESS.index + 1,
@@ -164,7 +164,7 @@ public class MemoryAllocationDBTable extends DBTable {
                        row.add(Integer.valueOf(rs.getInt(COLUMN.THREAD_ID.index + 1)));
                        row.add(Integer.valueOf(rs.getInt(COLUMN.BINARY_ID.index + 1)));
                        row.add(Integer.valueOf(rs.getInt(COLUMN.FUNCTION_ID.index + 1)));
-                       row.add(Integer.valueOf(rs.getInt(COLUMN.API_ID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.MESSAGE_ID.index + 1)));
                        row.add(Long.valueOf(rs.getLong(COLUMN.CALLER_PC_ADDRESS.index + 1)));
                        row.add(Long.valueOf(rs.getLong(COLUMN.ALLOCATED_ADDRESS.index + 1)));
                        row.add(Long.valueOf(rs.getLong(COLUMN.ALLOCATED_TIME.index + 1)));
index 0e3822f..b9222ee 100644 (file)
@@ -170,24 +170,25 @@ public class WarningTable extends DATableComposite {
                        String message = WarningCase.getShortWarningMessage(warningCase);
                        text.add(message);
                        data.add(message);
-                       // create images
 
                        // create DATableDataFormat
                        long seq = (Long)idata.get(WarningDataDBTable.COLUMN_INDEX_SEQUENCE_NUMBER);
                        DATableDataFormat tableData = new DATableDataFormat(seq);
                        
-                       ProbeCommonData probeData = new ProbeCommonData();
-                       probeData.setSeq(seq);
+                       ProbeCommonData probeData = new ProbeCommonData(seq,
+                                       (Long) idata.get(WarningDataDBTable.COLUMN_INDEX_START_TIME), 0, pid,
+                                       (Integer) idata.get(WarningDataDBTable.COLUMN_INDEX_THREAD_ID), null, null, 0);
                        probeData.setId(msgID);
-                       probeData.setPid(pid);
-                       probeData.setTid((Integer)idata.get(WarningDataDBTable.COLUMN_INDEX_THREAD_ID));
-                       probeData.setTime((Long)idata.get(WarningDataDBTable.COLUMN_INDEX_START_TIME));
-                       probeData.setReserved1(warningCase);    // warningCase
-                       probeData.setCallerAddress((Long)idata.get(WarningDataDBTable.COLUMN_INDEX_CALLER_PC_ADDRESS));
-                       probeData.setLibName((String)idata.get(WarningDataDBTable.COLUMN_INDEX_CALLER_LIBRARY_NAME));
+                       probeData.setReserved1(warningCase); // warningCase
+                       probeData.setCallerAddress((Long) idata
+                                       .get(WarningDataDBTable.COLUMN_INDEX_CALLER_PC_ADDRESS));
+                       probeData.setLibName((String) idata
+                                       .get(WarningDataDBTable.COLUMN_INDEX_CALLER_LIBRARY_NAME));
+                       
                        tableData.getData().addAll(text);
                        tableData.setLogData(probeData);
                        tableData.setType(AnalyzerConstants.TYPE_TABLE_WARNING);
+                       
                        TableInput tableInput = new TableInput();
                        tableInput.setText(text);
                        tableInput.setData(tableData);
index 6508109..d08f097 100644 (file)
@@ -261,7 +261,7 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                        int tid = rs.getInt(API.TID.index);
                        String args = rs.getString(API.ARGUMENT.index);
                        String returnValue = rs.getString(API.RETURN.index);
-                       int errorno = rs.getInt(API.ERRORNO.index);
+                       long errorno = rs.getLong(API.ERRORNO.index);
 
                        pData = new ProbeCommonData(seq, time, apiID, pid, tid, args, returnValue, errorno);
                } catch (SQLException e) {