Mercurial > hg > truffle
view agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java @ 210:05712c37c828
6676016: ParallelOldGC leaks memory
Summary: ensure that GCTask threads release resource and handle memory
Reviewed-by: jmasa, chrisphi
author | jcoomes |
---|---|
date | Wed, 18 Jun 2008 18:36:47 -0700 |
parents | a61af66fc99e |
children | c18cbe5936b8 |
line wrap: on
line source
/* * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. * */ package sun.jvm.hotspot.bugspot; import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; import sun.jvm.hotspot.debugger.*; /** Displays registers in a window. FIXME: this will need more work to understand and handle register windows. */ public class RegisterPanel extends JPanel { private java.util.List/*<RegisterInfo>*/ registers; private AbstractTableModel dataModel; private boolean valid; private boolean editable; private String nullAddressString; private ThreadProxy curThread; private JTable table; static class RegisterInfo { private String name; private Address value; RegisterInfo(String name, Address value) { this.name = name; this.value = value; } String getName() { return name; } Address getValue() { return value; } } public RegisterPanel() { super(); registers = new ArrayList(); dataModel = new AbstractTableModel() { public int getColumnCount() { return 2; } public int getRowCount() { return registers.size(); } public String getColumnName(int col) { switch (col) { case 0: return "Register Name"; case 1: return "Register Value"; default: throw new RuntimeException("Index " + col + " out of bounds"); } } public Object getValueAt(int row, int col) { RegisterInfo info = (RegisterInfo) registers.get(row); switch (col) { case 0: return info.getName(); case 1: if (valid) { Address val = info.getValue(); if (val != null) { return val; } else { return nullAddressString; } } else { return "-"; } default: throw new RuntimeException("Index (" + col + ", " + row + ") out of bounds"); } } public boolean isCellEditable(int row, int col) { if (col == 0) return false; if (!valid) return false; if (curThread == null) return false; if (!curThread.canSetContext()) return false; // FIXME: add listener to watch for register changes // return true; return false; } }; // Build user interface setLayout(new BorderLayout()); table = new JTable(dataModel); table.setCellSelectionEnabled(true); table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); table.setDragEnabled(true); JTableHeader header = table.getTableHeader(); header.setReorderingAllowed(false); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); } /** Updates the register panel with the register set from the specified thread. Call this when the process has been suspended and the current thread has been set. FIXME: this interface will need to change to support register windows. */ public void update(ThreadProxy curThread) { this.curThread = curThread; ThreadContext context = curThread.getContext(); editable = curThread.canSetContext(); registers.clear(); for (int i = 0; i < context.getNumRegisters(); i++) { String name = context.getRegisterName(i); Address addr = context.getRegisterAsAddress(i); if ((nullAddressString == null) && (addr != null)) { String addrStr = addr.toString(); StringBuffer buf = new StringBuffer(); buf.append("0x"); int len = addrStr.length() - 2; for (int j = 0; j < len; j++) { buf.append("0"); } nullAddressString = buf.toString(); } registers.add(new RegisterInfo(name, addr)); } valid = true; SwingUtilities.invokeLater(new Runnable() { public void run() { dataModel.fireTableDataChanged(); } }); } /** Clears the registers' values. Call this when the processs has been resumed. */ public void clear() { valid = false; nullAddressString = null; SwingUtilities.invokeLater(new Runnable() { public void run() { dataModel.fireTableDataChanged(); } }); } public void setFont(Font font) { super.setFont(font); if (table != null) { table.setFont(font); } } }