--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/demo/share/jvmti/hprof/hprof.h Sun Aug 17 15:54:13 2014 +0100
@@ -0,0 +1,401 @@
+/*
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+
+/* Primary hprof #include file, should be included by most if not
+ * all hprof source files. Gives access to the global data structure
+ * and all global macros, and everything declared in the #include
+ * files of each of the source files.
+ */
+
+#ifndef HPROF_H
+#define HPROF_H
+
+/* Standard C functions used throughout. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <time.h>
+#include <errno.h>
+
+/* General JVM/Java functions, types and macros. */
+
+#include <sys/types.h>
+#include "jni.h"
+#include "jvmti.h"
+#include "classfile_constants.h"
+#include "jvm_md.h"
+
+/* Macros to extract the upper and lower 32 bits of a jlong */
+
+#define jlong_high(a) ((jint)((a)>>32))
+#define jlong_low(a) ((jint)(a))
+#define jlong_to_jint(a) ((jint)(a))
+#define jint_to_jlong(a) ((jlong)(a))
+
+#define jlong_add(a, b) ((a) + (b))
+
+
+/* The type used to contain a generic 32bit "serial number". */
+
+typedef unsigned SerialNumber;
+
+/* How the options get to OnLoad: */
+
+#define AGENTNAME "hprof"
+#define XRUN "-Xrun" AGENTNAME
+#define AGENTLIB "-agentlib:" AGENTNAME
+
+/* Name of prelude file, found at runtime relative to java binary location */
+
+#define PRELUDE_FILE "jvm.hprof.txt"
+
+/* File I/O buffer size to be used with any file i/o operation */
+
+#define FILE_IO_BUFFER_SIZE (1024*64)
+
+/* Machine dependent functions. */
+
+#include "hprof_md.h"
+
+/* Table index types */
+
+typedef unsigned TableIndex;
+typedef TableIndex ClassIndex;
+typedef TableIndex FrameIndex;
+typedef TableIndex IoNameIndex;
+typedef TableIndex MonitorIndex;
+typedef TableIndex ObjectIndex;
+typedef TableIndex LoaderIndex;
+typedef TableIndex RefIndex;
+typedef TableIndex SiteIndex;
+typedef TableIndex StringIndex;
+typedef TableIndex TlsIndex;
+typedef TableIndex TraceIndex;
+
+/* Index for method tables in classes */
+
+typedef int MethodIndex;
+
+/* The different kinds of class status bits. */
+
+enum ClassStatus {
+ CLASS_PREPARED = 0x00000001,
+ CLASS_LOADED = 0x00000002,
+ CLASS_UNLOADED = 0x00000004,
+ CLASS_SPECIAL = 0x00000008,
+ CLASS_IN_LOAD_LIST = 0x00000010,
+ CLASS_SYSTEM = 0x00000020,
+ CLASS_DUMPED = 0x00000040
+};
+typedef jint ClassStatus;
+
+/* The different kind of objects we track with heap=dump */
+
+typedef unsigned char ObjectKind;
+enum {
+ OBJECT_NORMAL = 1,
+ OBJECT_CLASS = 2,
+ OBJECT_SYSTEM = 3,
+ OBJECT_HPROF = 4,
+ OBJECT_LOADER = 5
+};
+
+/* Used by site_write() when writing out the heap=sites data. */
+
+enum {
+ SITE_DUMP_INCREMENTAL = 0x01,
+ SITE_SORT_BY_ALLOC = 0x02,
+ SITE_FORCE_GC = 0x04
+};
+
+/* Used to hold information about a field, and potentially a value too. */
+
+typedef struct FieldInfo {
+ ClassIndex cnum;
+ StringIndex name_index;
+ StringIndex sig_index;
+ unsigned short modifiers;
+ unsigned char primType;
+ unsigned char primSize;
+} FieldInfo;
+
+/* Used to hold information about a constant pool entry value for a class. */
+
+typedef struct ConstantPoolValue {
+ unsigned constant_pool_index;
+ StringIndex sig_index;
+ jvalue value;
+} ConstantPoolValue;
+
+/* All machine independent functions */
+
+#include "hprof_error.h"
+#include "hprof_util.h"
+#include "hprof_blocks.h"
+#include "hprof_stack.h"
+#include "hprof_init.h"
+#include "hprof_table.h"
+#include "hprof_string.h"
+#include "hprof_class.h"
+#include "hprof_tracker.h"
+#include "hprof_frame.h"
+#include "hprof_monitor.h"
+#include "hprof_trace.h"
+#include "hprof_site.h"
+#include "hprof_event.h"
+#include "hprof_reference.h"
+#include "hprof_object.h"
+#include "hprof_loader.h"
+#include "hprof_tls.h"
+#include "hprof_check.h"
+#include "hprof_io.h"
+#include "hprof_listener.h"
+#include "hprof_cpu.h"
+#include "hprof_tag.h"
+
+/* Global data structure */
+
+struct LineTable;
+
+typedef struct {
+
+ jvmtiEnv *jvmti; /* JVMTI env for this session */
+ JavaVM *jvm; /* JavaVM* for this session */
+ jint cachedJvmtiVersion; /* JVMTI version number */
+
+ char *header; /* "JAVA PROFILE 1.0.[12]" */
+ jboolean segmented; /* JNI_TRUE if 1.0.2 */
+ jlong maxHeapSegment;
+ jlong maxMemory;
+
+ /* Option settings */
+ char * options; /* option string copy */
+ char * utf8_output_filename;/* file=filename */
+ int net_port; /* net=hostname:port */
+ char * net_hostname; /* net=hostname:port */
+ char output_format; /* format=a|b */
+ int max_trace_depth; /* depth=max_trace_depth */
+ int prof_trace_depth; /* max_trace_depth or 2 (old) */
+ int sample_interval; /* interval=sample_interval (ms) */
+ double cutoff_point; /* cutoff=cutoff_point */
+ jboolean cpu_sampling; /* cpu=samples|y */
+ jboolean cpu_timing; /* cpu=times */
+ jboolean old_timing_format; /* cpu=old (old) output format */
+ jboolean heap_dump; /* heap=dump|all */
+ jboolean alloc_sites; /* heap=sites|all */
+ jboolean thread_in_traces; /* thread=y|n */
+ jboolean lineno_in_traces; /* lineno=y|n */
+ jboolean dump_on_exit; /* doe=y|n */
+ jboolean micro_state_accounting; /* msa=y|n */
+ jboolean force_output; /* force=y|n */
+ jboolean monitor_tracing; /* monitor=y|n */
+ jboolean gc_okay; /* gc_okay=y|n (Not used) */
+
+ unsigned logflags; /* logflags=bitmask */
+
+ #define DEBUGFLAG_UNPREPARED_CLASSES 0x001
+ unsigned debugflags; /* debugflags=bitmask */
+
+ jboolean coredump; /* coredump=y|n */
+ jboolean errorexit; /* errorexit=y|n */
+ jboolean pause; /* pause=y|n */
+ jboolean debug; /* debug=y|n */
+ jboolean verbose; /* verbose=y|n */
+ jboolean primfields; /* primfields=y|n */
+ jboolean primarrays; /* primarrays=y|n */
+ jint experiment; /* X=NUMBER */
+
+ int fd; /* file or socket (net=addr). */
+ jboolean socket; /* True if fd is a socket (net=addr). */
+ jboolean bci; /* True if any kind of BCI being done */
+ jboolean obj_watch; /* True if bci and watching allocs */
+
+ int bci_counter; /* Class BCI counter */
+
+ int heap_fd;
+ char *output_filename; /* file=filename */
+ char *heapfilename;
+
+ int check_fd;
+ char *checkfilename;
+
+ volatile jboolean dump_in_process; /* Dump in process */
+ volatile jboolean jvm_initializing; /* VMInit happening */
+ volatile jboolean jvm_initialized; /* VMInit happened */
+ volatile jboolean jvm_shut_down; /* VMDeath happened */
+ jboolean vm_death_callback_active; /* VMDeath happening */
+
+ /* Stack of objects freed during GC */
+ Stack * object_free_stack;
+ jrawMonitorID object_free_lock;
+
+ /* Lock for debug_malloc() */
+ jrawMonitorID debug_malloc_lock;
+
+ /* Count of classes that JVMTI thinks are active */
+ jint class_count;
+
+ /* Used to track callbacks for VM_DEATH */
+ jrawMonitorID callbackBlock;
+ jrawMonitorID callbackLock;
+ jint active_callbacks;
+
+ /* Running totals on all bytes allocated */
+ jlong total_alloced_bytes;
+ jlong total_alloced_instances;
+ jint total_live_bytes;
+ jint total_live_instances;
+
+ /* Running total on all time spent in GC (very rough estimate) */
+ jlong gc_start_time;
+ jlong time_in_gc;
+
+ /* Global Data access Lock */
+ jrawMonitorID data_access_lock;
+
+ /* Global Dump lock */
+ jrawMonitorID dump_lock;
+
+ /* Milli-second clock when hprof onload started */
+ jlong micro_sec_ticks;
+
+ /* Thread class (for starting agent threads) */
+ ClassIndex thread_cnum;
+
+ /* Agent threads started information */
+ jboolean listener_loop_running;
+ jrawMonitorID listener_loop_lock;
+ jboolean cpu_loop_running;
+ jrawMonitorID cpu_loop_lock;
+ jrawMonitorID cpu_sample_lock; /* cpu=samples loop */
+ jint gc_finish; /* Count of GC finish events */
+ jboolean gc_finish_active; /* True if thread active */
+ jboolean gc_finish_stop_request; /* True if we want it to stop */
+ jrawMonitorID gc_finish_lock;
+
+ jboolean pause_cpu_sampling; /* temp pause in cpu sampling */
+
+ /* Output buffer, position, size, and position in dump if reading */
+ char * write_buffer;
+ int write_buffer_index;
+ int write_buffer_size;
+ char * heap_buffer;
+ int heap_buffer_index;
+ int heap_buffer_size;
+ jlong heap_last_tag_position;
+ jlong heap_write_count;
+ char * check_buffer;
+ int check_buffer_index;
+ int check_buffer_size;
+
+ /* Serial number counters for tables (see hprof_table.c), classes,
+ * tls (thread local storage), and traces.
+ */
+ SerialNumber table_serial_number_start;
+ SerialNumber class_serial_number_start;
+ SerialNumber thread_serial_number_start;
+ SerialNumber trace_serial_number_start;
+ SerialNumber object_serial_number_start;
+ SerialNumber frame_serial_number_start;
+ SerialNumber gref_serial_number_start;
+
+ SerialNumber table_serial_number_counter;
+ SerialNumber class_serial_number_counter;
+ SerialNumber thread_serial_number_counter;
+ SerialNumber trace_serial_number_counter;
+ SerialNumber object_serial_number_counter;
+ SerialNumber frame_serial_number_counter;
+ SerialNumber gref_serial_number_counter;
+
+ /* The methodID for the Object <init> method. */
+ jmethodID object_init_method;
+
+ /* Keeping track of the tracker class and it's methods */
+ volatile jint tracking_engaged; /* !=0 means it's on */
+ ClassIndex tracker_cnum;
+ int tracker_method_count;
+ struct {
+ StringIndex name; /* String index for name */
+ StringIndex sig; /* String index for signature */
+ jmethodID method; /* Method ID */
+ } tracker_methods[12]; /* MAX 12 Tracker class methods */
+
+ /* Index to some common items */
+ LoaderIndex system_loader;
+ SerialNumber unknown_thread_serial_num;
+ TraceIndex system_trace_index;
+ SiteIndex system_object_site_index;
+ jint system_class_size;
+ TraceIndex hprof_trace_index;
+ SiteIndex hprof_site_index;
+
+ /* Tables for strings, classes, sites, etc. */
+ struct LookupTable * string_table;
+ struct LookupTable * ioname_table;
+ struct LookupTable * class_table;
+ struct LookupTable * site_table;
+ struct LookupTable * object_table;
+ struct LookupTable * reference_table;
+ struct LookupTable * frame_table;
+ struct LookupTable * trace_table;
+ struct LookupTable * monitor_table;
+ struct LookupTable * tls_table;
+ struct LookupTable * loader_table;
+
+ /* Handles to java_crw_demo library */
+ void * java_crw_demo_library;
+ void * java_crw_demo_function;
+ void * java_crw_demo_classname_function;
+
+ /* Indication that the agent has been loaded */
+ jboolean isLoaded;
+
+} GlobalData;
+
+/* This should be the only 'extern' in the library (not exported). */
+
+extern GlobalData * gdata;
+
+#endif