[Title] handle thread with PTHREAD_CREATE_DETACHED attribute
authorwoojin <woojin2.jung@samsung.com>
Mon, 27 Jan 2014 10:50:16 +0000 (19:50 +0900)
committerwoojin <woojin2.jung@samsung.com>
Mon, 27 Jan 2014 10:50:16 +0000 (19:50 +0900)
[Desc.] 1. show DETACHED attribute thread correctly in thread details view 2. fix buggy logic of sync attribute
[Issue]

org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.properties
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java

index 8a3f6b7..0b9a376 100644 (file)
@@ -60,6 +60,9 @@ public class ThreadPageLabels extends NLS {
 
        public static String THREAD_API_TIZEN_JOIN;
        public static String THREAD_API_PTHREAD_JOIN;
+       public static String THREAD_API_PTHREAD_CREATE;
+       public static String THREAD_API_PTHREAD_ATTR_INIT;
+       public static String THREAD_API_PTHREAD_ATTR_SETDETACHSTATE;
        public static String SYNC_API_PTHREAD_MUTEX_INIT;
        public static String SYNC_API_PTHREAD_MUTEXATTR_INIT;
        public static String SYNC_API_PTHREAD_MUTEXATTR_SETTYPE;
index e8935f4..40960ee 100644 (file)
@@ -28,6 +28,9 @@ SYNC_ATTR_TYPE_DEFAULT=PTHREAD_MUTEX_DEFAULT
 
 THREAD_API_TIZEN_JOIN=Thread::Join
 THREAD_API_PTHREAD_JOIN=pthread_join
+THREAD_API_PTHREAD_CREATE=pthread_create
+THREAD_API_PTHREAD_ATTR_INIT=pthread_attr_init
+THREAD_API_PTHREAD_ATTR_SETDETACHSTATE=pthread_attr_setdetachstate
 SYNC_API_PTHREAD_MUTEX_INIT=pthread_mutex_init
 SYNC_API_PTHREAD_MUTEXATTR_INIT=pthread_mutexattr_init
 SYNC_API_PTHREAD_MUTEXATTR_SETTYPE=pthread_mutexattr_settype
index 499f141..80b3501 100644 (file)
@@ -157,7 +157,7 @@ public class ThreadPageSyncDataManager {
                case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
                        if (apiName
                                        .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                               syncAttrMap.put(syncData.getArgs(), -1);
+                               syncAttrMap.put(syncData.getArgs(), PTHREAD_MUTEX_NORMAL);
                        } else if (apiName
                                        .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
                                checkMutexAttrType(syncData.getArgs());
@@ -222,7 +222,7 @@ public class ThreadPageSyncDataManager {
                        case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
                                if (apiName
                                                .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                                       syncAttrMap.put(input.getArgs(), -1);
+                                       syncAttrMap.put(input.getArgs(), PTHREAD_MUTEX_NORMAL);
                                } else if (apiName
                                                .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
                                        checkMutexAttrType(input.getArgs());
@@ -259,7 +259,7 @@ public class ThreadPageSyncDataManager {
                String obj = temp[0];
                String type = temp[1].trim();
 
-               if (syncAttrMap.get(obj) == -1) {
+               if (null != syncAttrMap.get(obj)) {
                        syncAttrMap.put(obj, Integer.valueOf(type));
                }
        }
@@ -270,12 +270,11 @@ public class ThreadPageSyncDataManager {
                        return;
                }
                String obj = temp[0];
-               String attrObj = temp[1];
+               String attrObj = temp[1].trim();
 
                Integer attrType = syncAttrMap.get(attrObj);
                if (attrType != null) {
                        syncAttrMap.put(obj, attrType);
-                       syncAttrMap.remove(attrObj);
                }
        }
 
index 2f132c0..a4b4ac0 100644 (file)
@@ -34,7 +34,6 @@ import org.tizen.dynamicanalyzer.common.CommonConstants;
 import org.tizen.dynamicanalyzer.logparser.LogCenterConstants;
 import org.tizen.dynamicanalyzer.nl.ThreadPageLabels;
 import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
-import org.tizen.dynamicanalyzer.project.Project;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
@@ -52,7 +51,6 @@ 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.file.FileChartData;
 import org.tizen.dynamicanalyzer.ui.summary.warning.WarningCase;
 import org.tizen.dynamicanalyzer.ui.summary.warning.WarningData;
 import org.tizen.dynamicanalyzer.ui.thread.ThreadPageData;
@@ -82,8 +80,12 @@ public class ThreadPageThreadDataManager {
        private List<ThreadPageSyncDataEvent> syncEventQueue = new ArrayList<ThreadPageSyncDataEvent>();
        private List<ThreadPageThreadDataEvent> eventQueue = new ArrayList<ThreadPageThreadDataEvent>();
        private List<ThreadPageThreadDataEvent> callEventQueue = new ArrayList<ThreadPageThreadDataEvent>();
+       private HashMap<String, Integer> threadAttrMap = new HashMap<String, Integer>();
        private HashMap<String, Integer> syncAttrMap = new HashMap<String, Integer>();
        private int preSelectionPid = -1;
+       
+       public static final int PTHREAD_CREATE_JOINABLE = 0;
+       public static final int PTHREAD_CREATE_DETACHED = 1;
 
        public ThreadPageThreadDataManager(DAChartBoard board) {
                this.setBoard(board);
@@ -311,6 +313,16 @@ public class ThreadPageThreadDataManager {
                pushRow(mainData);
        }
                
+       public static String getAttrTypeByTypeInt(int typeInt) {
+               if (typeInt == PTHREAD_CREATE_JOINABLE) {
+                       return ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
+               } else if (typeInt == PTHREAD_CREATE_DETACHED) {
+                       return ThreadPageLabels.THREAD_ATTR_TYPE_DETACHED;
+               } else {
+                       return CommonConstants.EMPTY;
+               }
+       }
+
        public List<LogData> getLogsFromLogPackage(LogPackage logPack,
                        int logCenterConstants) {
                Logs logs = logPack.getLogs(logCenterConstants);
@@ -415,6 +427,7 @@ public class ThreadPageThreadDataManager {
                String apiName = input.getApiName();
                long errorNum = input.getErrno();
                ThreadPageThreadDataEvent event;
+               String pthreadId = Long.toString(input.getPThreadId());
 
                switch (apiType) {
                case LogCenterConstants.THREAD_API_TYPE_NEW:
@@ -422,6 +435,14 @@ public class ThreadPageThreadDataManager {
                case LogCenterConstants.THREAD_API_TYPE_EXIT:
                case LogCenterConstants.THREAD_API_TYPE_WAIT_START:
                case LogCenterConstants.THREAD_API_TYPE_OTHER:
+                       if (apiName.equals(ThreadPageLabels
+                                       .THREAD_API_PTHREAD_ATTR_INIT)) {
+                               threadAttrMap.put(input.getArgs(), PTHREAD_CREATE_JOINABLE);
+                       } else if (apiName.equals(ThreadPageLabels
+                                       .THREAD_API_PTHREAD_ATTR_SETDETACHSTATE)) {
+                               checkThreadAttrType(input.getArgs());
+                       } 
+                       
                        event = new ThreadPageThreadDataEvent(
                                        ThreadPageThreadDataEvent.TYPE_API,
                                        LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid,
@@ -429,11 +450,14 @@ public class ThreadPageThreadDataManager {
                        pushEvent(event);
                        break;
                case LogCenterConstants.THREAD_API_TYPE_START:
+                       if (apiName.equals(ThreadPageLabels.THREAD_API_PTHREAD_CREATE)) {
+                               checkThreadType(input.getArgs(), pthreadId);
+                       }
                        event = new ThreadPageThreadDataEvent(
                                        ThreadPageThreadDataEvent.TYPE_API,
                                        LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid,
                                        apiName, errorNum, input);
-                       event.setCallID(Long.toString(input.getPThreadId()));
+                       event.setCallID(pthreadId);
 
                        pushEvent(event);
                        pushCallEvent(event);
@@ -459,7 +483,7 @@ public class ThreadPageThreadDataManager {
                                        ThreadPageThreadDataEvent.TYPE_EVENT,
                                        LogCenterConstants.THREAD_TYPE_PTHREAD, apiType, time, tid,
                                        ThreadPageLabels.THREAD_CHART_ITEM_EXITED, errorNum, input);
-                       event.setCallID(Long.toString(input.getPThreadId()));
+                       event.setCallID(pthreadId);
                        pushEvent(event);
                        pushCallEvent(event);
                        if (true == isJoinableThread(tid)) {
@@ -471,9 +495,18 @@ public class ThreadPageThreadDataManager {
                        }
                        break;
                case LogCenterConstants.THREAD_API_TYPE_INTERNAL_START:
+                       Integer threadAttrTypeInt = threadAttrMap.get(pthreadId);
+                       String threadAttrType;
+                       
+                       if (null != threadAttrTypeInt) {
+                               threadAttrType = getAttrTypeByTypeInt(threadAttrTypeInt);
+                       } else {
+                               threadAttrType = ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE;
+                       }
+                       
                        ThreadPageThreadData data = new ThreadPageThreadData(
                                        ThreadPageLabels.THREAD_ITEM_TYPE_PTHREAD, pid, tid,
-                                       ThreadPageLabels.THREAD_ATTR_TYPE_JOINABLE);
+                                       threadAttrType);
                        pushRow(data);
                        event = new ThreadPageThreadDataEvent(
                                        ThreadPageThreadDataEvent.TYPE_EVENT,
@@ -661,7 +694,8 @@ public class ThreadPageThreadDataManager {
                case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
                        if (apiName
                                        .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                               syncAttrMap.put(syncData.getArgs(), -1);
+                               syncAttrMap.put(syncData.getArgs(),
+                                               ThreadPageSyncDataManager.PTHREAD_MUTEX_NORMAL);
                        } else if (apiName
                                        .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
                                checkMutexAttrType(syncData.getArgs());
@@ -724,7 +758,8 @@ public class ThreadPageThreadDataManager {
                        case LogCenterConstants.SYNC_TYPE_PTHREAD_COND_VARIABLE:
                                if (apiName
                                                .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_INIT)) {
-                                       syncAttrMap.put(input.getArgs(), -1);
+                                       syncAttrMap.put(input.getArgs(),
+                                                       ThreadPageSyncDataManager.PTHREAD_MUTEX_NORMAL);
                                } else if (apiName
                                                .equals(ThreadPageLabels.SYNC_API_PTHREAD_MUTEXATTR_SETTYPE)) {
                                        checkMutexAttrType(input.getArgs());
@@ -838,16 +873,42 @@ public class ThreadPageThreadDataManager {
                return ret;
        }
 
+       private void checkThreadAttrType(String input) {
+               String[] temp = input.split(",");
+               if (temp.length != 2) {
+                       return;
+               }
+               String obj = temp[0];
+               String type = temp[1].trim();
+
+               if (null != threadAttrMap.get(obj)) {
+                       threadAttrMap.put(obj, Integer.valueOf(type));
+               }
+       }
+
+       private void checkThreadType(String args, String pthreadId) {
+               String[] temp = args.split(",");
+               if (temp.length != 4) {
+                       return;
+               }
+               String attrObj = temp[1].trim();
+
+               Integer attrType = threadAttrMap.get(attrObj);
+               if (attrType != null) {
+                       threadAttrMap.put(pthreadId, attrType);
+               }
+       }
+       
        private void checkMutexAttrType(String input) {
                String[] temp = input.split(",");
                if (temp.length != 2) {
                        return;
                }
                String obj = temp[0];
-               String type = temp[1];
+               String type = temp[1].trim();
 
-               if (syncAttrMap.get(obj) == -1) {
-                       syncAttrMap.put(obj, Integer.valueOf(type.trim()));
+               if (null != syncAttrMap.get(obj)) {
+                       syncAttrMap.put(obj, Integer.valueOf(type));
                }
        }
 
@@ -857,12 +918,11 @@ public class ThreadPageThreadDataManager {
                        return;
                }
                String obj = temp[0];
-               String attrObj = temp[1];
+               String attrObj = temp[1].trim();
 
                Integer attrType = syncAttrMap.get(attrObj);
                if (attrType != null) {
                        syncAttrMap.put(obj, attrType);
-                       syncAttrMap.remove(attrObj);
                }
        }