comparison agent/src/share/classes/sun/jvm/hotspot/ui/FindInCodeCachePanel.java @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
comparison
equal deleted inserted replaced
-1:000000000000 0:a61af66fc99e
1 /*
2 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25 package sun.jvm.hotspot.ui;
26
27 import java.io.*;
28 import java.awt.*;
29 import java.awt.event.*;
30 import javax.swing.*;
31 import javax.swing.event.*;
32 import javax.swing.text.*;
33
34 import sun.jvm.hotspot.debugger.*;
35 import sun.jvm.hotspot.oops.*;
36 import sun.jvm.hotspot.runtime.*;
37 import sun.jvm.hotspot.utilities.*;
38 import sun.jvm.hotspot.code.*;
39 import sun.jvm.hotspot.ui.classbrowser.*;
40
41 /** Finds a given (Address) value in the code cache. Only intended for use
42 in a debugging system. */
43
44 public class FindInCodeCachePanel extends SAPanel {
45 private Visitor iterator;
46 private long usedSize;
47 private long iterated;
48 private Address value;
49 private ProgressBarPanel progressBar;
50 private HistoryComboBox addressField;
51 private JButton findButton;
52 private SAEditorPane contentEditor;
53
54 class Visitor implements CodeCacheVisitor {
55 Address base;
56 StringBuffer result;
57 boolean searching;
58
59 public void prologue(Address start, Address end) {
60 searching = true;
61 base = start;
62 usedSize = end.minus(start);
63 iterated = 0;
64 result = new StringBuffer();
65 clearResultWindow();
66 }
67
68 public void visit(CodeBlob blob) {
69 Address begin = blob.headerBegin();
70 Address end = begin.addOffsetTo(blob.getSize());
71 long addressSize = VM.getVM().getAddressSize();
72
73 boolean found = false;
74 while (!found && begin.lessThan(end)) {
75 Address val = begin.getAddressAt(0);
76 if (AddressOps.equal(val, value)) {
77 reportResult(result, blob);
78 found = true;
79 }
80 begin = begin.addOffsetTo(addressSize);
81 }
82 iterated = end.minus(base);;
83 updateProgressBar(null);
84 }
85
86 public void epilogue() {
87 }
88
89 public void cleanup() {
90 iterated = 0;
91 updateProgressBar(result);
92 searching = false;
93 result = null;
94 }
95
96 private void search() {
97 // Parse text
98 Address val = null;
99 try {
100 val = VM.getVM().getDebugger().parseAddress(addressField.getText());
101 } catch (Exception ex) {
102 contentEditor.setText("<b>Error parsing address</b>");
103 return;
104 }
105
106 // make sure we don't start up multiple search threads in parallel
107 synchronized (iterator) {
108 if (searching && value.equals(val)) {
109 return;
110 }
111
112 value = val;
113 contentEditor.setText("");
114 findButton.setEnabled(false);
115
116 System.out.println("Searching " + value);
117 java.lang.Thread t = new java.lang.Thread(new Runnable() {
118 public void run() {
119 synchronized (iterator) {
120 try {
121 VM.getVM().getCodeCache().iterate(iterator);
122 } finally {
123 iterator.cleanup();
124 }
125 }
126 }
127 });
128 t.start();
129 }
130 }
131 }
132
133
134 public FindInCodeCachePanel() {
135 super();
136
137 setLayout(new BorderLayout());
138
139 JPanel topPanel = new JPanel();
140 topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
141
142 JPanel panel = new JPanel();
143 panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
144 panel.add(new JLabel("Address to search for:"));
145
146 addressField = new HistoryComboBox();
147 panel.add(addressField);
148
149 iterator = new Visitor();
150
151 findButton = new JButton("Find");
152 ActionListener listener = new ActionListener() {
153 public void actionPerformed(ActionEvent e) {
154 iterator.search();
155 }
156 };
157 panel.add(findButton);
158 findButton.addActionListener(listener);
159 addressField.addActionListener(listener);
160 topPanel.add(panel);
161
162 progressBar = new ProgressBarPanel(ProgressBarPanel.HORIZONTAL, "Search progress:");
163 topPanel.add(progressBar);
164
165 add(topPanel, BorderLayout.NORTH);
166
167 contentEditor = new SAEditorPane();
168
169 HyperlinkListener hyperListener = new HyperlinkListener() {
170 public void hyperlinkUpdate(HyperlinkEvent e) {
171 if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
172 String description = e.getDescription();
173 int index = description.indexOf(':');
174 if (index != -1) {
175 String item = description.substring(0, index);
176 if (item.equals("blob")) {
177 Address blob = VM.getVM().getDebugger().parseAddress(description.substring(index + 1));
178 showCodeViewer(blob);
179 }
180 }
181 }
182 }
183 };
184
185 contentEditor.addHyperlinkListener(hyperListener);
186
187 JScrollPane scroller = new JScrollPane(contentEditor);
188 add(scroller, BorderLayout.CENTER);
189 }
190
191 private void reportResult(StringBuffer result, CodeBlob blob) {
192 result.append("<a href='blob:");
193 result.append(blob.instructionsBegin().toString());
194 result.append("'>");
195 result.append(blob.getName());
196 result.append("@");
197 result.append(blob.instructionsBegin());
198 result.append("</a><br>");
199 }
200
201 private void clearResultWindow() {
202 SwingUtilities.invokeLater(new Runnable() {
203 public void run() {
204 contentEditor.setText("");
205 }
206 });
207 }
208
209 private void updateProgressBar(final StringBuffer result) {
210 SwingUtilities.invokeLater(new Runnable() {
211 public void run() {
212 progressBar.setValue((double) iterated / (double) usedSize);
213 if (result != null) {
214 String s = "<html> <head> </head> <body>\n" + result + " </body> </html>";
215 contentEditor.setText(s);
216 findButton.setEnabled(true);
217 }
218 }
219 });
220 }
221 }