From fe6c3bf3a3f0dd07cba50eb9b20b0af9be8f167e Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 27 Jan 2014 19:50:16 +0900 Subject: [PATCH] [Title] handle thread with PTHREAD_CREATE_DETACHED attribute [Desc.] 1. show DETACHED attribute thread correctly in thread details view 2. fix buggy logic of sync attribute [Issue] --- .../tizen/dynamicanalyzer/nl/ThreadPageLabels.java | 3 + .../dynamicanalyzer/nl/ThreadPageLabels.properties | 3 + .../ui/thread/sync/ThreadPageSyncDataManager.java | 9 ++- .../thread/thread/ThreadPageThreadDataManager.java | 84 ++++++++++++++++++---- 4 files changed, 82 insertions(+), 17 deletions(-) diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.java index 8a3f6b7..0b9a376 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.java @@ -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; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.properties b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.properties index e8935f4..40960ee 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.properties +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/ThreadPageLabels.properties @@ -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 diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java index 499f141..80b3501 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/sync/ThreadPageSyncDataManager.java @@ -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); } } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java index 2f132c0..a4b4ac0 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/thread/ThreadPageThreadDataManager.java @@ -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 syncEventQueue = new ArrayList(); private List eventQueue = new ArrayList(); private List callEventQueue = new ArrayList(); + private HashMap threadAttrMap = new HashMap(); private HashMap syncAttrMap = new HashMap(); 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 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); } } -- 2.7.4