001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: * The Original Software is NetBeans. The Initial Developer of the Original
026: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
027: * Microsystems, Inc. All Rights Reserved.
028: *
029: * If you wish your version of this file to be governed by only the CDDL
030: * or only the GPL Version 2, indicate your decision by adding
031: * "[Contributor] elects to include this software in this distribution
032: * under the [CDDL or GPL Version 2] license." If you do not indicate a
033: * single choice of license, a recipient has the option to distribute
034: * your version of this file under either the CDDL, the GPL Version 2 or
035: * to extend the choice of license to its licensees as provided above.
036: * However, if you add GPL Version 2 code and therefore, elected the GPL
037: * Version 2 license, then the option applies only if the new code is
038: * made subject to such option by the copyright holder.
039: */
040:
041: package org.netbeans.lib.profiler.results.threads;
042:
043: import org.netbeans.lib.profiler.global.CommonConstants;
044: import java.awt.*;
045:
046: /**
047: * A representation of the thread timeline data for a single thread
048: *
049: * @author Misha Dmitriev
050: */
051: public class ThreadData {
052: //~ Static fields/initializers -----------------------------------------------------------------------------------------------
053:
054: static final byte NO_STATE = 127;
055:
056: //~ Instance fields ----------------------------------------------------------------------------------------------------------
057:
058: private final Object dataLock = new Object();
059: private String className;
060: private String name;
061: private byte[] threadStates; // Array of states corresponding to above timestamps
062: // @GuardedBy dataLock
063:
064: // @GuardedBy dataLock
065: private long[] timeStamps; // Array of points in time at which thread's state changes
066: // @GuardedBy dataLock
067:
068: // @GuardedBy dataLock
069: private int capacity;
070: private int curSize;
071:
072: //~ Constructors -------------------------------------------------------------------------------------------------------------
073:
074: public ThreadData(String name, String className) {
075: synchronized (dataLock) {
076: capacity = 50;
077: timeStamps = new long[capacity];
078: threadStates = new byte[capacity];
079: curSize = 0;
080: }
081:
082: this .name = name;
083: this .className = className;
084: }
085:
086: //~ Methods ------------------------------------------------------------------------------------------------------------------
087:
088: public String getClassName() {
089: return className;
090: }
091:
092: public byte getFirstState() {
093: synchronized (dataLock) {
094: if (curSize == 0) {
095: return NO_STATE;
096: } else {
097: return threadStates[0];
098: }
099: }
100: }
101:
102: public long getFirstTimeStamp() {
103: synchronized (dataLock) {
104: if (curSize == 0) {
105: return 0;
106: } else {
107: return timeStamps[0];
108: }
109: }
110: }
111:
112: public byte getLastState() {
113: synchronized (dataLock) {
114: if (curSize == 0) {
115: return NO_STATE;
116: } else {
117: return threadStates[curSize - 1];
118: }
119: }
120: }
121:
122: public long getLastTimeStamp() {
123: synchronized (dataLock) {
124: if (curSize == 0) {
125: return 0;
126: } else {
127: return timeStamps[curSize - 1];
128: }
129: }
130: }
131:
132: public String getName() {
133: return name;
134: }
135:
136: public byte getStateAt(int idx) {
137: synchronized (dataLock) {
138: return threadStates[idx];
139: }
140: }
141:
142: public static Color getThreadStateColor(int threadState) {
143: switch (threadState) {
144: case CommonConstants.THREAD_STATUS_UNKNOWN:
145: return CommonConstants.THREAD_STATUS_UNKNOWN_COLOR;
146: case CommonConstants.THREAD_STATUS_ZOMBIE:
147: return CommonConstants.THREAD_STATUS_ZOMBIE_COLOR;
148: case CommonConstants.THREAD_STATUS_RUNNING:
149: return CommonConstants.THREAD_STATUS_RUNNING_COLOR;
150: case CommonConstants.THREAD_STATUS_SLEEPING:
151: return CommonConstants.THREAD_STATUS_SLEEPING_COLOR;
152: case CommonConstants.THREAD_STATUS_MONITOR:
153: return CommonConstants.THREAD_STATUS_MONITOR_COLOR;
154: case CommonConstants.THREAD_STATUS_WAIT:
155: return CommonConstants.THREAD_STATUS_WAIT_COLOR;
156: default:
157: return CommonConstants.THREAD_STATUS_UNKNOWN_COLOR;
158: }
159: }
160:
161: public Color getThreadStateColorAt(int idx) {
162: synchronized (dataLock) {
163: return getThreadStateColor(threadStates[idx]);
164: }
165: }
166:
167: public long getTimeStampAt(int idx) {
168: synchronized (dataLock) {
169: return timeStamps[idx];
170: }
171: }
172:
173: public void add(long timeStamp, byte threadState) {
174: synchronized (dataLock) {
175: if (curSize == capacity) {
176: long[] oldStamps = timeStamps;
177: byte[] oldStates = threadStates;
178: int oldCapacity = capacity;
179: capacity = capacity * 2;
180: timeStamps = new long[capacity];
181: threadStates = new byte[capacity];
182: System.arraycopy(oldStamps, 0, timeStamps, 0,
183: oldCapacity);
184: System.arraycopy(oldStates, 0, threadStates, 0,
185: oldCapacity);
186: }
187:
188: timeStamps[curSize] = timeStamp;
189: threadStates[curSize] = threadState;
190: curSize++;
191: }
192: }
193:
194: public void clearStates() {
195: synchronized (dataLock) {
196: capacity = 50;
197: timeStamps = new long[capacity];
198: threadStates = new byte[capacity];
199: curSize = 0;
200: }
201: }
202:
203: public int size() {
204: synchronized (dataLock) {
205: return curSize;
206: }
207: }
208: }
|