INTERNAL: optimize process memory map management 71/28371/1
authorgreatim <jaewon81.lim@samsung.com>
Mon, 6 Oct 2014 06:18:58 +0000 (15:18 +0900)
committergreatim <jaewon81.lim@samsung.com>
Mon, 6 Oct 2014 06:18:58 +0000 (15:18 +0900)
improve process memory map management

Change-Id: Ib70ca680d142ad467c3377c0e23d531be286fa0a
Signed-off-by: greatim <jaewon81.lim@samsung.com>
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/ProcessInformation.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/ProcessMemoryMap.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/project/data/FunctionNameDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/logparser/MessageParser.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/ToolbarArea.java

index 4774b27..5dad8f7 100644 (file)
@@ -58,6 +58,7 @@ public class ProcessInformation {
        private boolean dropLog = false;
 
        private NavigableMap<Long, ProcessMemoryMap> processMemSnapshots = new TreeMap<Long, ProcessMemoryMap>();
+       private boolean isMapping = true;
 
        public int getPid() {
                return pid;
@@ -137,11 +138,17 @@ public class ProcessInformation {
 
        public void addProcessMemoryMap(ProcessMemoryMap pmap) {
                long captime = pmap.getCapturedTime();
-               processMemSnapshots.put(Long.valueOf(captime), pmap);
+               synchronized (processMemSnapshots) {
+                       processMemSnapshots.put(Long.valueOf(captime), pmap);
+               }
        }
 
        public ProcessMemoryMap getLastProcessMemoryMap() {
-               return processMemSnapshots.lastEntry().getValue();
+               if (processMemSnapshots.isEmpty()) {
+                       return null;
+               } else {
+                       return processMemSnapshots.lastEntry().getValue();
+               }
        }
 
        public ProcessMemoryMap getProcessMemoryMap(long time) {
@@ -154,6 +161,15 @@ public class ProcessInformation {
                }
        }
 
+       public void updateProcessMemoryMap(ProcessMemoryMap pmap, long newtime) {
+               long prevtime = pmap.getCapturedTime();
+               synchronized (processMemSnapshots) {
+                       processMemSnapshots.remove(Long.valueOf(prevtime));
+                       pmap.setCapturedTime(newtime);
+                       processMemSnapshots.put(Long.valueOf(newtime), pmap);
+               }
+       }
+
        public void setDropLog(boolean droplog) {
                this.dropLog = droplog;
        }
@@ -162,6 +178,14 @@ public class ProcessInformation {
                return dropLog;
        }
 
+       public void setMappingState(boolean mapping) {
+               isMapping = mapping;
+       }
+
+       public boolean isMapping() {
+               return isMapping;
+       }
+
        public void saveMemoryMap(DBTable table) {
                for (Map.Entry<Long, ProcessMemoryMap> entry : processMemSnapshots.entrySet()) {
                        entry.getValue().saveMemoryMap(table);
index 99d5d1e..ddad4a0 100644 (file)
@@ -54,6 +54,10 @@ public class ProcessMemoryMap {
        public long getCapturedTime() {
                return capturedTime;
        }
+       
+       public void setCapturedTime(long time) {
+               capturedTime = time;
+       }
 
        public void setMainBinary(LibraryObject libobj) {
                this.mainBinary = libobj;
@@ -64,7 +68,7 @@ public class ProcessMemoryMap {
                return mainBinary;
        }
 
-       public void addLibraryMap(LibraryObject libobj) {
+       public boolean addLibraryMap(LibraryObject libobj) {
                long lowaddr = libobj.getLowestAddress();
                int binid = libobj.getBinaryID();
 
@@ -72,7 +76,11 @@ public class ProcessMemoryMap {
                        binaryByAddress.put(Long.valueOf(lowaddr), libobj);
                }
                synchronized (binaryByBinaryID) {
-                       binaryByBinaryID.put(Integer.valueOf(binid), libobj);
+                       LibraryObject o = binaryByBinaryID.put(Integer.valueOf(binid), libobj);
+                       if(o == null) 
+                               return true;
+                       else
+                               return false;
                }
        }
 
index c1e83b0..61a492c 100644 (file)
@@ -38,7 +38,7 @@ import org.tizen.dynamicanalyzer.database.DBConstants;
 import org.tizen.dynamicanalyzer.database.DBTable;
 
 public class FunctionNameDBTable extends DBTable {
-       private static final String TABLENAME = "FUNCTION_NAME";
+       private static final String TABLENAME = "FUNCTION_INFO";
 
        public enum COLUMN {
                FUNCTIONID(0, "FUNCTION_ID"),
index 5a1666a..e869a97 100755 (executable)
@@ -204,7 +204,8 @@ public class MessageParser {
 
                        pinfo.setDropLog(true);
                }
-
+               pinfo.setMappingState(true);
+               
                ProcessMemoryMap pMap = new ProcessMemoryMap(pinfo.getPid(), subTime.getLongTime());
                pinfo.addProcessMemoryMap(pMap);
 
@@ -260,28 +261,46 @@ public class MessageParser {
                ProcessInformation pinfo = project.getProcessInformation(pid);
                if (null == pinfo) {
                        // bug!!!
-                       Logger.debug("bug occurred!!");
+                       Logger.error("bug occurred!!");
                        return;
                }
 
-               DATime changeTime = new DATime(sec, nano);
-               DATime profileStartTime = project.getProfilingStartTime();
-               DATime subTime = changeTime.subtract(profileStartTime);
-
                ProcessMemoryMap lastMap = pinfo.getLastProcessMemoryMap();
-               ProcessMemoryMap newMap = new ProcessMemoryMap(pinfo.getPid(), subTime.getLongTime());
-               pinfo.addProcessMemoryMap(newMap);
-               newMap.copy(lastMap);
 
                if (id == DataChannelConstants.MSG_PROCESS_MAP) {
+                       // update to last memory map
                        String libPath = LogDataUtils.getString(index, data);
                        index += LogDataUtils.getStringLength(index, data);
 
                        BinaryInfo bininfo = project.getDeviceStatusInfo().getBinaryInfo(libPath);
                        LibraryObject libObj = new LibraryObject(bininfo.getID(), lowAddr, highAddr);
-                       newMap.addLibraryMap(libObj);
+                       if(!lastMap.addLibraryMap(libObj)) {
+                               Logger.error("exist library");
+                       }
+                       
+                       pinfo.setMappingState(true);
                } else {
-                       newMap.removeLibrary(lowAddr, highAddr);
+                       DATime changeTime = new DATime(sec, nano);
+                       DATime profileStartTime = project.getProfilingStartTime();
+                       DATime subTime = changeTime.subtract(profileStartTime);
+                       
+                       if(pinfo.isMapping()) {
+                               // make new memory map
+                               ProcessMemoryMap newMap = new ProcessMemoryMap(pinfo.getPid(), subTime.getLongTime());
+                               pinfo.addProcessMemoryMap(newMap);
+                               newMap.copy(lastMap);
+                               
+                               // remove from new map
+                               newMap.removeLibrary(lowAddr, highAddr);
+                       } else {
+                               // update captured time of last memory map
+                               pinfo.updateProcessMemoryMap(lastMap, subTime.getLongTime());
+                               
+                               // remove from map
+                               lastMap.removeLibrary(lowAddr, highAddr);
+                       }
+                       
+                       pinfo.setMappingState(false);
                }
        }
 
index 21ef7b3..65094ca 100755 (executable)
@@ -828,10 +828,10 @@ public class ToolbarArea {
                appCombo.setEnabled(true);
                appCombo.initCombo();
 
-               addToAppComboFromTarget();
+               boolean existDevice = addToAppComboFromTarget();
 
-               List<String> pkgs = appCombo.getItems();
-               if (pkgs != null && pkgs.size() > 0) {
+               if (existDevice) {
+                       List<String> pkgs = appCombo.getItems();
                        PackageInfo pkgInfo = null;
                        String packageID = Global.getCurrentDeviceInfo().getSelectedPackageID();
 
@@ -913,24 +913,28 @@ public class ToolbarArea {
                }
        }
 
-       private void addToAppComboFromTarget() {
+       // return false if target is not connected
+       private boolean addToAppComboFromTarget() {
                Map<String, PackageInfo> pkgInfos = DACommunicator.updateAppListFromTarget();
+               if (pkgInfos == null) {
+                       addToAppCombo(null);
+                       return false;
+               }
 
                List<PackageInfo> pkgList = new ArrayList<PackageInfo>();
-               if (pkgInfos != null) {
-                       // TODO : reconstruct real app list for app combo
-                       // relation between package and app?
-                       for (Map.Entry<String, PackageInfo> entry : pkgInfos.entrySet()) {
-                               PackageInfo pkg = entry.getValue();
-                               AppInfo mainapp = pkg.getMainApp();
-                               if (!mainapp.getAppId().contains(AnalyzerConstants.APPCONTROL)) {
-                                       String label = mainapp.getLabel();
-                                       if (label.isEmpty()) {
-                                               label = mainapp.getExecFileName();
-                                               mainapp.setInfo(AppInfo.PROPERTY.LABEL.index, label);
-                                       }
-                                       pkgList.add(pkg);
+               
+               // TODO : reconstruct real app list for app combo
+               // relation between package and app?
+               for (Map.Entry<String, PackageInfo> entry : pkgInfos.entrySet()) {
+                       PackageInfo pkg = entry.getValue();
+                       AppInfo mainapp = pkg.getMainApp();
+                       if (!mainapp.getAppId().contains(AnalyzerConstants.APPCONTROL)) {
+                               String label = mainapp.getLabel();
+                               if (label.isEmpty()) {
+                                       label = mainapp.getExecFileName();
+                                       mainapp.setInfo(AppInfo.PROPERTY.LABEL.index, label);
                                }
+                               pkgList.add(pkg);
                        }
                }
 
@@ -1001,6 +1005,8 @@ public class ToolbarArea {
                });
 
                addToAppCombo(pkgList);
+               
+               return true;
        }
 
        public void setAppComboText(final String text) {