update copyright
[fedora-idea.git] / java / java-impl / src / com / intellij / unscramble / ThreadState.java
blobc7242ec75d59f314da6cd862e6ef046bdb8c7e13
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.unscramble;
18 import org.jetbrains.annotations.NonNls;
19 import org.jetbrains.annotations.Nullable;
21 import java.util.Collection;
22 import java.util.Collections;
23 import java.util.HashSet;
24 import java.util.Set;
26 /**
27 * @author yole
29 public class ThreadState {
30 private final String myName;
31 private final String myState;
32 private String myStackTrace;
33 private boolean myEmptyStackTrace;
34 private String myJavaThreadState;
35 private String myThreadStateDetail;
36 private String myExtraState;
37 private final Set<ThreadState> myThreadsWaitingForMyLock = new HashSet<ThreadState>();
38 private final Set<ThreadState> myDeadlockedThreads = new HashSet<ThreadState>();
40 @Nullable
41 private ThreadOperation myOperation;
43 public ThreadState(final String name, final String state) {
44 myName = name;
45 myState = state.trim();
48 public String getName() {
49 return myName;
52 public String getState() {
53 return myState;
56 public String getStackTrace() {
57 return myStackTrace;
60 public void setStackTrace(final String stackTrace, boolean isEmpty) {
61 myStackTrace = stackTrace;
62 myEmptyStackTrace = isEmpty;
65 public Collection<ThreadState> getAwaitingThreads() {
66 return Collections.unmodifiableSet(myThreadsWaitingForMyLock);
69 public String toString() {
70 return myName;
73 public void setJavaThreadState(final String javaThreadState) {
74 myJavaThreadState = javaThreadState;
77 public void setThreadStateDetail(@NonNls final String threadStateDetail) {
78 myThreadStateDetail = threadStateDetail;
81 public String getJavaThreadState() {
82 return myJavaThreadState;
85 public String getThreadStateDetail() {
86 if (myOperation != null) {
87 return myOperation.toString();
89 return myThreadStateDetail;
92 public boolean isEmptyStackTrace() {
93 return myEmptyStackTrace;
96 public String getExtraState() {
97 return myExtraState;
100 public void setExtraState(final String extraState) {
101 myExtraState = extraState;
104 public boolean isSleeping() {
105 return "sleeping".equals(getThreadStateDetail()) ||
106 (("parking".equals(getThreadStateDetail()) || "waiting on condition".equals(myState)) && isThreadPoolExecutor());
109 private boolean isThreadPoolExecutor() {
110 return myStackTrace.contains("java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take") ||
111 myStackTrace.contains("java.util.concurrent.ThreadPoolExecutor.getTask");
114 public boolean isAwaitedBy(ThreadState thread) {
115 return myThreadsWaitingForMyLock.contains(thread);
118 public void addWaitingThread(ThreadState thread) {
119 myThreadsWaitingForMyLock.add(thread);
122 public boolean isDeadlocked() {
123 return !myDeadlockedThreads.isEmpty();
126 public void addDeadlockedThread(ThreadState thread) {
127 myDeadlockedThreads.add(thread);
130 @Nullable
131 public ThreadOperation getOperation() {
132 return myOperation;
135 public void setOperation(@Nullable final ThreadOperation operation) {
136 myOperation = operation;
139 public boolean isWaiting() {
140 return "on object monitor".equals(myThreadStateDetail) ||
141 myState.startsWith("waiting") ||
142 ("parking".equals(myThreadStateDetail) && !isSleeping());
145 public boolean isEDT() {
146 final String name = getName();
147 return isEDT(name);
150 public static boolean isEDT(String name) {
151 return name.startsWith("AWT-EventQueue");