Thread Analysis: enable save/load thread data 85/28185/1
authorwoojin <woojin2.jung@samsung.com>
Tue, 30 Sep 2014 00:48:43 +0000 (09:48 +0900)
committerwoojin <woojin2.jung@samsung.com>
Tue, 30 Sep 2014 00:48:43 +0000 (09:48 +0900)
1. apply new DB schema to Thread/Sync
2. enable save/load thread chart data
3. change name of some utility functions
4. remove each page's updateView call from initRange

Change-Id: Ibda9fbb70493a05d370473853b903ef5245bf6d7
Signed-off-by: woojin <woojin2.jung@samsung.com>
29 files changed:
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/DALimit.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/model/data/ProbeCommonData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/model/data/ThreadData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChart.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileChartBoard.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/range/RangeDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadChartManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadDetailInfoView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPageData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadPageDataEvent.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIInserter.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataInserter.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventInserter.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadAPIDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventDBTable.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventInserter.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataEvent.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadData.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataEvent.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/FunctionEntryDBTable.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/utils/Formatter.java

index f8b7c84..a3feeb8 100644 (file)
@@ -42,6 +42,9 @@ public class DALimit {
        public static final int SHADER_VARIABLE_LENGTH = 1024;
        // Network Analysis
        public static final int HTML_SCRIPT_LENGTH = 4096;
+       // Thread Analysis
+       public static final int CLASS_NAME_LENGTH = 1024;
+       public static final int TOOLTIP_LENGTH = 256;   
 
        
        /*
index 338a7b4..b6018a9 100644 (file)
@@ -58,6 +58,19 @@ public class ProbeCommonData extends LogData {
        public ProbeCommonData() {
        }
 
+       /* load from Database */
+       public ProbeCommonData(int seq, long time, int apiId, int pid, int tid, String args,
+                       String ret, int errno) {
+               this.seq = seq;
+               this.time = time;
+               this.apiId = apiId;
+               this.pid = pid;
+               this.tid = tid;
+               this.args = args;
+               this.ret = ret;
+               this.errno = errno;
+       }
+       
        public ProbeCommonData clone() throws CloneNotSupportedException {
                ProbeCommonData log = (ProbeCommonData) super.clone();
                log.apiId = this.apiId;
index 4bb97eb..1979cea 100644 (file)
@@ -64,7 +64,7 @@ public class ThreadData extends ProbeCommonData {
                return pThreadId;
        }
 
-       public void setpThreadId(long pThreadId) {
+       public void setPThreadId(long pThreadId) {
                this.pThreadId = pThreadId;
        }
 
index 28f726b..a101c2c 100644 (file)
@@ -255,7 +255,7 @@ public class FileChart {
                                        || data.getErrNo() != 0) {
                                continue;
                        }
-                       double time = Formatter.toLongTimeForDoubleTime(data.getEventTime());
+                       double time = Formatter.longTimeToDoubleTime(data.getEventTime());
                        switch(data.getApiType()){
                        case LogCenterConstants.FD_API_TYPE_OPEN:
                                if(openNum > 0){ // duplicated open
index 98bf0a1..0ceb3f3 100644 (file)
@@ -306,9 +306,9 @@ public class FileChartBoard extends DAChartBoard {
                List<FileAccess> accessList = dataMaker.getFileAccessList();
                for (int i = 0; i < accessList.size(); i++) {
                        FileAccess access = accessList.get(i);
-                       double startTime = Formatter.toLongTimeForDoubleTime(access
+                       double startTime = Formatter.longTimeToDoubleTime(access
                                        .getStartTime());
-                       double endTime = Formatter.toLongTimeForDoubleTime(access
+                       double endTime = Formatter.longTimeToDoubleTime(access
                                        .getEndTime());
                        double visibleStartTime = getVisibleStartTime();
                        double visibleEndTime = getVisibleEndTime();
index 60ca217..321baff 100644 (file)
@@ -126,12 +126,7 @@ public class RangeDataManager implements Runnable {
                        @Override
                        public void run() {
                                isBeingAnalyzed = false;
-                               DAPageComposite page = AnalyzerManager.getCurrentPage();
-                               if (page instanceof RangePage) {
-                                       AnalyzerUtil.changePage(TimelinePage.pageID);
-                               } else {
-                                       page.updateView();
-                               }
+                               AnalyzerUtil.changePage(TimelinePage.pageID);
 
                                DATabComposite mainTab = AnalyzerUtil.getMainTab();
                                if (null != mainTab.getView(RangePage.pageID)) {
index 44db89c..7cb3627 100644 (file)
@@ -25,6 +25,8 @@
  */
 package org.tizen.dynamicanalyzer.ui.thread;
 
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -34,18 +36,41 @@ import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Composite;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
 import org.tizen.dynamicanalyzer.error.ErrorCodeManager;
 import org.tizen.dynamicanalyzer.model.TableInput;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
 import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadData;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DAApiListTableComposite;
 import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat;
+import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.utils.Formatter;
 
 public class ThreadAPIListTable extends DAApiListTableComposite {
        
+       private enum API {
+               SEQ(1),
+               APICALLTIME(2),
+               APIID(3),
+               PID(4),
+               TID(5),
+               ARGUMENT(6),
+               RETURN(7),
+               ERRORNO(8);
+               
+               public final int index;
+               
+               API(int index) {
+                       this.index = index;
+               }
+       }
+       
        public ThreadAPIListTable(Composite parent, int compStyle, int tableStyle) {
                super(parent, compStyle, tableStyle);
                table.addSelectionListener(new SelectionListener() {
@@ -100,68 +125,91 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                }
 
                List<TableInput> input = new ArrayList<TableInput>();
+               ResultSet rs = null;
 
-               List<ThreadPageDataEvent> contents = data.getContents();
-
-               ThreadPageDataEvent content;
-               for (int i = 0; i < contents.size(); i++) {
-                       content = contents.get(i);
-                       ProbeCommonData contentTemp = (ProbeCommonData) content
-                                       .getContents();
-                       int selectedPid = ToolbarArea.getInstance().getSelectedPid();
-                       if (selectedPid != 0) {
-                               if (selectedPid != contentTemp.getPid()) {
-                                       continue;
-                               }
+               if (data instanceof ThreadPageThreadData) {
+                       ThreadPageThreadData tData = (ThreadPageThreadData) data;
+                       String query = String.format(ThreadAPIDBTable.SELECT_QUERY, tData.getThreadDataID()); 
+                       rs = SqlConnectionManager.executeQueryRS(query);
+                       if (null == rs) {
+                               Logger.debug("failed to query api data in thread API table");
+                               return null;
                        }
-                       List<String> contentText = new ArrayList<String>();
-                       List<String> contentData = new ArrayList<String>();
-
-                       String seq = Integer.toString(contentTemp.getSeq());
-                       contentText.add(0, seq);
-                       contentData.add(seq);
-
-                       contentText.add(Formatter.toTimeFormat(contentTemp.getTime()));
-                       contentData.add(Long.toString(contentTemp.getTime()));
-
-                       contentText.add(Integer.toString(contentTemp.getPid()));
-                       contentData.add(Integer.toString(contentTemp.getPid()));
-
-                       contentText.add(Long.toString(contentTemp.getTid()));
-                       contentData.add(Long.toString(contentTemp.getTid()));
-
-                       contentText.add(contentTemp.getApiName());
-                       contentData.add(contentTemp.getApiName());
-
-                       contentText.add(contentTemp.getArgs());
-                       contentData.add(contentTemp.getArgs());
-
-                       contentText.add(contentTemp.getReturn());
-                       contentData.add(contentTemp.getReturn());
+               } else if (data instanceof ThreadPageSyncData) {
+                       ThreadPageSyncData sData = (ThreadPageSyncData) data;
+                       String query = String.format(SyncAPIDBTable.SELECT_QUERY, sData.getSyncDataID());
+                       rs = SqlConnectionManager.executeQueryRS(query);
+                       if (null == rs) {
+                               Logger.debug("failed to query api data in sync API table");
+                               return null;
+                       }                       
+               } else {
+                       Logger.error("unknown thread page data type!!");
+                       return null;
+               }
 
-                       String errMsg = ErrorCodeManager.getInatance()
-                                       .getErrorCode(contentTemp.getErrno()).name();
-                       if (null == errMsg) {
-                               errMsg = "undefined error code";
-                       }
-                       contentText.add(errMsg);
-                       contentData.add(errMsg);
-
-                       DATableDataFormat tableData = new DATableDataFormat(
-                                       contentTemp.getSeq());
-                       tableData.setLogData(contentTemp);
-                       tableData.getData().addAll(contentData);
-                       TableInput tableInput = new TableInput();
-                       tableInput.setText(contentText);
-                       tableInput.setData(tableData);
-                       if (!errMsg.contains("SUCCESS")) {//$NON-NLS-1$
-                               tableInput.setFailed(true);
+               try {
+                       while(rs.next()) {
+                               ProbeCommonData apiData = makeProbeCommonData(rs);
+                               
+                               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
+                               if (selectedPid != 0) {
+                                       if (selectedPid != apiData.getPid()) {
+                                               continue;
+                                       }
+                               }
+                               List<String> contentText = new ArrayList<String>();
+                               List<String> contentData = new ArrayList<String>();
+       
+                               contentText.add(0, String.valueOf(apiData.getSeq()));
+                               contentData.add(String.valueOf(apiData.getSeq()));
+       
+                               contentText.add(Formatter.toTimeFormat(apiData.getTime()));
+                               contentData.add(Long.toString(apiData.getTime()));
+       
+                               contentText.add(Integer.toString(apiData.getPid()));
+                               contentData.add(Integer.toString(apiData.getPid()));
+       
+                               contentText.add(Long.toString(apiData.getTid()));
+                               contentData.add(Long.toString(apiData.getTid()));
+       
+                               contentText.add(apiData.getApiName());
+                               contentData.add(apiData.getApiName());
+       
+                               contentText.add(apiData.getArgs());
+                               contentData.add(apiData.getArgs());
+       
+                               contentText.add(apiData.getReturn());
+                               contentData.add(apiData.getReturn());
+       
+                               String errMsg = ErrorCodeManager.getInatance()
+                                               .getErrorCode(apiData.getErrno()).name();
+                               if (null == errMsg) {
+                                       errMsg = "undefined error code";
+                               }
+                               contentText.add(errMsg);
+                               contentData.add(errMsg);
+       
+                               DATableDataFormat tableData = new DATableDataFormat(apiData.getSeq());
+                               tableData.setLogData(apiData);
+                               tableData.getData().addAll(contentData);
+                               TableInput tableInput = new TableInput();
+                               tableInput.setText(contentText);
+                               tableInput.setData(tableData);
+                               if (!errMsg.contains("SUCCESS")) {//$NON-NLS-1$
+                                       tableInput.setFailed(true);
+                               }
+                               input.add(tableInput);
+       
+                               if (apiData.getTime() >= rangeStartTime && apiData.getTime() <= rangeEndTime) {
+                                       tableInput.setInRange(true);
+                               }
                        }
-                       input.add(tableInput);
-
-                       long time = contentTemp.getTime();
-                       if (time >= rangeStartTime && time <= rangeEndTime) {
-                               tableInput.setInRange(true);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               } finally {
+                       if (rs != null) {
+                               SqlConnectionManager.releaseResultSet(rs);
                        }
                }
 
@@ -195,4 +243,23 @@ public class ThreadAPIListTable extends DAApiListTableComposite {
                        chartview.setRangeMarker(startTime, endTime);
                }
        }
-}
+       
+       private ProbeCommonData makeProbeCommonData(ResultSet rs) {
+               ProbeCommonData pData = null;
+               try {
+                       int seq = rs.getInt(API.SEQ.index);
+                       long time = rs.getLong(API.APICALLTIME.index);
+                       int apiID = rs.getInt(API.APIID.index);
+                       int pid = rs.getInt(API.PID.index);
+                       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);
+                       
+                       pData = new ProbeCommonData(seq, time, apiID, pid, tid, args, returnValue, errorno);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               }
+               return pData;
+       }
+}
\ No newline at end of file
index a36abdd..8f28182 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
 
 package org.tizen.dynamicanalyzer.ui.thread;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+import org.tizen.dynamicanalyzer.database.SqlConnectionManager;
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.swap.channel.data.DataChannelConstants;
 import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
 import org.tizen.dynamicanalyzer.swap.logparser.Logs;
 import org.tizen.dynamicanalyzer.swap.logparser.PageDataManager;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncDataDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncEventDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadAPIDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadDataDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadEventDBTable;
+import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
+import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataEvent;
 import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataManager;
+import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadData;
+import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadDataEvent;
 import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadDataManager;
+import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
 
 public class ThreadChartManager extends PageDataManager {
        private static ThreadChartManager instance = null;
+       
+       private ThreadDataDBTable threadDataTable = null;
+       private ThreadEventDBTable threadEventTable = null;
+       private ThreadAPIDBTable threadAPITable = null;
+       
+       private SyncDataDBTable syncDataTable = null;
+       private SyncEventDBTable syncEventTable = null;
+       private SyncAPIDBTable syncAPITable = null;
 
        private ThreadPageThreadDataManager tManager;
        private ThreadPageSyncDataManager sManager;
 
+       private enum THREADEVENT {
+               EVENTTIME(0),
+               TID(1),
+               APITYPE(2),
+               TOOLTIP(3),
+               ERRORNO(4),
+               EVENTTYPE(5),
+               THREADTYPE(6),
+               CALLERID(7);
+               
+               public final int index;
+               
+               THREADEVENT(int index) {
+                       this.index = index;
+               }
+       }
+       
+       private enum SYNCEVENT {
+               EVENTTIME(0),
+               APITYPE(1),
+               TOOLTIP(2),
+               ERRORNO(3),
+               SYNCVALUE(4);
+               
+               public final int index;
+               
+               SYNCEVENT(int index) {
+                       this.index = index;
+               }
+       }
+       
        private ThreadChartManager() {
+               threadDataTable = new ThreadDataDBTable();
+               threadEventTable = new ThreadEventDBTable();
+               threadAPITable = new ThreadAPIDBTable();
+               
+               syncDataTable = new SyncDataDBTable();
+               syncEventTable = new SyncEventDBTable();
+               syncAPITable = new SyncAPIDBTable();
+               
                tManager = new ThreadPageThreadDataManager(null);
                sManager = new ThreadPageSyncDataManager(null);
        }
@@ -58,6 +121,26 @@ public class ThreadChartManager extends PageDataManager {
        public ThreadPageThreadDataManager getThreadDataManager() {
                return tManager;
        }
+       
+       public ThreadEventDBTable getThreadEventDBTable() {
+               return threadEventTable;
+       }
+       
+       public ThreadAPIDBTable getThreadAPIDBTable() {
+               return threadAPITable;
+       }
+       
+       public SyncDataDBTable getSyncDataDBTable() {
+               return syncDataTable;
+       }
+       
+       public SyncEventDBTable getSyncEventDBTable() {
+               return syncEventTable;
+       }
+       
+       public SyncAPIDBTable getSyncAPIDBTable() {
+               return syncAPITable;
+       }
 
        private List<LogData> getLogsFromLogPackage(LogPackage logPack,
                        int logCenterConstants) {
@@ -79,7 +162,144 @@ public class ThreadChartManager extends PageDataManager {
                tManager.clear();
                sManager.clear();
        }
+       
+       @Override
+       protected void onThreadStop() {
+               saveRemainingThreadData();
+       }
+       
+       private void saveRemainingThreadData() {
+               // ThreadPageThreadData
+               List<ThreadPageThreadData> remainedThreadData = tManager.getRows();
+               int size = remainedThreadData.size();
+               for (int i = 0; i < size; i++) {
+                       ThreadPageThreadData threadData = remainedThreadData.get(i);
+                       if (threadData.getEndTime() < 0) {
+                               saveThreadPageThreadData(threadData);
+                       }
+               }
+       }
 
+       public void openData(Map<String, String> dataMap) {
+               openThreadData();
+       }       
+       
+       private void openThreadData() {
+               //TODO: use ResultSet
+               // load ThreadPageThreadData
+               List<List<Object>> threadDatas = threadDataTable.getThreadDataFromDB();
+               int size = threadDatas.size();
+               for (int i = 0; i < size; i++) {
+                       List<Object>rowData = threadDatas.get(i);
+                       int id = (Integer) rowData.get(ThreadDataDBTable.COLUMN.THREADDATAID.index);
+                       int pid = (Integer) rowData.get(ThreadDataDBTable.COLUMN.PID.index);                    
+                       int tid = (Integer) rowData.get(ThreadDataDBTable.COLUMN.TID.index);
+                       byte threadType = (Byte) rowData.get(ThreadDataDBTable.COLUMN.THREADTYPE.index);
+                       byte attrType = (Byte) rowData.get(ThreadDataDBTable.COLUMN.ATTRIBUTETYPE.index);
+                       String attributeType = ThreadPageThreadDataManager.getAttrTypeByTypeInt(attrType);
+                       long startTime = (Long) rowData.get(ThreadDataDBTable.COLUMN.STARTTIME.index);
+                       long endTime = (Long) rowData.get(ThreadDataDBTable.COLUMN.ENDTIME.index);
+                       int functionID = (Integer) rowData.get(ThreadDataDBTable.COLUMN.FUNCTIONID.index);
+                       String className = (String) rowData.get(ThreadDataDBTable.COLUMN.CLASSNAME.index);
+                       
+                       ThreadPageThreadData threadData = new ThreadPageThreadData(id, pid, tid, threadType,
+                                       attributeType, startTime, endTime, functionID, className);
+                       tManager.pushRow(threadData);
+                       
+                       // load ThreadPageThreadDataEvent for the ThreadPageThreadData
+                       String query = String.format(ThreadEventDBTable.SELECT_QUERY, id);
+                       List<List<Object>> threadEvents = SqlConnectionManager.executeQuery(query);
+                       int eventSize = threadEvents.size();
+                       for (int j = 0; j < eventSize; j++) {
+                               ThreadPageThreadDataEvent threadEvent = makeThreadEvent(threadEvents.get(j));
+                               threadData.pushEvent(threadEvent);
+                       }
+               }
+               
+               // load ThreadPageSyncData
+//             List<List<Object>> syncDatas = SqlConnectionManager.executeQuery(SyncDataDBTable.SELECT_QUERY);
+               List<List<Object>> syncDatas = syncDataTable.getSyncDataFromDB();
+               int syncSize = syncDatas.size();
+               for (int i = 0; i < syncSize; i++) {
+                       ThreadPageSyncData syncData = makeSyncData(syncDatas.get(i));
+                       // load ThreadPageSyncDataEvent for the ThreadPageSyncData
+                       String query = String.format(SyncEventDBTable.SELECT_QUERY, syncData.getSyncDataID());
+                       List<List<Object>> syncEvents = SqlConnectionManager.executeQuery(query);
+                       int eventSize = syncEvents.size();
+                       for (int j = 0; j < eventSize; j++) {
+                               ThreadPageSyncDataEvent syncEvent = makeSyncEvent(syncEvents.get(j));
+                               syncData.pushEvent(syncEvent);
+                       }
+                       
+                       switch (syncData.getSyncDataType()) {
+                       case ThreadPageSyncData.SYNC_PARENT:
+                       case ThreadPageSyncData.SYNC_CHILD:
+                               sManager.pushRow(syncData);
+                               break;
+                       case ThreadPageSyncData.THREAD_CHILD:
+                               tManager.pushSyncData(syncData);                                
+                               break;
+                       default:
+                               Logger.error("unknown sync data type");
+                       }                       
+               }
+       }
+       
+       private ThreadPageThreadDataEvent makeThreadEvent(List<Object> rowData) {
+               ThreadPageThreadDataEvent threadEvent = null;
+               long time = (Long) rowData.get(THREADEVENT.EVENTTIME.index);
+               int tid = (Integer) rowData.get(THREADEVENT.TID.index);
+               String tidStr = String.valueOf(tid);
+               byte apiType = (Byte) rowData.get(THREADEVENT.APITYPE.index);
+               String tooltip = (String) rowData.get(THREADEVENT.TOOLTIP.index);
+               long errorNum = (Long) rowData.get(THREADEVENT.ERRORNO.index);
+               byte eventType = (Byte) rowData.get(THREADEVENT.EVENTTYPE.index);
+               int threadType = (Integer) rowData.get(THREADEVENT.THREADTYPE.index);
+               int callerId = (Integer) rowData.get(THREADEVENT.CALLERID.index);
+               String callerIdStr = null;
+               if (callerId != -1) {
+                       callerIdStr = String.valueOf(callerId);
+               }
+               
+               threadEvent = new ThreadPageThreadDataEvent(eventType, threadType, apiType, time,
+                               tidStr, tooltip, errorNum, null);
+               threadEvent.setCallerTid(callerIdStr);
+               
+               return threadEvent;
+       }
+       
+       private ThreadPageSyncData makeSyncData(List<Object> rowData) {
+               ThreadPageSyncData syncData = null;
+               int id = (Integer) rowData.get(SyncDataDBTable.COLUMN.SYNCDATAID.index);
+               int pid = (Integer) rowData.get(SyncDataDBTable.COLUMN.PID.index);                      
+               int tid = (Integer) rowData.get(SyncDataDBTable.COLUMN.TID.index);
+               byte syncType = (Byte) rowData.get(SyncDataDBTable.COLUMN.SYNCTYPE.index);
+               long syncValue = (Long) rowData.get(SyncDataDBTable.COLUMN.SYNCVALUE.index);
+               byte attrType = (Byte) rowData.get(SyncDataDBTable.COLUMN.ATTRIBUTETYPE.index);
+               String attributeType = ThreadPageSyncDataManager.getAttrTypeByTypeInt(attrType);
+               byte syncDataType = (Byte) rowData.get(SyncDataDBTable.COLUMN.SYNCDATATYPE.index);
+               int parentID = (Integer) rowData.get(SyncDataDBTable.COLUMN.PARENTID.index);
+               
+               syncData = new ThreadPageSyncData(id, pid, tid, syncType, syncValue, attributeType, 
+                               syncDataType, parentID);
+               
+               return syncData;
+       }
+       
+       private ThreadPageSyncDataEvent makeSyncEvent(List<Object> rowData) {
+               ThreadPageSyncDataEvent syncEvent = null;
+               long time = (Long) rowData.get(SYNCEVENT.EVENTTIME.index);
+               byte apiType = (Byte) rowData.get(SYNCEVENT.APITYPE.index);
+               String tooltip = (String) rowData.get(SYNCEVENT.TOOLTIP.index);
+               long errorNum = (Long) rowData.get(SYNCEVENT.ERRORNO.index);
+               long syncValue = (Long) rowData.get(SYNCEVENT.SYNCVALUE.index);
+               String syncValueStr = String.valueOf(syncValue);
+               
+               syncEvent = new ThreadPageSyncDataEvent(time, apiType, tooltip, errorNum, syncValueStr);
+               
+               return syncEvent;
+       }
+       
        public int getItemIndexByTid(String tid) {
                return tManager.getItemIndexByTid(tid);
        }
@@ -120,4 +340,46 @@ public class ThreadChartManager extends PageDataManager {
                        }
                }
        }
-}
+       
+       public void saveThreadPageThreadData(ThreadPageData threadPageData) {
+               List<List<Object>> insertData = new ArrayList<List<Object>>();
+               List<Object> insertRowData = new ArrayList<Object>();           
+               
+               if (threadPageData instanceof ThreadPageThreadData) {
+                       ThreadPageThreadData threadData = (ThreadPageThreadData) threadPageData;
+                       try {
+                               insertRowData.add(new Integer(threadData.getThreadDataID()));
+                               insertRowData.add(new Integer(threadData.getPid()));
+                               insertRowData.add(new Integer(threadData.getTid()));
+                               Integer type = new Integer(threadData.getType());
+                               byte threadType = type.byteValue();
+                               insertRowData.add(new Byte(threadType));
+                               String attrTypeStr = threadData.getAttrType();
+                               byte attrType = -1;
+                               if (attrTypeStr.equals(ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE)) {
+                                       attrType = ThreadPageThreadDataManager.PTHREAD_CREATE_JOINABLE;
+                               } else if (attrTypeStr.equals(ThreadPageLabels.THREAD_ATTR_TYPE_DETACHED)) {
+                                       attrType = ThreadPageThreadDataManager.PTHREAD_CREATE_DETACHED;
+                               } else { // main thread has no attribute
+                                       attrType = -1;
+                               }
+                               insertRowData.add(new Byte(attrType));
+                               insertRowData.add(new Long(threadData.getStartTime()));                         
+                               insertRowData.add(new Long(threadData.getEndTime()));
+                               insertRowData.add(new Integer(threadData.getThreadFuncID()));
+                               insertRowData.add(new String(threadData.getThreadClassName()));
+                       } catch (ArrayIndexOutOfBoundsException e) {
+                               e.printStackTrace();
+                       } 
+                       insertData.add(insertRowData);                  
+               } else if (threadPageData instanceof ThreadPageSyncData) {
+                       
+               } else {
+                       Logger.error("Unknown ThreadPageData type!");
+               }
+               
+               if (insertData.size() > 0) {
+                       threadDataTable.insertData(insertData);
+               }
+       }
+}
\ No newline at end of file
index 26d3e0c..e7e5493 100644 (file)
@@ -159,7 +159,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
                String str;
                if (item instanceof ThreadPageThreadData) {
                        tid = item.getTid();
-                       type = item.getType();
+                       type = ((ThreadPageThreadData) item).getTypeString();
                        str = ((ThreadPageThreadData) item).getThreadFuncName();
                        if (null != str && !(str.equals(CommonConstants.EMPTY))) {
                                funcName = str;
@@ -168,11 +168,11 @@ public class ThreadDetailInfoView extends DAViewComposite {
                        if (null != str && !(str.equals(CommonConstants.EMPTY))) {
                                className = str;
                        }
-                       str = ((ThreadPageThreadData) item).getStartTime();
+                       str = ((ThreadPageThreadData) item).getStartTimeString();
                        if (null != str && !(str.equals(CommonConstants.EMPTY))) {
                                startTime = str;
                        }
-                       str = ((ThreadPageThreadData) item).getEndTime();
+                       str = ((ThreadPageThreadData) item).getEndTimeString();
                        if (null != str && !(str.equals(CommonConstants.EMPTY))) {
                                endTime = str;
                        }
@@ -181,7 +181,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
                                attrType = str;
                        }
                } else if (item instanceof ThreadPageSyncData) {
-                       type = item.getType();
+                       type = ((ThreadPageSyncData) item).getTypeString();
                        ThreadPageSyncData syncItem = (ThreadPageSyncData) item;
                        List<ThreadPageSyncData> children = syncItem.getChildren();
                        int childrenSize = children.size();
@@ -202,7 +202,7 @@ public class ThreadDetailInfoView extends DAViewComposite {
                        if (!tid.equals(item.getTid())) {
                                return true;
                        }
-                       if (!type.equals(item.getType())) {
+                       if (!type.equals(((ThreadPageThreadData) item).getTypeString())) {
                                return true;
                        }
                        if (!funcName.equals(((ThreadPageThreadData) item).getThreadFuncName())) {
@@ -211,10 +211,10 @@ public class ThreadDetailInfoView extends DAViewComposite {
                        if (!className.equals(((ThreadPageThreadData) item).getThreadClassName())) {
                                return true;
                        }
-                       if (!startTime.equals(((ThreadPageThreadData) item).getStartTime())) {
+                       if (!startTime.equals(((ThreadPageThreadData) item).getStartTimeString())) {
                                return true;
                        }
-                       if (!endTime.equals(((ThreadPageThreadData) item).getEndTime())) {
+                       if (!endTime.equals(((ThreadPageThreadData) item).getEndTimeString())) {
                                return true;
                        }
                        if (!attrType.equals(item.getAttrType())) {
@@ -268,4 +268,4 @@ public class ThreadDetailInfoView extends DAViewComposite {
                canvas.redraw();
        }
 
-}
+}
\ No newline at end of file
index 57b4afe..1ed1ee7 100644 (file)
@@ -31,7 +31,6 @@ import java.util.List;
 
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
-import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
@@ -39,7 +38,7 @@ import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
 public abstract class ThreadPageData {
        private String pid;
        private String tid;
-       private String type;
+       private int type;
        private String key;
        private String attrType;
        protected DAChartBoardItem item;
@@ -48,7 +47,7 @@ public abstract class ThreadPageData {
        protected DAChart chart;
        protected boolean hasUpdate = false;
 
-       public ThreadPageData(String type, String name, String pid, String tid, String attrType) {
+       public ThreadPageData(int type, String name, String pid, String tid, String attrType) {
                setType(type);
                setKey(name);
                setPid(pid);
@@ -72,11 +71,11 @@ public abstract class ThreadPageData {
                this.pid = pid;
        }
 
-       public String getType() {
+       public int getType() {
                return type;
        }
 
-       public void setType(String type) {
+       public void setType(int type) {
                this.type = type;
        }
 
@@ -131,19 +130,15 @@ public abstract class ThreadPageData {
                        ThreadPageDataEvent event, long errno) {
                DAChartSeriesItem apiItem = null;
                if (0 != errno) {
-//                     FailedData ffd = new FailedData(event.getContents());
-//                     AnalyzerManager.getFailedChecker().getFailedList().add(ffd);
-                       SummaryDataManager.getInstance().getFailedApiDataMaker().
-                               makeData(event.getContents());
-                       apiItem = new DAChartSeriesItem(event.getTime(),
+                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_BAR,
                                        ColorResources.RED, event.getTooltipContent()
                                                        + ThreadPageLabels.SYNC_CHART_ITEM_FAILED);
                } else {
-                       apiItem = new DAChartSeriesItem(event.getTime(),
+                       apiItem = new DAChartSeriesItem(event.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_BAR,
                                        ColorResources.YELLOW, event.getTooltipContent());
                }
                return apiItem;
        }
-}
+}
\ No newline at end of file
index 52d5737..9467ad9 100644 (file)
 package org.tizen.dynamicanalyzer.ui.thread;
 
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.utils.Formatter;
 
-public abstract class ThreadPageDataEvent {
+public abstract class ThreadPageDataEvent implements Cloneable {
        private LogData contents;
-       private double time = -1;
+       private long time = -1;
        private String tid = null;
        private int apiType = -1;
        private String tooltip = null;
        private long errorNum = -1;
 
-       public ThreadPageDataEvent(double time, String tid, int apiType,
+       public ThreadPageDataEvent(long time, String tid, int apiType,
                        String tooltip, long errorNum, LogData contents) {
                setTime(time);
                setTid(tid);
@@ -44,6 +45,18 @@ public abstract class ThreadPageDataEvent {
                setErrorNum(errorNum);
                setContents(contents);
        }
+       
+       public ThreadPageDataEvent clone() throws CloneNotSupportedException {
+               ThreadPageDataEvent dataEvent = (ThreadPageDataEvent) super.clone();
+               dataEvent.setContents(contents);
+               dataEvent.setTime(time);
+               dataEvent.setTid(tid);
+               dataEvent.setApiType(apiType);
+               dataEvent.setTooltipContent(tooltip);
+               dataEvent.setErrorNum(errorNum);
+               
+               return dataEvent;
+       }
 
        public LogData getContents() {
                return contents;
@@ -53,13 +66,18 @@ public abstract class ThreadPageDataEvent {
                this.contents = contents;
        }
 
-       public double getTime() {
+       public long getTime() {
                return time;
-       }
+       }       
 
-       public void setTime(double time) {
+       public void setTime(long time) {
                this.time = time;
        }
+       
+       public double getDoubleTime() {
+               double dTime = Formatter.longTimeToDoubleTime(time);
+               return dTime;
+       }
 
        public String getTid() {
                return tid;
@@ -92,4 +110,4 @@ public abstract class ThreadPageDataEvent {
        public void setErrorNum(long errorNum) {
                this.errorNum = errorNum;
        }
-}
+}
\ No newline at end of file
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIDBTable.java
new file mode 100644 (file)
index 0000000..d2b2839
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@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.thread.data;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+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.database.IResultSet;
+
+public class SyncAPIDBTable extends DBTable implements IResultSet {
+       public static final String TABLENAME="SyncAPI";
+       
+       private static final String SELECT_COLUMN = 
+                       COLUMN.SEQ.name + CommonConstants.COMMA +
+                       COLUMN.APICALLTIME.name + CommonConstants.COMMA +
+                       COLUMN.APIID.name + CommonConstants.COMMA +
+                       COLUMN.PID.name + CommonConstants.COMMA +
+                       COLUMN.TID.name + CommonConstants.COMMA +
+                       COLUMN.ARGUMENT.name + CommonConstants.COMMA +
+                       COLUMN.RETURN.name + CommonConstants.COMMA +
+                       COLUMN.ERRORNO.name;
+       public static final String SELECT_QUERY = 
+                       "select " + SELECT_COLUMN + " from " + SyncEventDBTable.TABLENAME + 
+                       CommonConstants.COMMA + TABLENAME + 
+                       "  where " + SyncEventDBTable.COLUMN.SYNCDATAID.name + " = %s and " +
+                       SyncEventDBTable.COLUMN.API_SEQNUMBER.name + " = " + COLUMN.SEQ.name;
+       
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),
+               APICALLTIME(1, "APICallTime"),
+               APIID(2, "APIID"),
+               PID(3, "PID"),
+               TID(4, "TID"),
+               ARGUMENT(5, DBConstants.DBCOLUMN_ARGUMENT),
+               RETURN(6, DBConstants.DBCOLUMN_RETURN_VALUE),
+               ERRORNO(7, DBConstants.DBCOLUMN_ERROR_NUMBER),
+               SYNCVALUE(8, "SyncValue");
+               
+               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 SyncAPIDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APICALLTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APIID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));              
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY,
+                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY,
+                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_RETURN_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+       }
+
+       public List<List<Object>> getSyncAPIFromDB() {
+               return selectAllColumnData(null);
+       }
+       
+       @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.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
+                               prep.setLong(COLUMN.APICALLTIME.index + 1, (Long) (rowData.get(COLUMN.APICALLTIME.index)));
+                               prep.setInt(COLUMN.APIID.index + 1, (Integer) (rowData.get(COLUMN.APIID.index)));
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
+                               String argumentStr = clipString((String) (rowData.get(COLUMN.ARGUMENT.index)),
+                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.ARGUMENT.index + 1, argumentStr);
+                               String retStr = clipString((String) (rowData.get(COLUMN.RETURN.index)),
+                                               DALimit.FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.RETURN.index + 1, retStr);
+                               prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
+                               prep.setLong(COLUMN.SYNCVALUE.index + 1, (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               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.SEQ.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.APICALLTIME.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.APIID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
+                       row.add(rs.getString(COLUMN.ARGUMENT.index + 1));
+                       row.add(rs.getString(COLUMN.RETURN.index + 1));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ERRORNO.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncAPIInserter.java
new file mode 100644 (file)
index 0000000..948e37d
--- /dev/null
@@ -0,0 +1,106 @@
+/*\r
+ *  Dynamic Analyzer\r
+ *\r
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact: \r
+ * WooJin Jung <woojin2.jung@samsung.com>\r
+ * Juyoung Kim <j0.kim@samsung.com>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ * \r
+ */\r
+\r
+package org.tizen.dynamicanalyzer.ui.thread.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.concurrent.LinkedBlockingQueue;\r
+\r
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
+import org.tizen.dynamicanalyzer.swap.model.data.SyncData;\r
+import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
+//TODO: use DBInserter\r
+public class SyncAPIInserter implements Runnable {\r
+       private static LinkedBlockingQueue<SyncData> syncAPIQueue = new LinkedBlockingQueue<SyncData>();\r
+\r
+       private static volatile Thread inserterThread = null;\r
+\r
+       public static void startThread() {\r
+               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                       synchronized (SyncAPIInserter.class) {\r
+                               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                                       inserterThread = new Thread(null,\r
+                                                       new SyncAPIInserter());\r
+                                       inserterThread.start();\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void stopThread() {\r
+               if (inserterThread != null && inserterThread.isAlive()) {\r
+                       try {\r
+                               sendNotify();\r
+                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
+                       } catch (InterruptedException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void pushSyncEvent(SyncData syncAPI) {\r
+               syncAPIQueue.offer(syncAPI);\r
+       }\r
+\r
+       public static void clear() {\r
+               stopThread();\r
+       }\r
+\r
+       @Override\r
+       public void run() {\r
+               while (!AnalyzerManager.isExit()) {\r
+                       SyncData syncAPI = syncAPIQueue.poll();\r
+\r
+                       if (syncAPI != null) {\r
+                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
+                               List<Object> insertRowData = new ArrayList<Object>();\r
+                               try {\r
+                                       insertRowData.add(new Long(syncAPI.getSeq()));\r
+                                       insertRowData.add(new Long(syncAPI.getTime()));\r
+                                       insertRowData.add(new Integer(syncAPI.getApiId()));\r
+                                       insertRowData.add(new Integer(syncAPI.getPid()));\r
+                                       insertRowData.add(new Integer(syncAPI.getTid()));\r
+                                       insertRowData.add(new String(syncAPI.getArgs()));\r
+                                       insertRowData.add(new String(syncAPI.getReturn()));\r
+                                       insertRowData.add(new Long(syncAPI.getErrno()));\r
+                                       insertRowData.add(new Long(syncAPI.getSyncValue()));\r
+                               } catch (ArrayIndexOutOfBoundsException e) {\r
+                                       e.printStackTrace();\r
+                               }\r
+                               insertData.add(insertRowData);\r
+                               if (insertData.size() > 0) {\r
+                                       ThreadChartManager.getInstance().getSyncAPIDBTable().insertData(insertData);\r
+                               }       \r
+                       }\r
+               }                       \r
+       }\r
+\r
+       public static void sendNotify() {\r
+//             syncAPIQueue.wake();\r
+       }\r
+}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataDBTable.java
new file mode 100644 (file)
index 0000000..32d359d
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@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.thread.data;
+
+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.database.IResultSet;
+
+public class SyncDataDBTable extends DBTable implements IResultSet {
+       public static final String TABLENAME="SyncData";
+       
+       public static final String QUERY_OPTION = "order by " + COLUMN.SYNCDATAID.name;
+       
+       private static final String SELECT_COLUMN = 
+                       COLUMN.SYNCDATAID.name + CommonConstants.COMMA +
+                       COLUMN.PID.name + CommonConstants.COMMA +
+                       COLUMN.TID.name + CommonConstants.COMMA +
+                       COLUMN.SYNCTYPE.name + CommonConstants.COMMA +
+                       COLUMN.SYNCVALUE.name + CommonConstants.COMMA +
+                       COLUMN.ATTRIBUTETYPE.name + CommonConstants.COMMA +
+                       COLUMN.SYNCDATATYPE.name + CommonConstants.COMMA +
+                       COLUMN.PARENTID.name;
+       public static final String SELECT_QUERY =
+                       "select " + SELECT_COLUMN + " from " + TABLENAME +
+                       "  order by " + COLUMN.SYNCDATAID.name; 
+       
+       public enum COLUMN {
+               SYNCDATAID(0, "SyncDataID"),
+               PID(1, "PID"),
+               TID(2, "TID"),
+               SYNCTYPE(3, "SyncType"),
+               SYNCVALUE(4, "SyncValue"),
+               ATTRIBUTETYPE(5, "AttributeType"),
+               SYNCDATATYPE(6, "SyncDataType"),
+               PARENTID(7, "ParentId");
+               
+               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 SyncDataDBTable() {
+               addColumn(new DBColumn(COLUMN.SYNCDATAID.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.SYNCTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.ATTRIBUTETYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));              
+               addColumn(new DBColumn(COLUMN.SYNCDATATYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.PARENTID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
+       }
+
+       public List<List<Object>> getSyncDataFromDB() {
+               return selectAllColumnData(QUERY_OPTION);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.SYNCDATAID.index + 1, (Integer) (rowData.get(COLUMN.SYNCDATAID.index)));
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));                           
+                               prep.setByte(COLUMN.SYNCTYPE.index + 1, (Byte) (rowData.get(COLUMN.SYNCTYPE.index)));
+                               prep.setLong(COLUMN.SYNCVALUE.index + 1, (Long) (rowData.get(COLUMN.SYNCVALUE.index)));
+                               prep.setByte(COLUMN.ATTRIBUTETYPE.index + 1, (Byte) (rowData.get(COLUMN.ATTRIBUTETYPE.index)));
+                               prep.setByte(COLUMN.SYNCDATATYPE.index + 1, (Byte) (rowData.get(COLUMN.SYNCDATATYPE.index)));
+                               prep.setInt(COLUMN.PARENTID.index + 1, (Integer) (rowData.get(COLUMN.PARENTID.index)));
+
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+       
+       @Override
+       public List<Object> extractDataFromResultSet(ResultSet rs) {
+               List<Object> row = new ArrayList<Object>();
+               try {
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.SYNCDATAID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.SYNCTYPE.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.ATTRIBUTETYPE.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.SYNCDATATYPE.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PARENTID.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncDataInserter.java
new file mode 100644 (file)
index 0000000..7872def
--- /dev/null
@@ -0,0 +1,122 @@
+/*\r
+ *  Dynamic Analyzer\r
+ *\r
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact: \r
+ * WooJin Jung <woojin2.jung@samsung.com>\r
+ * Juyoung Kim <j0.kim@samsung.com>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ * \r
+ */\r
+\r
+package org.tizen.dynamicanalyzer.ui.thread.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.concurrent.LinkedBlockingQueue;\r
+\r
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
+import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;\r
+import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
+import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;\r
+import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataManager;\r
+//TODO: use DBInserter\r
+public class SyncDataInserter implements Runnable {\r
+       private static LinkedBlockingQueue<ThreadPageSyncData> syncDataQueue = new LinkedBlockingQueue<ThreadPageSyncData>();\r
+\r
+       private static volatile Thread inserterThread = null;\r
+\r
+       public static void startThread() {\r
+               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                       synchronized (SyncDataInserter.class) {\r
+                               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                                       inserterThread = new Thread(null,\r
+                                                       new SyncDataInserter());\r
+                                       inserterThread.start();\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void stopThread() {\r
+               if (inserterThread != null && inserterThread.isAlive()) {\r
+                       try {\r
+                               sendNotify();\r
+                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
+                       } catch (InterruptedException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void pushSyncData(ThreadPageSyncData syncData) {\r
+               syncDataQueue.offer(syncData);\r
+       }\r
+\r
+       public static void clear() {\r
+               stopThread();\r
+       }\r
+\r
+       @Override\r
+       public void run() {\r
+               while (!AnalyzerManager.isExit()) {\r
+                       ThreadPageSyncData syncData = syncDataQueue.poll();\r
+\r
+                       if (syncData != null) {\r
+                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
+                               List<Object> insertRowData = new ArrayList<Object>();\r
+                               try {\r
+                                       insertRowData.add(new Integer(syncData.getSyncDataID()));\r
+                                       insertRowData.add(new Integer(syncData.getPid()));\r
+                                       insertRowData.add(new Integer(syncData.getTid()));\r
+                                       Integer type = new Integer(syncData.getType());\r
+                                       byte syncType = type.byteValue();\r
+                                       insertRowData.add(new Byte(syncType));\r
+                                       insertRowData.add(new Long(syncData.getKey()));\r
+                                       String attrTypeStr = syncData.getAttrType();\r
+                                       byte attrType = -1;\r
+                                       if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_NORMAL)) {\r
+                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_NORMAL;\r
+                                       } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE)) {\r
+                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_RECURSIVE;\r
+                                       } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_ERRORCHECK)) {\r
+                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_ERRORCHECK;          \r
+                                       } else if (attrTypeStr.equals(ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT)) {\r
+                                               attrType = ThreadPageSyncDataManager.PTHREAD_MUTEX_DEFAULT;\r
+                                       } else {\r
+                                               attrType = -1;\r
+                                       }\r
+                                       insertRowData.add(new Byte(attrType));\r
+                                       insertRowData.add(new Byte(syncData.getSyncDataType()));\r
+                                       insertRowData.add(new Integer(syncData.getParentID()));\r
+                               } catch (ArrayIndexOutOfBoundsException e) {\r
+                                       e.printStackTrace();\r
+                               }\r
+                               insertData.add(insertRowData);\r
+                               if (insertData.size() > 0) {\r
+                                       ThreadChartManager.getInstance().getSyncDataDBTable().insertData(insertData);\r
+                               }\r
+                       }\r
+               }                       \r
+       }\r
+\r
+       public static void sendNotify() {\r
+//             syncDataQueue.wake();\r
+       }\r
+}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventDBTable.java
new file mode 100644 (file)
index 0000000..e79de6a
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@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.thread.data;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+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.database.IResultSet;
+
+public class SyncEventDBTable extends DBTable implements IResultSet {
+       public static final String TABLENAME="SyncEvent";
+       
+       private static final String SELECT_COLUMN = 
+                       COLUMN.EVENTTIME.name + CommonConstants.COMMA +
+                       COLUMN.APITYPE.name + CommonConstants.COMMA +
+                       COLUMN.TOOLTIP.name + CommonConstants.COMMA +
+                       COLUMN.ERRORNO.name + CommonConstants.COMMA +
+                       COLUMN.SYNCVALUE.name;
+       public static final String SELECT_QUERY = 
+                       "select " + SELECT_COLUMN + " from " + TABLENAME + 
+                       "  where " + COLUMN.SYNCDATAID.name + " = %s ";
+       
+       public enum COLUMN {
+               API_SEQNUMBER(0, "APISEQNUMBER"),
+               SYNCDATAID(1, "SyncDataID"),
+               EVENTTIME(2, "EventTime"),
+               APITYPE(3, "APIType"),
+               TOOLTIP(4, "Tooltip"),
+               ERRORNO(5, DBConstants.DBCOLUMN_ERROR_NUMBER),
+               SYNCVALUE(6, "SyncValue");
+
+               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 SyncEventDBTable() {
+               addColumn(new DBColumn(COLUMN.API_SEQNUMBER.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.SYNCDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.EVENTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APITYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, 
+                               DBConstants.VARCHAR, DALimit.TOOLTIP_LENGTH));          
+               addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.SYNCVALUE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               setIndexColumn(COLUMN.SYNCDATAID.index);
+       }
+
+       public List<List<Object>> getSyncEventFromDB() {
+               return selectAllColumnData(null);
+       }
+       
+       @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.API_SEQNUMBER.index + 1, (Long) (rowData.get(COLUMN.API_SEQNUMBER.index)));
+                               prep.setInt(COLUMN.SYNCDATAID.index + 1, (Integer) (rowData.get(COLUMN.SYNCDATAID.index)));                             
+                               prep.setLong(COLUMN.EVENTTIME.index + 1, (Long) (rowData.get(COLUMN.EVENTTIME.index)));
+                               prep.setByte(COLUMN.APITYPE.index + 1, (Byte) (rowData.get(COLUMN.APITYPE.index)));
+                               String tooltipStr = clipString((String) (rowData.get(COLUMN.TOOLTIP.index)),
+                                               DALimit.TOOLTIP_LENGTH, rowData.get(COLUMN.EVENTTIME.index).toString());
+                               prep.setString(COLUMN.TOOLTIP.index + 1, tooltipStr);                                                           
+                               prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
+                               prep.setLong(COLUMN.SYNCVALUE.index + 1, (Long) (rowData.get(COLUMN.SYNCVALUE.index)));         
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               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.API_SEQNUMBER.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.SYNCDATAID.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.EVENTTIME.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.APITYPE.index + 1)));
+                       row.add(rs.getString(COLUMN.TOOLTIP.index + 1));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ERRORNO.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.SYNCVALUE.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/SyncEventInserter.java
new file mode 100644 (file)
index 0000000..233a247
--- /dev/null
@@ -0,0 +1,105 @@
+/*\r
+ *  Dynamic Analyzer\r
+ *\r
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact: \r
+ * WooJin Jung <woojin2.jung@samsung.com>\r
+ * Juyoung Kim <j0.kim@samsung.com>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ * \r
+ */\r
+\r
+package org.tizen.dynamicanalyzer.ui.thread.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.concurrent.LinkedBlockingQueue;\r
+\r
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
+import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
+import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataEvent;\r
+//TODO: use DBInserter\r
+public class SyncEventInserter implements Runnable {\r
+       private static LinkedBlockingQueue<ThreadPageSyncDataEvent> syncEventQueue = new LinkedBlockingQueue<ThreadPageSyncDataEvent>();\r
+\r
+       private static volatile Thread inserterThread = null;\r
+\r
+       public static void startThread() {\r
+               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                       synchronized (SyncEventInserter.class) {\r
+                               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                                       inserterThread = new Thread(null,\r
+                                                       new SyncEventInserter());\r
+                                       inserterThread.start();\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void stopThread() {\r
+               if (inserterThread != null && inserterThread.isAlive()) {\r
+                       try {\r
+                               sendNotify();\r
+                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
+                       } catch (InterruptedException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void pushSyncEvent(ThreadPageSyncDataEvent syncEvent) {\r
+               syncEventQueue.offer(syncEvent);\r
+       }\r
+\r
+       public static void clear() {\r
+               stopThread();\r
+       }\r
+\r
+       @Override\r
+       public void run() {\r
+               while (!AnalyzerManager.isExit()) {\r
+                       ThreadPageSyncDataEvent syncEvent = syncEventQueue.poll();\r
+\r
+                       if (syncEvent != null) {\r
+                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
+                               List<Object> insertRowData = new ArrayList<Object>();\r
+                               try {\r
+                                       insertRowData.add(new Long(syncEvent.getContents().getSeq()));\r
+                                       insertRowData.add(new Integer(syncEvent.getSyncDataID()));\r
+                                       insertRowData.add(new Long(syncEvent.getTime()));\r
+                                       Integer apiType = new Integer(syncEvent.getApiType());\r
+                                       insertRowData.add(new Byte(apiType.byteValue()));\r
+                                       insertRowData.add(new String(syncEvent.getTooltipContent()));\r
+                                       insertRowData.add(new Long(syncEvent.getErrorNum()));\r
+                                       insertRowData.add(new Long(syncEvent.getSyncVal()));\r
+                               } catch (ArrayIndexOutOfBoundsException e) {\r
+                                       e.printStackTrace();\r
+                               }\r
+                               insertData.add(insertRowData);\r
+                               if (insertData.size() > 0) {\r
+                                       ThreadChartManager.getInstance().getSyncEventDBTable().insertData(insertData);\r
+                               }\r
+                       }\r
+               }                       \r
+       }\r
+\r
+       public static void sendNotify() {\r
+//             syncEventQueue.wake();\r
+       }\r
+}\r
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadAPIDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadAPIDBTable.java
new file mode 100644 (file)
index 0000000..3ae85ae
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@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.thread.data;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+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.database.IResultSet;
+
+public class ThreadAPIDBTable extends DBTable implements IResultSet {
+       public static final String TABLENAME="ThreadAPI";
+       
+       private static final String SELECT_COLUMN = 
+                       COLUMN.SEQ.name + CommonConstants.COMMA +
+                       COLUMN.APICALLTIME.name + CommonConstants.COMMA +
+                       COLUMN.APIID.name + CommonConstants.COMMA +
+                       COLUMN.PID.name + CommonConstants.COMMA +
+                       COLUMN.TID.name + CommonConstants.COMMA +
+                       COLUMN.ARGUMENT.name + CommonConstants.COMMA +
+                       COLUMN.RETURN.name + CommonConstants.COMMA +
+                       COLUMN.ERRORNO.name;
+       public static final String SELECT_QUERY = 
+                       "select " + SELECT_COLUMN + " from " + TABLENAME + 
+                       "  where " + COLUMN.THREADDATAID.name + " = %s";
+       
+       public enum COLUMN {
+               SEQ(0, "SEQNUMBER"),
+               THREADDATAID(1, "ThreadDataID"),
+               APICALLTIME(2, "APICallTime"),
+               APIID(3, "APIID"),
+               PID(4, "PID"),
+               TID(5, "TID"),
+               ARGUMENT(6, DBConstants.DBCOLUMN_ARGUMENT),
+               RETURN(7, DBConstants.DBCOLUMN_RETURN_VALUE),
+               ERRORNO(8, DBConstants.DBCOLUMN_ERROR_NUMBER);
+               
+               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 ThreadAPIDBTable() {
+               addColumn(new DBColumn(COLUMN.SEQ.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.APICALLTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.APIID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));              
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY,
+                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.RETURN.name, DBConstants.EMPTY,
+                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_RETURN_VALUE_LENGTH));
+               addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.EMPTY, DBConstants.DBTYPE_LONG));
+               setIndexColumn(COLUMN.THREADDATAID.index);
+       }
+
+       public List<List<Object>> getThreadAPIFromDB() {
+               return selectAllColumnData(null);
+       }
+       
+       @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.SEQ.index + 1, (Long) (rowData.get(COLUMN.SEQ.index)));
+                               prep.setInt(COLUMN.THREADDATAID.index + 1, (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
+                               prep.setLong(COLUMN.APICALLTIME.index + 1, (Long) (rowData.get(COLUMN.APICALLTIME.index)));
+                               prep.setInt(COLUMN.APIID.index + 1, (Integer) (rowData.get(COLUMN.APIID.index)));
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
+                               String argumentStr = clipString((String) (rowData.get(COLUMN.ARGUMENT.index)),
+                                               DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.ARGUMENT.index + 1, argumentStr);
+                               String retStr = clipString((String) (rowData.get(COLUMN.RETURN.index)),
+                                               DALimit.FUNCTION_RETURN_VALUE_LENGTH, rowData.get(COLUMN.SEQ.index).toString());
+                               prep.setString(COLUMN.RETURN.index + 1, retStr);
+                               prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
+                               
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               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.SEQ.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.THREADDATAID.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.APICALLTIME.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.APIID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
+                       row.add(rs.getString(COLUMN.ARGUMENT.index + 1));
+                       row.add(rs.getString(COLUMN.RETURN.index + 1));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ERRORNO.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadDataDBTable.java
new file mode 100644 (file)
index 0000000..88bbe08
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@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.thread.data;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+import org.tizen.dynamicanalyzer.database.DBColumn;
+import org.tizen.dynamicanalyzer.database.DBConstants;
+import org.tizen.dynamicanalyzer.database.DBTable;
+import org.tizen.dynamicanalyzer.database.IResultSet;
+
+public class ThreadDataDBTable extends DBTable implements IResultSet {
+       public static final String TABLENAME="ThreadData";
+       
+       public enum COLUMN {
+               THREADDATAID(0, "ThreadDataID"),
+               PID(1, "PID"),
+               TID(2, "TID"),
+               THREADTYPE(3, "ThreadType"),
+               ATTRIBUTETYPE(4, "AttributeType"),
+               STARTTIME(5, "StartTime"),
+               ENDTIME(6, "EndTime"),
+               FUNCTIONID(7, "FunctionId"),
+               CLASSNAME(8, "ClassName");
+               
+               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 ThreadDataDBTable() {
+               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.PRIMARY_KEY, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.PID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.THREADTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.ATTRIBUTETYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.STARTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));          
+               addColumn(new DBColumn(COLUMN.ENDTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.FUNCTIONID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.CLASSNAME.name, DBConstants.EMPTY, 
+                               DBConstants.VARCHAR, DALimit.CLASS_NAME_LENGTH));               
+       }
+
+       public List<List<Object>> getThreadDataFromDB() {
+               return selectAllColumnData(null);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.THREADDATAID.index + 1, (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
+                               prep.setInt(COLUMN.PID.index + 1, (Integer) (rowData.get(COLUMN.PID.index)));
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));                           
+                               prep.setByte(COLUMN.THREADTYPE.index + 1, (Byte) (rowData.get(COLUMN.THREADTYPE.index)));
+                               prep.setByte(COLUMN.ATTRIBUTETYPE.index + 1, (Byte) (rowData.get(COLUMN.ATTRIBUTETYPE.index)));
+                               prep.setLong(COLUMN.STARTTIME.index + 1, (Long) (rowData.get(COLUMN.STARTTIME.index)));
+                               prep.setLong(COLUMN.ENDTIME.index + 1, (Long) (rowData.get(COLUMN.ENDTIME.index)));
+                               prep.setInt(COLUMN.FUNCTIONID.index + 1, (Integer) (rowData.get(COLUMN.FUNCTIONID.index)));
+
+                               String classNameStr = clipString((String) (rowData.get(COLUMN.CLASSNAME.index)),
+                                               DALimit.CLASS_NAME_LENGTH, rowData.get(COLUMN.THREADDATAID.index).toString());
+                               prep.setString(COLUMN.CLASSNAME.index + 1, classNameStr);                               
+                               
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+       
+       @Override
+       public List<Object> extractDataFromResultSet(ResultSet rs) {
+               List<Object> row = new ArrayList<Object>();
+               try {
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.THREADDATAID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.PID.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.THREADTYPE.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.ATTRIBUTETYPE.index + 1)));      
+                       row.add(Long.valueOf(rs.getLong(COLUMN.STARTTIME.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ENDTIME.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.FUNCTIONID.index + 1)));
+                       row.add(rs.getString(COLUMN.CLASSNAME.index + 1));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventDBTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventDBTable.java
new file mode 100644 (file)
index 0000000..18d35b3
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ *  Dynamic Analyzer
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: 
+ * WooJin Jung <woojin2.jung@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.thread.data;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tizen.dynamicanalyzer.common.DALimit;
+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.database.IResultSet;
+
+public class ThreadEventDBTable extends DBTable implements IResultSet {
+       public static final String TABLENAME="ThreadEvent";
+       
+       private static final String SELECT_COLUMN = 
+                       COLUMN.EVENTTIME.name + CommonConstants.COMMA +
+                       COLUMN.TID.name + CommonConstants.COMMA +
+                       COLUMN.APITYPE.name + CommonConstants.COMMA +
+                       COLUMN.TOOLTIP.name + CommonConstants.COMMA +
+                       COLUMN.ERRORNO.name + CommonConstants.COMMA +
+                       COLUMN.EVENTTYPE.name + CommonConstants.COMMA +
+                       COLUMN.THREADTYPE.name + CommonConstants.COMMA +
+                       COLUMN.CALLERID.name;
+       public static final String SELECT_QUERY = 
+                       "select " + SELECT_COLUMN + " from " + TABLENAME + 
+                       "  where " + COLUMN.THREADDATAID.name + " = %s ";
+       
+       public enum COLUMN {
+               THREADDATAID(0, "ThreadDataID"),
+               EVENTTIME(1, "EventTime"),
+               TID(2, "TID"),
+               APITYPE(3, "APIType"),
+               TOOLTIP(4, "Tooltip"),
+               ERRORNO(5, DBConstants.DBCOLUMN_ERROR_NUMBER),
+               EVENTTYPE(6, "EventType"),
+               THREADTYPE(7, "ThreadType"),
+               CALLERID(8, "CallerID");
+               
+               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 ThreadEventDBTable() {
+               addColumn(new DBColumn(COLUMN.THREADDATAID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.EVENTTIME.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.TID.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.APITYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.TOOLTIP.name, DBConstants.EMPTY, 
+                               DBConstants.VARCHAR, DALimit.TOOLTIP_LENGTH));          
+               addColumn(new DBColumn(COLUMN.ERRORNO.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
+               addColumn(new DBColumn(COLUMN.EVENTTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT1));
+               addColumn(new DBColumn(COLUMN.THREADTYPE.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_INT4));
+               addColumn(new DBColumn(COLUMN.CALLERID.name, DBConstants.EMPTY, DBConstants.DBTYPE_INT4));              
+               setIndexColumn(COLUMN.THREADDATAID.index);
+       }
+
+       public List<List<Object>> getThreadEventFromDB() {
+               return selectAllColumnData(null);
+       }
+       
+       @Override
+       public boolean prepare(PreparedStatement prep, List<Object> rowData) {
+               boolean isPrepared = true;
+               
+               int columnsize = getColumnSize();
+               if (columnsize != rowData.size()) {
+                       isPrepared = false;
+               } else {
+                       try {
+                               prep.setInt(COLUMN.THREADDATAID.index + 1, (Integer) (rowData.get(COLUMN.THREADDATAID.index)));
+                               prep.setLong(COLUMN.EVENTTIME.index + 1, (Long) (rowData.get(COLUMN.EVENTTIME.index)));                         
+                               prep.setInt(COLUMN.TID.index + 1, (Integer) (rowData.get(COLUMN.TID.index)));
+                               prep.setByte(COLUMN.APITYPE.index + 1, (Byte) (rowData.get(COLUMN.APITYPE.index)));
+                               String tooltipStr = clipString((String) (rowData.get(COLUMN.TOOLTIP.index)),
+                                               DALimit.TOOLTIP_LENGTH, rowData.get(COLUMN.EVENTTIME.index).toString());
+                               prep.setString(COLUMN.TOOLTIP.index + 1, tooltipStr);                                                           
+                               prep.setLong(COLUMN.ERRORNO.index + 1, (Long) (rowData.get(COLUMN.ERRORNO.index)));
+                               prep.setByte(COLUMN.EVENTTYPE.index + 1, (Byte) (rowData.get(COLUMN.EVENTTYPE.index)));
+                               prep.setInt(COLUMN.THREADTYPE.index + 1, (Integer) (rowData.get(COLUMN.THREADTYPE.index)));
+                               prep.setInt(COLUMN.CALLERID.index + 1, (Integer) (rowData.get(COLUMN.CALLERID.index)));                         
+                       } catch (SQLException e) {
+                               e.printStackTrace();
+                               isPrepared = false;
+                       }
+               }
+               
+               return isPrepared;
+       }
+       
+       public List<Object> extractDataFromResultSet(ResultSet rs) {
+               List<Object> row = new ArrayList<Object>();
+               try {
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.THREADDATAID.index + 1)));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.EVENTTIME.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.TID.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.APITYPE.index + 1)));
+                       row.add(rs.getString(COLUMN.TOOLTIP.index + 1));
+                       row.add(Long.valueOf(rs.getLong(COLUMN.ERRORNO.index + 1)));
+                       row.add(Byte.valueOf(rs.getByte(COLUMN.EVENTTYPE.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.THREADTYPE.index + 1)));
+                       row.add(Integer.valueOf(rs.getInt(COLUMN.CALLERID.index + 1)));
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return null;
+               }
+               
+               return row;
+       }
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventInserter.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/data/ThreadEventInserter.java
new file mode 100644 (file)
index 0000000..33b0e7c
--- /dev/null
@@ -0,0 +1,136 @@
+/*\r
+ *  Dynamic Analyzer\r
+ *\r
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.\r
+ *\r
+ * Contact: \r
+ * WooJin Jung <woojin2.jung@samsung.com>\r
+ * Juyoung Kim <j0.kim@samsung.com>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * Contributors:\r
+ * - S-Core Co., Ltd\r
+ * \r
+ */\r
+\r
+package org.tizen.dynamicanalyzer.ui.thread.data;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.concurrent.LinkedBlockingQueue;\r
+\r
+import org.tizen.dynamicanalyzer.common.AnalyzerConstants;\r
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;\r
+import org.tizen.dynamicanalyzer.swap.model.data.ThreadData;\r
+import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;\r
+import org.tizen.dynamicanalyzer.ui.thread.thread.ThreadPageThreadDataEvent;\r
+// TODO: use DBInserter\r
+public class ThreadEventInserter implements Runnable {\r
+       private static LinkedBlockingQueue<ThreadPageThreadDataEvent> threadEventQueue = new LinkedBlockingQueue<ThreadPageThreadDataEvent>();\r
+\r
+       private static volatile Thread inserterThread = null;\r
+\r
+       public static void startThread() {\r
+               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                       synchronized (ThreadEventInserter.class) {\r
+                               if (inserterThread == null || !inserterThread.isAlive()) {\r
+                                       inserterThread = new Thread(null,\r
+                                                       new ThreadEventInserter());\r
+                                       inserterThread.start();\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void stopThread() {\r
+               if (inserterThread != null && inserterThread.isAlive()) {\r
+                       try {\r
+                               sendNotify();\r
+                               inserterThread.join(AnalyzerConstants.THREAD_JOIN_WAIT_TIME);\r
+                       } catch (InterruptedException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static void pushThreadEvent(ThreadPageThreadDataEvent threadEvent) {\r
+               threadEventQueue.offer(threadEvent);\r
+       }\r
+\r
+       public static void clear() {\r
+               stopThread();\r
+       }\r
+\r
+       @Override\r
+       public void run() {\r
+               while (!AnalyzerManager.isExit()) {\r
+                       ThreadPageThreadDataEvent threadEvent = threadEventQueue.poll();\r
+\r
+                       if (threadEvent != null) {\r
+                               ArrayList<List<Object>> insertData = new ArrayList<List<Object>>();             \r
+                               List<Object> insertRowData = new ArrayList<Object>();\r
+                               try {\r
+                                       insertRowData.add(new Integer(threadEvent.getThreadDataID()));\r
+                                       insertRowData.add(new Long(threadEvent.getTime()));\r
+                                       insertRowData.add(new Integer(threadEvent.getTid()));\r
+                                       Integer apiType = new Integer(threadEvent.getApiType());\r
+                                       insertRowData.add(new Byte(apiType.byteValue()));\r
+                                       insertRowData.add(new String(threadEvent.getTooltipContent()));\r
+                                       insertRowData.add(new Long(threadEvent.getErrorNum()));\r
+                                       Integer eventType = new Integer(threadEvent.getEventType());\r
+                                       insertRowData.add(new Byte(eventType.byteValue()));\r
+                                       insertRowData.add(new Integer(threadEvent.getThreadType()));\r
+                                       Integer callerTid = -1;\r
+                                       if (threadEvent.getCallerTid() != null) {\r
+                                               callerTid = new Integer(threadEvent.getCallerTid());                                            \r
+                                       }\r
+                                       insertRowData.add(callerTid);\r
+                               } catch (ArrayIndexOutOfBoundsException e) {\r
+                                       e.printStackTrace();\r
+                               }\r
+                               insertData.add(insertRowData);\r
+                               if (insertData.size() > 0) {\r
+                                       ThreadChartManager.getInstance().getThreadEventDBTable().insertData(insertData);\r
+                               }\r
+                               // save ThreadAPI\r
+                               if (threadEvent.getEventType() == ThreadPageThreadDataEvent.TYPE_API) {\r
+                                       ArrayList<List<Object>> apiData = new ArrayList<List<Object>>();                \r
+                                       List<Object> apiRowData = new ArrayList<Object>();\r
+                                       ThreadData tData = (ThreadData) threadEvent.getContents();\r
+                                       try {\r
+                                               apiRowData.add(new Long(tData.getSeq()));\r
+                                               apiRowData.add(new Integer(threadEvent.getThreadDataID()));\r
+                                               apiRowData.add(new Long(tData.getTime()));\r
+                                               apiRowData.add(new Integer(tData.getApiId()));\r
+                                               apiRowData.add(new Integer(tData.getPid()));\r
+                                               apiRowData.add(new Integer(tData.getTid()));\r
+                                               apiRowData.add(new String(tData.getArgs()));\r
+                                               apiRowData.add(new String(tData.getReturn()));\r
+                                               apiRowData.add(new Long(tData.getErrno()));\r
+                                       } catch (ArrayIndexOutOfBoundsException e) {\r
+                                               e.printStackTrace();\r
+                                       }\r
+                                       apiData.add(apiRowData);\r
+                                       if (apiData.size() > 0) {\r
+                                               ThreadChartManager.getInstance().getThreadAPIDBTable().insertData(apiData);\r
+                                       }       \r
+                               }\r
+                       }\r
+               }                       \r
+       }\r
+\r
+       public static void sendNotify() {\r
+//             threadEventQueue.wake();\r
+       }\r
+}\r
index c13a416..cf83529 100644 (file)
@@ -28,6 +28,7 @@ package org.tizen.dynamicanalyzer.ui.thread.sync;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
@@ -42,10 +43,30 @@ public class ThreadPageSyncData extends ThreadPageData {
        private List<ThreadPageSyncData> children = new ArrayList<ThreadPageSyncData>();
        private DAChartSeries apiSeries;
        private DAChartSeries stateSeries;
+       
+       public static final byte SYNC_PARENT = 0;
+       public static final byte SYNC_CHILD = 1;
+       public static final byte THREAD_CHILD = 2;
+       
+       private static int internalSeq = 0;
+       private int syncDataID = -1;
+       private byte syncDataType = -1;
+       private int parentID = -1;
 
-       public ThreadPageSyncData(String type, String name, String pid, String tid,
-                       String attrType) {
+       public ThreadPageSyncData(int type, String name, String pid, String tid,
+                       String attrType, byte syncDataType) {
                super(type, name, pid, tid, attrType);
+               this.syncDataType = syncDataType;
+               syncDataID = internalSeq++;
+       }
+       
+       // using open trace
+       public ThreadPageSyncData(int id, int pid, int tid, int type, long syncValue, 
+                       String attrType, byte syncDataType, int parentID) {
+               super(type, String.valueOf(syncValue), String.valueOf(pid), String.valueOf(tid), attrType);
+               this.syncDataID = id;
+               this.syncDataType = syncDataType;
+               this.parentID = parentID;
        }
 
        protected void pushSync(ThreadPageSyncData sync) {
@@ -77,11 +98,11 @@ public class ThreadPageSyncData extends ThreadPageData {
                apiSeries = chart.getSeries(ThreadPageLabels.THREAD_CHART_SERIES_API);
        }
 
-       private boolean isSyncApi(int apiType) {
-               if (apiType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END) {
+       public static boolean isSyncApi(int apiType) {
+               if (apiType == LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START) {
                        return false;
                }
-               if (apiType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END) {
+               if (apiType == LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START) {
                        return false;
                }
                return true;
@@ -134,12 +155,12 @@ public class ThreadPageSyncData extends ThreadPageData {
                case LogCenterConstants.SYNC_API_TYPE_NOTIFY_ALL:
                case LogCenterConstants.SYNC_API_TYPE_OTHER:
                        if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                                ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                                "");
                        } else {
-                       stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                        ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                        ThreadPageLabels.SYNC_CHART_ITEM_UNUSED);
@@ -151,12 +172,12 @@ public class ThreadPageSyncData extends ThreadPageData {
                case LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_START:
                case LogCenterConstants.SYNC_API_TYPE_COND_WAIT_START:
                        if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                                ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                                "");
                        } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_CONTINUE,
                                        ColorResources.THREAD_GRAPH_LOCK_WAIT_COLOR,
                                        ThreadPageLabels.SYNC_CHART_ITEM_WAITED);
@@ -167,12 +188,12 @@ public class ThreadPageSyncData extends ThreadPageData {
                        break;
                case LogCenterConstants.SYNC_API_TYPE_RELEASE:
                        if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                                ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                                "");
                        } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                        ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                        ThreadPageLabels.SYNC_CHART_ITEM_UNUSED);
@@ -184,12 +205,12 @@ public class ThreadPageSyncData extends ThreadPageData {
                case LogCenterConstants.SYNC_API_TYPE_ACQUIRE_WAIT_END:
                case LogCenterConstants.SYNC_API_TYPE_COND_WAIT_END:
                        if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                                ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                                "");
                        } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_CONTINUE,
                                        ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
                                        ThreadPageLabels.SYNC_CHART_ITEM_USED);
@@ -198,12 +219,12 @@ public class ThreadPageSyncData extends ThreadPageData {
                        break;
                case LogCenterConstants.SYNC_API_TYPE_TRY_ACQUIRE:
                        if(((DAChartBoardItem)item).getChartBoard() != null){
-                               stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                               stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_STATE_CONNECTION,
                                                ColorResources.THREAD_GRAPH_LOCK_RELEASE_COLOR,
                                                "");
                        } else{
-                       stateItem = new DAChartSeriesItem(syncEvent.getTime(),
+                       stateItem = new DAChartSeriesItem(syncEvent.getDoubleTime(),
                                        DAChartSeriesItem.SERIES_STATE_CONTINUE,
                                        ColorResources.THREAD_GRAPH_LOCK_ACQUIRE_COLOR,
                                        ThreadPageLabels.SYNC_CHART_ITEM_USED);
@@ -218,4 +239,48 @@ public class ThreadPageSyncData extends ThreadPageData {
 
                return apiType;
        }
-}
+       
+       public String getTypeString() {
+               switch (getType()) {
+               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
+                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MUTEX;
+               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
+                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MONITOR;
+               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
+                       return ThreadPageLabels.SYNC_TYPE_TIZEN_SEMAPHORE;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_MUTEX;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_COND_VARIABLE;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_RWLOCK;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_SPINLOCK;
+               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
+                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_BARRIER;
+               default:
+                       Logger.error("unknown sync type!!");
+                       return CommonConstants.EMPTY;
+               }
+       }
+       
+       public int getSyncDataID() {
+               return syncDataID;
+       }
+       
+       public byte getSyncDataType() {
+               return syncDataType;
+       }
+       
+       public int getParentID() {
+               return parentID;
+       }
+       
+       public void setParentID(int parentID) {
+               this.parentID = parentID;
+       }
+       
+       public static void clear() {
+               internalSeq = 0;
+       }
+}
\ No newline at end of file
index 2982334..a99bd7e 100644 (file)
@@ -31,20 +31,53 @@ import org.tizen.dynamicanalyzer.ui.thread.ThreadPageDataEvent;
 public class ThreadPageSyncDataEvent extends ThreadPageDataEvent {
        private String syncVal;
        private int type = -1;
+       private int syncDataID = -1;
 
        public ThreadPageSyncDataEvent(String syncVal, int type, int apiType,
-                       double time, String tid, String tooltip, long errorNum,
+                       long time, String tid, String tooltip, long errorNum,
                        LogData contents) {
                super(time, tid, apiType, tooltip, errorNum, contents);
                this.syncVal = syncVal;
                this.type = type;
        }
+       
+       // using open trace
+       public ThreadPageSyncDataEvent(long time, int apiType, String tooltip, 
+                       long errorNum, String syncVal) {
+               super(time, null, apiType, tooltip, errorNum, null);
+               this.syncVal = syncVal;
+       }
+       
+       public ThreadPageSyncDataEvent clone() throws CloneNotSupportedException {
+               ThreadPageSyncDataEvent syncDataEvent = (ThreadPageSyncDataEvent) super.clone();
+               syncDataEvent.setSyncVal(syncVal);
+               syncDataEvent.setType(type);
+               syncDataEvent.setSyncDataID(syncDataID);
+               
+               return syncDataEvent;
+       }
 
        public String getSyncVal() {
                return syncVal;
        }
+       
+       public void setSyncVal(String syncVal) {
+               this.syncVal = syncVal;
+       }
 
        public int getType() {
                return type;
        }
-}
+       
+       public void setType(int type) {
+               this.type = type;
+       }
+       
+       public int getSyncDataID() {
+               return syncDataID;
+       }
+       
+       public void setSyncDataID(int syncDataID) {
+               this.syncDataID = syncDataID;
+       }
+}
\ No newline at end of file
index 2f640f2..8decf57 100644 (file)
@@ -27,9 +27,9 @@
 package org.tizen.dynamicanalyzer.ui.thread.sync;
 
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Comparator;
 
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
@@ -50,8 +50,10 @@ import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListen
 import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
 import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
 import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
+import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
 import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
-import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncDataInserter;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncEventInserter;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
@@ -67,11 +69,13 @@ import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
 public class ThreadPageSyncDataManager {
        private DAChartBoard board;
        private List<ThreadPageSyncData> rows = new ArrayList<ThreadPageSyncData>();
+       private List<ThreadPageSyncData> rowsQueue = new ArrayList<ThreadPageSyncData>();
        private List<ThreadPageSyncDataEvent> syncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
        private HashMap<String, Integer> syncAttrMap = new HashMap<String, Integer>();
        public static final int PTHREAD_MUTEX_NORMAL = 0;
        public static final int PTHREAD_MUTEX_RECURSIVE = 1;
        public static final int PTHREAD_MUTEX_ERRORCHECK = 2;
+       public static final int PTHREAD_MUTEX_DEFAULT = 3;
        private int preSelectionPid = -1;
 
        public ThreadPageSyncDataManager(DAChartBoard board) {
@@ -86,6 +90,10 @@ public class ThreadPageSyncDataManager {
                this.board = board;
        }
 
+       public void pushRow(ThreadPageSyncData data) {
+               rowsQueue.add(data);
+       }
+       
        private void pushEvent(ThreadPageSyncDataEvent event) {
                syncEventQueue.add(event);
        }
@@ -109,6 +117,8 @@ public class ThreadPageSyncDataManager {
                        return ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE;
                } else if (typeInt == PTHREAD_MUTEX_ERRORCHECK) {
                        return ThreadPageLabels.SYNC_ATTR_TYPE_ERRORCHECK;
+               } else if (typeInt == PTHREAD_MUTEX_DEFAULT) { // for open trace
+                       return ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT;         
                } else {
                        return CommonConstants.EMPTY;
                }
@@ -120,10 +130,8 @@ public class ThreadPageSyncDataManager {
                if (type == LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX) {
                        return ThreadPageLabels.SYNC_ATTR_TYPE_RECURSIVE;
                } else if (type == LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX) {
-
                        return ThreadPageLabels.SYNC_ATTR_TYPE_DEFAULT;
                }
-
                return CommonConstants.EMPTY;
        }
 
@@ -134,8 +142,7 @@ public class ThreadPageSyncDataManager {
                }
                SyncData syncData = (SyncData) input;
                // System.out.println("input : " + input);
-               double time = Double.parseDouble(Long.toString(syncData.getTime()))
-                               / TimelineConstants.MEGA_DOUBLE;
+               long time = syncData.getTime();
                String tid = Integer.toString(syncData.getTid());
 
                int type = syncData.getSyncType();
@@ -145,6 +152,9 @@ public class ThreadPageSyncDataManager {
                String name = Long.toString(syncData.getSyncValue());
 
                long errorNum = syncData.getErrno();
+               if (errorNum != 0) {
+                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(syncData);
+               }
 
                ThreadPageSyncDataEvent event;
                switch (type) {
@@ -199,8 +209,7 @@ public class ThreadPageSyncDataManager {
                for (int i = 0; i < size; i++) {
                        input = (SyncData) inputs.get(i);
                        // System.out.println("input : " + input);
-                       double time = Double.parseDouble(Long.toString(input.getTime()))
-                                       / TimelineConstants.MEGA_DOUBLE;
+                       long time = input.getTime();
                        String tid = Integer.toString(input.getTid());
 
                        int type = input.getSyncType();
@@ -297,29 +306,6 @@ public class ThreadPageSyncDataManager {
                parseSyncs(inputs);
        }
 
-       private String getSyncTypeString(int syncType) {
-               switch (syncType) {
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MUTEX;
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MONITOR;
-               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_SEMAPHORE;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_MUTEX;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_COND_VARIABLE;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_RWLOCK;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_SPINLOCK;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_BARRIER;
-               default:
-                       return CommonConstants.EMPTY;
-               }
-       }
-
        private void initSyncChart(DAChart chart, boolean isParent) {
                if (null == chart) {
                        return;
@@ -398,7 +384,7 @@ public class ThreadPageSyncDataManager {
                DAChart chart;
 
                if (null == parent) {
-                       item = new DAChartBoardItem(board, sync.getType()
+                       item = new DAChartBoardItem(board, sync.getTypeString()
                                        + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
                                        + ThreadPageLabels.THREAD_CHART_NAME_OBJ + sync.getKey()
                                        + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
@@ -428,7 +414,7 @@ public class ThreadPageSyncDataManager {
                Integer tid = Integer.valueOf(sync.getTid());
 
                if (null == parent) {
-                       item = new DAChartBoardItem(board, sync.getType()
+                       item = new DAChartBoardItem(board, sync.getTypeString()
                                        + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
                                        + ThreadPageLabels.THREAD_CHART_NAME_OBJ + sync.getKey()
                                        + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
@@ -548,7 +534,38 @@ public class ThreadPageSyncDataManager {
        public void checkUpdate() {
                chartFilteringByPid();
                
-               int size = syncEventQueue.size();
+               /* load ThreadPgeSyncData when open trace */
+               int size = rowsQueue.size();
+               if (size > 0) {
+                       ThreadPageSyncData sync;
+                       ThreadPageSyncData parent;
+                       for (int i = 0; i < size; i++) {
+                               sync = rowsQueue.get(0);
+                               if (sync.getSyncDataType() == ThreadPageSyncData.SYNC_PARENT) {
+                                       rows.add(sync);
+                                       createSyncBoardItem(null, sync);                                        
+                               } else if (sync.getSyncDataType() == ThreadPageSyncData.SYNC_CHILD) {
+                                       parent = findParentData(sync.getKey());
+                                       if (null != parent) {
+                                               parent.pushSync(sync);
+                                               createSyncBoardItem(parent, sync,
+                                                               new Comparator<DAChartBoardItem>() {
+                                                                       public int compare(DAChartBoardItem item1,
+                                                                                       DAChartBoardItem item2) {
+                                                                               return getSortObject(item1) - getSortObject(item2);
+                                                                       }
+                                               });
+                                       } else {
+                                               Logger.error("cannot find parent sync data");
+                                       }
+                               } else {
+                                       Logger.error("unknown sync data type");
+                               }
+                               rowsQueue.remove(0);
+                       }
+               }
+               
+               size = syncEventQueue.size();
                if (size > 0) {
                        ThreadPageSyncData parent;
                        ThreadPageSyncData data;
@@ -569,21 +586,30 @@ public class ThreadPageSyncDataManager {
                                                syncAttrType = getAttrTypeString(event);
                                        }
 
-                                       parent = new ThreadPageSyncData(
-                                                       getSyncTypeString(event.getType()), 
-                                                       syncVal, pid, event.getTid(), syncAttrType);
+                                       parent = new ThreadPageSyncData(event.getType(), syncVal, pid, 
+                                                       event.getTid(), syncAttrType, ThreadPageSyncData.SYNC_PARENT);
+                                       // save to DB
+                                       SyncDataInserter.pushSyncData(parent);
+                                       SyncDataInserter.startThread();
                                        rows.add(parent);
                                        createSyncBoardItem(null, parent);
                                }
                                parent.pushEvent(event);
+                               event.setSyncDataID(parent.getSyncDataID());
+                               // save to DB
+                               SyncEventInserter.pushSyncEvent(event);
+                               SyncEventInserter.startThread();
                                // child
                                data = parent.findChildData(event.getTid());
 
                                if (null == data) {
                                        String attrType = parent.getAttrType();
-                                       data = new ThreadPageSyncData(
-                                                       getSyncTypeString(event.getType()),
-                                                       syncVal, pid, event.getTid(), attrType);
+                                       data = new ThreadPageSyncData(event.getType(), syncVal, pid, 
+                                                       event.getTid(), attrType, ThreadPageSyncData.SYNC_CHILD);
+                                       data.setParentID(parent.getSyncDataID());
+                                       // save to DB
+                                       SyncDataInserter.pushSyncData(data);
+                                       SyncDataInserter.startThread();
                                        parent.pushSync(data);
                                        createSyncBoardItem(parent, data,
                                                        new Comparator<DAChartBoardItem>() {
@@ -594,7 +620,17 @@ public class ThreadPageSyncDataManager {
                                        });
                                }
                                data.pushEvent(event);
-                               syncEventQueue.remove(0);
+                               try {
+                                       ThreadPageSyncDataEvent cloneEvent = (ThreadPageSyncDataEvent) event.clone();
+                                       cloneEvent.setSyncDataID(data.getSyncDataID());
+                                       // save to DB
+                                       SyncEventInserter.pushSyncEvent(cloneEvent);
+                               } catch (CloneNotSupportedException e) {
+                                       e.printStackTrace();
+                                       continue;
+                               } finally {
+                                       syncEventQueue.remove(0);
+                               }
                        }
                }
                size = rows.size();
@@ -611,5 +647,6 @@ public class ThreadPageSyncDataManager {
                rows.clear(); // FIXME : clear chart
                syncEventQueue.clear();
                syncAttrMap.clear();
+               ThreadPageSyncData.clear(); // reset internal seq number
        }
-}
+}
\ No newline at end of file
index 34cdb67..379eea2 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -28,39 +29,70 @@ package org.tizen.dynamicanalyzer.ui.thread.thread;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;
+import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
-import org.tizen.dynamicanalyzer.swap.model.data.ThreadData;
+import org.tizen.dynamicanalyzer.common.Global;
+import org.tizen.dynamicanalyzer.ui.thread.ThreadChartManager;
 import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
 import org.tizen.dynamicanalyzer.ui.thread.ThreadPageDataEvent;
 import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
 import org.tizen.dynamicanalyzer.util.Logger;
+import org.tizen.dynamicanalyzer.utils.Formatter;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeriesItem;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
 
 public class ThreadPageThreadData extends ThreadPageData {
        private List<ThreadPageSyncData> syncs = new ArrayList<ThreadPageSyncData>();
-       private String StartTime;
-       private String EndTime;
-       private String threadFuncName;
-       private String threadClassName;
+       private long StartTime = -1;
+       private long EndTime = -1;
+       private int threadFuncID;
+       private String threadClassName = CommonConstants.EMPTY;
        private DAChartSeries loadSeries;
        private DAChartSeries eventSeries;
        private DAChartSeries apiSeries;
+       
+       public static final byte TYPE_MAIN = 0;
+       public static final byte TYPE_PTHREAD = 1;
+       public static final byte TYPE_TIZEN = 2;
+       
+       private static int internalSeq = 0;
+       private int threadDataID = -1;
 
-       public ThreadPageThreadData(String type, String pid, String tid, String attrType,
-                       String funcName) {
+       public ThreadPageThreadData(int type, String pid, String tid, String attrType,
+                       int funcID) {
                super(type, String.valueOf(tid), pid, tid, attrType);
-               this.threadFuncName = funcName;
+               this.threadFuncID = funcID;
+               threadDataID = internalSeq++;
+       }
+       
+       // using open trace
+       public ThreadPageThreadData(int id, int pid, int tid, int threadType, String attrType,
+                       long startTime, long endTime, int functionID, String className) {
+               super(threadType, String.valueOf(tid), String.valueOf(pid), String.valueOf(tid), attrType);
+               this.threadDataID = id;
+               this.threadFuncID = functionID;
+               this.StartTime = startTime;
+               this.EndTime = endTime;
+               this.threadClassName = className;
        }
 
        public void addDataEvent(ThreadPageThreadDataEvent dataEvent) {
                contentsQueue.add(dataEvent);
        }
        
+       public int getThreadFuncID() {
+               return threadFuncID;
+       }
+       
        public String getThreadFuncName() {
-               return threadFuncName;
+               if (threadFuncID == -1) {
+                       return CommonConstants.EMPTY;
+               } else {
+                       return Global.getFunctionName(threadFuncID);
+               }
        }
        
        public String getThreadClassName() {
@@ -97,7 +129,7 @@ public class ThreadPageThreadData extends ThreadPageData {
                                return ret;
                        }
 
-                       seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                        (double) (threadEvent.getThreadType() * 2.55),
                                        threadEvent.getTooltipContent());
 
@@ -111,41 +143,43 @@ public class ThreadPageThreadData extends ThreadPageData {
 
                        int eventApiType = threadEvent.getApiType();
                        if (eventApiType == LogCenterConstants.THREAD_API_TYPE_INTERNAL_START) {
-                               seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_ARROW_LEFT,
                                                threadEvent.getTooltipContent());
                                seriesItem.setBarWidth(Double.parseDouble(threadEvent
                                                .getCallerTid()));
-                               setStartTime(String.valueOf(threadEvent.getTime()));
+                               setStartTime(threadEvent.getTime());
                        } else if (eventApiType == LogCenterConstants.THREAD_API_TYPE_WAIT_END) {
-                               ThreadData data = (ThreadData) threadEvent.getContents();
-                               if (data.getApiName().equals(
-                                               ThreadPageLabels.THREAD_API_TIZEN_JOIN)) {
-                                       seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                               if (threadEvent.isJoinAPI()) {
+                                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                                        DAChartSeriesItem.SERIES_ARROW_LEFT,
                                                        ThreadPageLabels.THREAD_CHART_ITEM_JOINED);
                                        seriesItem.setBarWidth(Double.parseDouble(threadEvent
                                                        .getCallerTid()));
                                } else {
-                                       seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                                        DAChartSeriesItem.SERIES_ARROW_NONE,
                                                        threadEvent.getTooltipContent());
                                }
                        } else if (eventApiType == LogCenterConstants.THREAD_API_TYPE_INTERNAL_STOP) {
                                if (null != threadEvent.getCallerTid()) {
-                                       seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                                        DAChartSeriesItem.SERIES_ARROW_RIGHT,
                                                        threadEvent.getTooltipContent());
                                        seriesItem.setBarWidth(Double.parseDouble(threadEvent
                                                        .getCallerTid()));
                                } else {
-                                       seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                                       seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                                        DAChartSeriesItem.SERIES_ARROW_NONE,
                                                        threadEvent.getTooltipContent());
                                }
-                               setEndTime(String.valueOf(threadEvent.getTime()));
+                               setEndTime(threadEvent.getTime());
+                               // save ThreadData when endtime is set
+                               if (AnalyzerManager.isRunning()) {
+                                       ThreadChartManager.getInstance().saveThreadPageThreadData(this);
+                               }
                        } else {
-                               seriesItem = new DAChartSeriesItem(threadEvent.getTime(),
+                               seriesItem = new DAChartSeriesItem(threadEvent.getDoubleTime(),
                                                DAChartSeriesItem.SERIES_ARROW_NONE,
                                                threadEvent.getTooltipContent());
                        }
@@ -204,7 +238,7 @@ public class ThreadPageThreadData extends ThreadPageData {
                }
        }
 
-       protected void pushSync(ThreadPageSyncData sync) {
+       public void pushSync(ThreadPageSyncData sync) {
                syncs.add(sync);
                hasUpdate = true;
        }
@@ -221,19 +255,59 @@ public class ThreadPageThreadData extends ThreadPageData {
                return null;
        }
 
-       public String getStartTime() {
+       public String getTypeString() {
+               switch (getType()) {
+               case TYPE_MAIN:
+                       return ThreadPageLabels.THREAD_ITEM_TYPE_MAIN;
+               case TYPE_PTHREAD:
+                       return ThreadPageLabels.THREAD_ITEM_TYPE_PTHREAD;
+               case TYPE_TIZEN:
+                       return ThreadPageLabels.THREAD_ITEM_TYPE_TIZEN;
+               default:
+                       Logger.error("unknown thread type!!");
+                       return CommonConstants.EMPTY;
+               }
+       }
+       
+       public long getStartTime() {
                return StartTime;
        }
 
-       public void setStartTime(String startTime) {
+       public void setStartTime(long startTime) {
                StartTime = startTime;
        }
+       
+       public String getStartTimeString() { // to show in details view
+               if (StartTime == -1) {
+                       return null;
+               } else {
+                       double startTime = Formatter.longTimeToDoubleTime(StartTime); 
+                       return String.valueOf(startTime);
+               }
+       }
 
-       public String getEndTime() {
+       public long getEndTime() {
                return EndTime;
        }
 
-       public void setEndTime(String endTime) {
+       public void setEndTime(long endTime) {
                EndTime = endTime;
        }
-}
+       
+       public String getEndTimeString() { // to show in details view
+               if (EndTime == -1) {
+                       return null;
+               } else {
+                       double endTime = Formatter.longTimeToDoubleTime(EndTime); 
+                       return String.valueOf(endTime);
+               }
+       }
+       
+       public int getThreadDataID() {
+               return threadDataID;
+       }
+       
+       public static void clear() {
+               internalSeq = 0;
+       }       
+}
\ No newline at end of file
index 953e46a..22534f8 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact: 
+ * WooJin Jung <woojin2.jung@samsung.com>
  * yeongtaik byeon <yeongtaik.byeon@samsung.com>
  * Juyoung Kim <j0.kim@samsung.com>
  *
@@ -38,9 +39,11 @@ public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
        private DAChartSeriesItem chartItem;
        private String callID = null;
        private String callerTid = null;
+       private int threadDataID = -1;
+       private boolean isJoinAPI = false;
 
        public ThreadPageThreadDataEvent(int eventType, int threadType,
-                       int apiType, double time, String tid, String tooltip,
+                       int apiType, long time, String tid, String tooltip,
                        long errorNum, LogData contents) {
                super(time, tid, apiType, tooltip, errorNum, contents);
                setEventType(eventType);
@@ -86,4 +89,21 @@ public class ThreadPageThreadDataEvent extends ThreadPageDataEvent {
        public void setCallerTid(String callerTid) {
                this.callerTid = callerTid;
        }
-}
+       
+       public int getThreadDataID() {
+               return threadDataID;
+       }
+       
+       public void setThreadDataID(int id) {
+               this.threadDataID = id;
+       }
+       
+       public boolean isJoinAPI() {
+               return isJoinAPI;
+       }
+       
+       public void setJoinAPI(boolean isJoinAPI) {
+               this.isJoinAPI = isJoinAPI;
+       }
+       
+}
\ No newline at end of file
index b3feb15..54b4141 100644 (file)
 package org.tizen.dynamicanalyzer.ui.thread.thread;
 
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Comparator;
 
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
-import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.common.SymbolManager;
 import org.tizen.dynamicanalyzer.constant.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
+import org.tizen.dynamicanalyzer.common.Global;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
@@ -59,10 +59,13 @@ import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
 import org.tizen.dynamicanalyzer.ui.summary.SummaryDataManager;
 import org.tizen.dynamicanalyzer.ui.summary.warning.WarningCase;
 import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncAPIInserter;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncDataInserter;
+import org.tizen.dynamicanalyzer.ui.thread.data.SyncEventInserter;
+import org.tizen.dynamicanalyzer.ui.thread.data.ThreadEventInserter;
 import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncData;
 import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataEvent;
 import org.tizen.dynamicanalyzer.ui.thread.sync.ThreadPageSyncDataManager;
-import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.util.Logger;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
@@ -86,6 +89,9 @@ public class ThreadPageThreadDataManager {
        private List<ThreadPageSyncDataEvent> syncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
        private List<ThreadPageThreadDataEvent> eventQueue = new ArrayList<ThreadPageThreadDataEvent>();
        private List<ThreadPageThreadDataEvent> callEventQueue = new ArrayList<ThreadPageThreadDataEvent>();
+       // load from database
+       private List<ThreadPageSyncData> syncQueue = new ArrayList<ThreadPageSyncData>();       
+
        private HashMap<String, Integer> threadAttrMap = new HashMap<String, Integer>();
        private HashMap<String, Integer> syncAttrMap = new HashMap<String, Integer>();
        // threadFuncMap : (pthreadId, function address)
@@ -98,8 +104,12 @@ public class ThreadPageThreadDataManager {
        public ThreadPageThreadDataManager(DAChartBoard board) {
                this.setBoard(board);
        }
+       
+       public List<ThreadPageThreadData> getRows() {
+               return rows;
+       }
 
-       private void pushRow(ThreadPageThreadData data) {
+       public void pushRow(ThreadPageThreadData data) {
                rowsQueue.add(data);
                hasUpdate = true;
        }
@@ -121,12 +131,16 @@ public class ThreadPageThreadDataManager {
                syncEventQueue.add(syncEvent);
                hasUpdate = true;
        }
+       
+       public void pushSyncData(ThreadPageSyncData syncData) {
+               syncQueue.add(syncData);
+       }       
 
        private void createBoardItem(ThreadPageThreadData data) {
                // DACustomChartBoardItem item = new DACustomChartBoardItem(board,
                // data.getName());
 
-               DAChartBoardItem item = new DAChartBoardItem(board, data.getType()
+               DAChartBoardItem item = new DAChartBoardItem(board, data.getTypeString()
                                + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
                                + ThreadPageLabels.THREAD_CHART_NAME_PID + data.getPid()
                                + ThreadPageLabels.THREAD_CHART_NAME_COMMA
@@ -151,7 +165,7 @@ public class ThreadPageThreadDataManager {
                // data.getName());
                Integer tid = Integer.valueOf(data.getTid());
 
-               DAChartBoardItem item = new DAChartBoardItem(board, data.getType()
+               DAChartBoardItem item = new DAChartBoardItem(board, data.getTypeString()
                                + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
                                + ThreadPageLabels.THREAD_CHART_NAME_PID + data.getPid()
                                + ThreadPageLabels.THREAD_CHART_NAME_COMMA
@@ -242,7 +256,7 @@ public class ThreadPageThreadDataManager {
                        return false;
                }
 
-               DAChartBoardItem item = new DAChartBoardItem(parent, sync.getType()
+               DAChartBoardItem item = new DAChartBoardItem(parent, sync.getTypeString()
                                + ThreadPageLabels.THREAD_CHART_NAME_PREFIX
                                + ThreadPageLabels.THREAD_CHART_NAME_OBJ + sync.getKey()
                                + ThreadPageLabels.THREAD_CHART_NAME_POSTFIX);
@@ -340,9 +354,10 @@ public class ThreadPageThreadDataManager {
        }
 
        public void createMainThreadItem(int tid) {
+               int funcID = Global.getFunctionID("main");
                ThreadPageThreadData mainData = new ThreadPageThreadData(
-                               ThreadPageLabels.THREAD_ITEM_TYPE_MAIN, String.valueOf(tid),
-                               String.valueOf(tid), CommonConstants.EMPTY, "main");
+                               ThreadPageThreadData.TYPE_MAIN, String.valueOf(tid),
+                               String.valueOf(tid), CommonConstants.EMPTY, funcID);
                pushRow(mainData);
        }
                
@@ -386,7 +401,7 @@ public class ThreadPageThreadDataManager {
                        loads = processDataList[i].getThreadLoad();
                        String[] temp = loads.split(",");
                        int tempSize = temp.length;
-                       double time;
+                       long time;
                        for (int j = 0; j + 1 < tempSize; j += 2) {
                                try {
                                        tid = temp[j];
@@ -398,8 +413,7 @@ public class ThreadPageThreadDataManager {
                                // continue;
                                // }
                                load = (int) (Double.parseDouble(temp[j + 1]));
-                               time = Double.parseDouble(Long.toString(input.getTime()))
-                                               / TimelineConstants.MEGA_DOUBLE;
+                               time = input.getTime();
                                ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
                                                ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time, tid,
                                                String.valueOf(load)
@@ -410,7 +424,6 @@ public class ThreadPageThreadDataManager {
                        }
                }
                hasUpdate = true;               
-
 //             loads = sysLog.getThreadLoad(); // TODO SystemData interface changed.
 //             // loads = input.get(LogCenterConstants.DEVICE_THREAD_LOAD_INDEX);
 //             String[] temp = loads.split(",");
@@ -460,7 +473,7 @@ public class ThreadPageThreadDataManager {
                                loads = processDataList[j].getThreadLoad();
                                String[] temp = loads.split(",");
                                int tempSize = temp.length;
-                               double time;
+                               long time;
                                for (int k = 0; k + 1 < tempSize; k += 2) {
                                        try {
                                                tid = temp[k];
@@ -472,8 +485,7 @@ public class ThreadPageThreadDataManager {
                                        // continue;
                                        // }
                                        load = (int) (Double.parseDouble(temp[k + 1]));
-                                       time = Double.parseDouble(Long.toString(input.getTime()))
-                                                       / TimelineConstants.MEGA_DOUBLE;
+                                       time = input.getTime();
                                        ThreadPageThreadDataEvent event = new ThreadPageThreadDataEvent(
                                                        ThreadPageThreadDataEvent.TYPE_LOAD, load, -1, time, tid,
                                                        String.valueOf(load)
@@ -483,7 +495,6 @@ public class ThreadPageThreadDataManager {
                
                                }
                        }                       
-
 //                     loads = input.getThreadLoad();  // TODO SystemData interface changed.
 //                     String[] temp = loads.split(",");
 //                     int tempSize = temp.length;
@@ -513,8 +524,7 @@ public class ThreadPageThreadDataManager {
        }
 
        private void parsePthread(ThreadData input) {
-               double time = Double.parseDouble(Long.toString(input.getTime()))
-                               / TimelineConstants.MEGA_DOUBLE;
+               long time = input.getTime();
                String pid = Integer.toString(input.getPid());
                String tid = Integer.toString(input.getTid());
                int apiType = input.getApiType();
@@ -522,6 +532,10 @@ public class ThreadPageThreadDataManager {
                long errorNum = input.getErrno();
                ThreadPageThreadDataEvent event;
                String pthreadId = Long.toString(input.getPThreadId());
+               
+               if (errorNum != 0) {
+                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(input);
+               }
 
                switch (apiType) {
                case LogCenterConstants.THREAD_API_TYPE_NEW:
@@ -595,21 +609,20 @@ public class ThreadPageThreadDataManager {
                case LogCenterConstants.THREAD_API_TYPE_INTERNAL_START:
                        Integer threadAttrTypeInt = threadAttrMap.get(pthreadId);
                        String threadAttrType;
-                       String funcName;
+                       int funcID;
                        
                        if (null != threadAttrTypeInt) {
                                threadAttrType = getAttrTypeByTypeInt(threadAttrTypeInt);
                        } else {
                                threadAttrType = ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
                        }
-                       // get thread function name for this pthread
-                       funcName = Global.getFunctionName(SymbolManager
-                                       .getFuncId(null, threadFuncMap.get(pthreadId),
-                                       input.getPid(), input.getTime()));
+                       // get thread function id for this pthread
+                       funcID = SymbolManager.getFuncId(null, threadFuncMap.get(pthreadId),
+                                       input.getPid(), input.getTime());
                        
                        ThreadPageThreadData data = new ThreadPageThreadData(
-                                       ThreadPageLabels.THREAD_ITEM_TYPE_PTHREAD, pid, tid,
-                                       threadAttrType, funcName);
+                                       ThreadPageThreadData.TYPE_PTHREAD, pid, tid,
+                                       threadAttrType, funcID);
                        pushRow(data);
                        event = new ThreadPageThreadDataEvent(
                                        ThreadPageThreadDataEvent.TYPE_EVENT,
@@ -623,8 +636,7 @@ public class ThreadPageThreadDataManager {
        }
 
        private void parseTIZEN(ThreadData input) {
-               double time = Double.parseDouble(Long.toString(input.getTime()))
-                               / TimelineConstants.MEGA_DOUBLE;
+               long time = input.getTime();
                String pid = Integer.toString(input.getPid());          
                String tid = Integer.toString(input.getTid());
                int apiType = input.getApiType();
@@ -634,6 +646,11 @@ public class ThreadPageThreadDataManager {
                ThreadPageThreadData data;
                ThreadPageThreadDataEvent event;
                long errorNum = input.getErrno();
+               
+               if (errorNum != 0) {
+                       SummaryDataManager.getInstance().getFailedApiDataMaker().makeData(input);
+               }
+               
                switch (apiType) {
                case LogCenterConstants.THREAD_API_TYPE_NEW:
                case LogCenterConstants.THREAD_API_TYPE_STOP:
@@ -700,8 +717,8 @@ public class ThreadPageThreadDataManager {
                        break;
                case LogCenterConstants.THREAD_API_TYPE_INTERNAL_START:
                        data = new ThreadPageThreadData(
-                                       ThreadPageLabels.THREAD_ITEM_TYPE_TIZEN, pid, tid,
-                                       ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE, CommonConstants.EMPTY);
+                                       ThreadPageThreadData.TYPE_TIZEN, pid, tid,
+                                       ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE, -1);
                        // TIZEN thread includes the internal thread
                        if ((className = checkCalledThread(callID)) != null) {
                                        data.setThreadClassName(className);
@@ -777,8 +794,7 @@ public class ThreadPageThreadDataManager {
                        return;
                }
                SyncData syncData = (SyncData) input;
-               double time = Double.parseDouble(Long.toString(input.getTime()))
-                               / TimelineConstants.MEGA_DOUBLE;
+               long time = input.getTime();
                String tid = Integer.toString(syncData.getTid());
 
                // FIXME
@@ -841,8 +857,7 @@ public class ThreadPageThreadDataManager {
                SyncData input;
                for (int i = 0; i < size; i++) {
                        input = (SyncData) inputs.get(i);
-                       double time = Double.parseDouble(Long.toString(input.getTime()))
-                                       / TimelineConstants.MEGA_DOUBLE;
+                       long time = input.getTime();
                        String tid = Integer.toString(input.getTid());
 
                        // FIXME
@@ -1190,29 +1205,6 @@ public class ThreadPageThreadDataManager {
                return null;
        }
 
-       private String getSyncTypeString(int syncType) {
-               switch (syncType) {
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MUTEX:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MUTEX;
-               case LogCenterConstants.SYNC_TYPE_TIZEN_MONITOR:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_MONITOR;
-               case LogCenterConstants.SYNC_TYPE_TIZEN_SEMAPHORE:
-                       return ThreadPageLabels.SYNC_TYPE_TIZEN_SEMAPHORE;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_MUTEX:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_MUTEX;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_COND_VARIABLE;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_RWLOCK:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_RWLOCK;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_SPINLOCK:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_SPINLOCK;
-               case LogCenterConstants.SYNC_TYPE_PTHREAD_BARRIER:
-                       return ThreadPageLabels.SYNC_TYPE_PTHREAD_BARRIER;
-               default:
-                       return CommonConstants.EMPTY;
-               }
-       }
-
        private void chartFilteringByPid() {
                if(null == board || null == board.getItemList()){
                        return;
@@ -1344,6 +1336,10 @@ public class ThreadPageThreadDataManager {
                                        data = findParentData(event.getTid());
                                        if (null != data) {
                                                data.pushEvent(event);
+                                               event.setThreadDataID(data.getThreadDataID());
+                                               // save to DB
+                                               ThreadEventInserter.pushThreadEvent(event);
+                                               ThreadEventInserter.startThread();
                                                eventQueue.remove(remainCalleeEventCount);
                                        } else {
                                                remainCalleeEventCount++;
@@ -1351,7 +1347,24 @@ public class ThreadPageThreadDataManager {
                                }
                        }
                }
-
+               
+               /* load ThreadPageSyncData when open trace */
+               size = syncQueue.size();
+               if (size > 0) {
+                       ThreadPageThreadData data;
+                       ThreadPageSyncData sync;
+                       for (int i = 0; i < size; i++) {
+                               sync = syncQueue.get(0);
+                               data = findParentData(sync.getTid());
+                               if (null != data) {
+                                       createSyncBoardItem(data, sync);
+                                       data.pushSync(sync);                                    
+                                       data.setHasUpdate();
+                               }
+                               syncQueue.remove(0);
+                       }                       
+               }
+               
                size = syncEventQueue.size();
                if (size > 0) {
                        ThreadPageThreadData data;
@@ -1375,14 +1388,25 @@ public class ThreadPageThreadDataManager {
                                                                        .getAttrTypeString(event);
                                                }
 
-                                               sync = new ThreadPageSyncData(
-                                                               getSyncTypeString(event.getType()),
-                                                               syncVal, pid, event.getTid(),
-                                                               syncAttrType);
+                                               sync = new ThreadPageSyncData(event.getType(), syncVal, pid, 
+                                                               event.getTid(), syncAttrType, ThreadPageSyncData.THREAD_CHILD);
+                                               sync.setParentID(data.getThreadDataID());
+                                               // save to DB
+                                               SyncDataInserter.pushSyncData(sync);
+                                               SyncDataInserter.startThread();                                         
                                                createSyncBoardItem(data, sync);
                                                data.pushSync(sync);
                                        }
                                        sync.pushEvent(event);
+                                       event.setSyncDataID(sync.getSyncDataID());
+                                       // save to DB
+                                       SyncEventInserter.pushSyncEvent(event);
+                                       SyncEventInserter.startThread();
+                                       // save syncAPI to DB
+                                       if (ThreadPageSyncData.isSyncApi(event.getApiType())) {
+                                               SyncAPIInserter.pushSyncEvent((SyncData) event.getContents());
+                                               SyncAPIInserter.startThread();
+                                       }
                                        data.setHasUpdate();
                                }
                                syncEventQueue.remove(0);
@@ -1414,9 +1438,12 @@ public class ThreadPageThreadDataManager {
                rowsQueue.clear();
                eventQueue.clear();
                callEventQueue.clear();
+               threadAttrMap.clear();
                syncAttrMap.clear();
                callRowsQueue.clear();
                syncEventQueue.clear();
+               threadFuncMap.clear();
                hasUpdate = false;
+               ThreadPageThreadData.clear(); // reset internal seq number
        }
-}
+}
\ No newline at end of file
index 05a24c8..92b9873 100644 (file)
@@ -91,7 +91,7 @@ public class FunctionEntryDBTable extends DBTable {
                addColumn(new DBColumn(COLUMN.CALLERPCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.PCADDR.name, DBConstants.NOT_NULL, DBConstants.DBTYPE_LONG));
                addColumn(new DBColumn(COLUMN.ARGUMENT.name, DBConstants.EMPTY, 
-                               DBConstants.VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
+                               DBConstants.DBTYPE_VARCHAR, DALimit.FUNCTION_ARGUMENTS_VALUE_LENGTH));
                setIndexColumn(COLUMN.STARTTIME.index);
        }
 
index 3fb4308..b36f607 100644 (file)
@@ -471,7 +471,7 @@ public class Formatter {
                return value;
        }
        
-       public static double toLongTimeForDoubleTime(long time) {
+       public static double longTimeToDoubleTime(long time) {
                return time / TimelineConstants.MEGA_DOUBLE;
        }