/* | 
|
 * Copyright (c) 2004, Oracle and/or its affiliates. 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.  Oracle designates this | 
|
 * particular file as subject to the "Classpath" exception as provided | 
|
 * by Oracle in the LICENSE file that accompanied this code. | 
|
 * | 
|
 * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|
 * or visit www.oracle.com if you need additional information or have any | 
|
 * questions. | 
|
*/  | 
|
package sun.jvmstat.perfdata.monitor.v1_0;  | 
|
import sun.jvmstat.monitor.*;  | 
|
import sun.jvmstat.perfdata.monitor.*;  | 
|
import java.nio.*;  | 
|
/** | 
|
 * Class representing the 1.0 version of the HotSpot PerfData instrumentation | 
|
 * buffer header. | 
|
 * <p> | 
|
 * The PerfDataBufferPrologue2_0 class supports parsing of the version | 
|
 * specific portions of the PerfDataPrologue C structure: | 
|
 * <pre> | 
|
 * typedef struct { | 
|
 *   ...                      // handled by superclass | 
|
 *   jint used;               // number of PerfData memory bytes used | 
|
 *   jint overflow;           // number of bytes of overflow | 
|
 *   jlong mod_time_stamp;    // time stamp of the last structural modification | 
|
 * } PerfDataPrologue | 
|
 * </pre> | 
|
 * | 
|
 * @author Brian Doherty | 
|
 * @since 1.5 | 
|
*/  | 
|
public class PerfDataBufferPrologue extends AbstractPerfDataBufferPrologue {  | 
|
private static final int SUPPORTED_MAJOR_VERSION = 1;  | 
|
private static final int SUPPORTED_MINOR_VERSION = 0;  | 
|
    /* | 
|
     * the following constants must match the field offsets and sizes | 
|
     * in the PerfDataPrologue structure in perfMemory.hpp | 
|
*/  | 
|
final static int PERFDATA_PROLOG_USED_OFFSET=8;  | 
|
    final static int PERFDATA_PROLOG_USED_SIZE=4;              // sizeof(int) | 
|
final static int PERFDATA_PROLOG_OVERFLOW_OFFSET=12;  | 
|
    final static int PERFDATA_PROLOG_OVERFLOW_SIZE=4;          // sizeof(int) | 
|
final static int PERFDATA_PROLOG_MODTIMESTAMP_OFFSET=16;  | 
|
    final static int PERFDATA_PROLOG_MODTIMESTAMP_SIZE=8;      // sizeof(long) | 
|
    final static int PERFDATA_PROLOG_SIZE=24;  // sizeof(struct PerfDataProlog) | 
|
    // counter names for prologue psuedo counters | 
|
final static String PERFDATA_BUFFER_SIZE_NAME = "sun.perfdata.size";  | 
|
final static String PERFDATA_BUFFER_USED_NAME = "sun.perfdata.used";  | 
|
final static String PERFDATA_OVERFLOW_NAME = "sun.perfdata.overflow";  | 
|
final static String PERFDATA_MODTIMESTAMP_NAME = "sun.perfdata.timestamp";  | 
|
    /** | 
|
     * Create an instance of PerfDataBufferPrologue from the given | 
|
     * ByteBuffer object. | 
|
     * | 
|
     * @param byteBuffer the buffer containing the binary header data | 
|
*/  | 
|
public PerfDataBufferPrologue(ByteBuffer byteBuffer)  | 
|
throws MonitorException {  | 
|
super(byteBuffer);  | 
|
assert ((getMajorVersion() == 1) && (getMinorVersion() == 0));  | 
|
}  | 
|
    /** | 
|
     * {@inheritDoc} | 
|
*/  | 
|
    public boolean supportsAccessible() { | 
|
return false;  | 
|
}  | 
|
    /** | 
|
     * {@inheritDoc} | 
|
*/  | 
|
    public boolean isAccessible() { | 
|
return true;  | 
|
}  | 
|
    /** | 
|
     * Get the utilization of the instrumentation memory buffer. | 
|
     * | 
|
     * @return int - the utilization of the buffer | 
|
*/  | 
|
    public int getUsed() { | 
|
byteBuffer.position(PERFDATA_PROLOG_USED_OFFSET);  | 
|
return byteBuffer.getInt();  | 
|
}  | 
|
    /** | 
|
     * Get the size of the instrumentation memory buffer. | 
|
     * | 
|
     * @return int - the size of the buffer | 
|
*/  | 
|
    public int getBufferSize() { | 
|
return byteBuffer.capacity();  | 
|
}  | 
|
    /** | 
|
     * Get the buffer overflow amount. This value is non-zero if the | 
|
     * HotSpot JVM has overflowed the instrumentation memory buffer. | 
|
     * The target JVM can be restarted with -XX:PerfDataMemSize=X to | 
|
     * create a larger memory buffer. | 
|
     * | 
|
     * @return int - the size of the buffer | 
|
*/  | 
|
    public int getOverflow() { | 
|
byteBuffer.position(PERFDATA_PROLOG_OVERFLOW_OFFSET);  | 
|
return byteBuffer.getInt();  | 
|
}  | 
|
    /** | 
|
     * Get the time of last modification for the instrumentation | 
|
     * memory buffer. This method returns the time, as ticks since the | 
|
     * start of the target JVM, of the last structural modification to | 
|
     * the instrumentation buffer. Structural modifications correspond to | 
|
     * the addition or deletion of instrumentation objects. Updates to | 
|
     * counter values are not structural modifications. | 
|
*/  | 
|
    public long getModificationTimeStamp() { | 
|
byteBuffer.position(PERFDATA_PROLOG_MODTIMESTAMP_OFFSET);  | 
|
return byteBuffer.getLong();  | 
|
}  | 
|
    /** | 
|
     * {@inheritDoc} | 
|
*/  | 
|
    public int getSize() { | 
|
return PERFDATA_PROLOG_SIZE; // sizeof(struct PerfDataProlog)  | 
|
}  | 
|
    /** | 
|
     * Return an IntBuffer that accesses the used value. This is used | 
|
     * to create a Monitor object for this value. | 
|
     * | 
|
     * @return IntBuffer - a ByteBuffer that accesses the used value | 
|
     *                     in the instrumentation buffer header. | 
|
     * @see #getUsed() | 
|
*/  | 
|
    public IntBuffer usedBuffer() { | 
|
byteBuffer.position(PERFDATA_PROLOG_USED_OFFSET);  | 
|
IntBuffer ib = byteBuffer.asIntBuffer();  | 
|
ib.limit(1);  | 
|
return ib;  | 
|
}  | 
|
    /** | 
|
     * Return an IntBuffer that accesses the size value. This is used | 
|
     * to create a Monitor object for this value. | 
|
     * | 
|
     * @return IntBuffer - a ByteBuffer that accesses the size value | 
|
     *                     in the instrumentation buffer header. | 
|
     * @see #getBufferSize() | 
|
*/  | 
|
    public IntBuffer sizeBuffer() { | 
|
IntBuffer ib = IntBuffer.allocate(1);  | 
|
ib.put(byteBuffer.capacity());  | 
|
return ib;  | 
|
}  | 
|
    /** | 
|
     * Return an IntBuffer that accesses the overflow value. This is used | 
|
     * to create a Monitor object for this value. | 
|
     * | 
|
     * @return IntBuffer - a ByteBuffer that accesses the overflow value | 
|
     *                     in the instrumentation buffer header. | 
|
     * @see #getOverflow() | 
|
*/  | 
|
    public IntBuffer overflowBuffer() { | 
|
byteBuffer.position(PERFDATA_PROLOG_OVERFLOW_OFFSET);  | 
|
IntBuffer ib = byteBuffer.asIntBuffer();  | 
|
ib.limit(1);  | 
|
return ib;  | 
|
}  | 
|
    /** | 
|
     * Return an LongBuffer that accesses the modification timestamp value. | 
|
     * This is used* to create a Monitor object for this value. | 
|
     * | 
|
     * @return LongBuffer - a ByteBuffer that accesses the modification time | 
|
     *                      stamp value in the instrumentation buffer header. | 
|
     * @see #getModificationTimeStamp() | 
|
*/  | 
|
    public LongBuffer modificationTimeStampBuffer() { | 
|
byteBuffer.position(PERFDATA_PROLOG_MODTIMESTAMP_OFFSET);  | 
|
LongBuffer lb = byteBuffer.asLongBuffer();  | 
|
lb.limit(1);  | 
|
return lb;  | 
|
}  | 
|
}  |