xref: /onnv-gate/usr/src/lib/libdtrace_jni/common/dtrace_jni.h (revision 6136:b1f0a0698377)
11449Stomee /*
21449Stomee  * CDDL HEADER START
31449Stomee  *
41449Stomee  * The contents of this file are subject to the terms of the
51449Stomee  * Common Development and Distribution License (the "License").
61449Stomee  * You may not use this file except in compliance with the License.
71449Stomee  *
81449Stomee  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91449Stomee  * or http://www.opensolaris.org/os/licensing.
101449Stomee  * See the License for the specific language governing permissions
111449Stomee  * and limitations under the License.
121449Stomee  *
131449Stomee  * When distributing Covered Code, include this CDDL HEADER in each
141449Stomee  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151449Stomee  * If applicable, add the following below this CDDL HEADER, with the
161449Stomee  * fields enclosed by brackets "[]" replaced with your own identifying
171449Stomee  * information: Portions Copyright [yyyy] [name of copyright owner]
181449Stomee  *
191449Stomee  * CDDL HEADER END
201449Stomee  */
211449Stomee 
221449Stomee /*
23*6136Stomee  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
241449Stomee  * Use is subject to license terms.
251449Stomee  */
261449Stomee 
271449Stomee #ifndef	_DTRACE_JNI_H
281449Stomee #define	_DTRACE_JNI_H
291449Stomee 
301449Stomee #pragma ident	"%Z%%M%	%I%	%E% SMI"
311449Stomee 
321449Stomee #include <libuutil.h>
331449Stomee #include <jni.h>
341449Stomee #include <dtrace.h>
351449Stomee #include <dtj_util.h>
361449Stomee 
371449Stomee #ifdef	__cplusplus
381449Stomee extern "C" {
391449Stomee #endif
401449Stomee 
411449Stomee /* Java DTrace API native library */
421449Stomee 
431449Stomee 
441449Stomee /*
451449Stomee  * Thread-specific data key used to obtain JNI state specific to either the
461449Stomee  * consumer loop (calls dtrace_work()) or the getAggregate() method (calls
471449Stomee  * dtrace_aggregate_print()).
481449Stomee  */
491449Stomee extern pthread_key_t g_dtj_consumer_key;
501449Stomee 
511449Stomee typedef enum dtj_consumer_state {
521449Stomee 	DTJ_CONSUMER_INIT,
531449Stomee 	DTJ_CONSUMER_GO,
541449Stomee 	DTJ_CONSUMER_START,
551449Stomee 	DTJ_CONSUMER_STOP
561449Stomee } dtj_consumer_state_t;
571449Stomee 
581449Stomee typedef struct dtj_error {
591449Stomee 	int dtje_number;		/* dtrace_errno() */
601449Stomee 	const char *dtje_message;	/* dtrace_errmsg() */
611449Stomee } dtj_error_t;
621449Stomee 
631449Stomee /*
641449Stomee  * Identifies which function should handle a request dequeued after
651449Stomee  * dtrace_sleep().
661449Stomee  */
671449Stomee typedef enum dtj_request_type {
681449Stomee 	DTJ_REQUEST_OPTION		/* set DTrace runtime option */
691449Stomee } dtj_request_type_t;
701449Stomee 
711449Stomee /*
721449Stomee  * A request made from Java (by native method call) that is unsafe to process
731449Stomee  * until just after the consumer loop wakes up from dtrace_sleep().
741449Stomee  */
751449Stomee typedef struct dtj_request {
761449Stomee 	dtj_request_type_t dtjr_type;	/* request handler ID */
771449Stomee 	uu_list_t *dtjr_args;		/* string args to request handler */
781449Stomee 	uu_list_node_t dtjr_node;	/* points to next and prev requests */
791449Stomee } dtj_request_t;
801449Stomee 
811449Stomee typedef enum dtj_program_type {
821449Stomee 	DTJ_PROGRAM_NONE,
831449Stomee 	DTJ_PROGRAM_STRING,		/* dtrace_program_strcompile() */
841449Stomee 	DTJ_PROGRAM_FILE		/* dtrace_program_fcompile() */
851449Stomee } dtj_program_type_t;
861449Stomee 
871449Stomee /* Identifier and description of a compiled DTrace program */
881449Stomee typedef struct dtj_program {
891449Stomee 	dtj_program_type_t dtjp_type;	/* string or file */
901449Stomee 	const char *dtjp_name;		/* string or filename for err msg */
911449Stomee 	dtrace_prog_t *dtjp_program;	/* libdtrace program handle */
921449Stomee 	dtrace_proginfo_t dtjp_info;	/* program attributes */
931449Stomee 	boolean_t dtjp_enabled;		/* dtrace_program_exec() flag */
941449Stomee 	uu_list_node_t dtjp_node;	/* points to next and prev programs */
951449Stomee } dtj_program_t;
961449Stomee 
971449Stomee /*
981449Stomee  * An entry used to maintain the association between the value of an aggregating
991449Stomee  * action (such as count()) and the aggregation to which the value belongs until
1001449Stomee  * all the data associated with a single tuple is available to the callback
1011449Stomee  * handler.
1021449Stomee  */
1031449Stomee typedef struct dtj_aggval {
1041449Stomee 	jobject dtja_value;		/* value of aggregating action */
1051449Stomee 	const char *dtja_aggname;	/* aggregation name */
1061449Stomee 	int64_t dtja_aggid;		/* libdtrace aggregation ID */
1071449Stomee 	uu_list_node_t dtja_node;	/* points to next and prev aggvals */
1081449Stomee } dtj_aggval_t;
1091449Stomee 
1101449Stomee /*
1111449Stomee  * Per-consumer state, including the libdtrace consumer handle, is valid across
1121449Stomee  * multiple threads.  One consumer entry is added to a global table per
1131449Stomee  * dtrace_open().
1141449Stomee  */
1151449Stomee typedef struct dtj_consumer {
1161449Stomee 	/* Consumer state */
1171449Stomee 
1181449Stomee 	dtrace_hdl_t *dtjc_dtp;		/* libdtrace consumer handle */
1191449Stomee 	uu_list_t *dtjc_program_list;	/* program_t list */
1201449Stomee 	uu_list_t *dtjc_process_list;	/* proc handle list */
1211449Stomee 
1221449Stomee 	/*
1231449Stomee 	 * Count of processes that have ended.  The consumer is stopped when
1241449Stomee 	 * this count equals the number of outstanding target processes and
1251449Stomee 	 * grabbed processes (see the Java Consumer createProcess() and
1261449Stomee 	 * grabProcess() methods).
1271449Stomee 	 */
1281449Stomee 	int dtjc_procs_ended;
1291449Stomee 
1301449Stomee 	/*
1311449Stomee 	 * Bit-field passed to dtrace_program_strcompile() and
1321449Stomee 	 * dtrace_program_fcompile() containing compile flags.  The flags are
1331449Stomee 	 * set from Java by the setOption() Consumer method (just like the
1341449Stomee 	 * runtime options handled by dtrace_setopt(), except that they must be
1351449Stomee 	 * set before program compilation to have any effect).
1361449Stomee 	 */
1371449Stomee 	uint_t dtjc_cflags;
1381449Stomee 
1391449Stomee 	boolean_t dtjc_flow;	/* current value of the flowindent option */
1401449Stomee 	dtj_consumer_state_t dtjc_state; /* execution state */
1411449Stomee 	boolean_t dtjc_interrupt;	/* flag that stops consumer */
1421449Stomee 
1431449Stomee 	/* Pending requests */
1441449Stomee 	uu_list_t *dtjc_request_list;	/* request_t queue */
1451449Stomee 	pthread_mutex_t dtjc_request_list_lock;
1461449Stomee 
1471449Stomee 
1481449Stomee 	/* Cached for optimization and for use across functions */
1491449Stomee 
1501449Stomee 	/*
1511449Stomee 	 * Nanosecond timestamp cached in the consumer loop just before
1521449Stomee 	 * dtrace_work().  The timestamp is applied to each Java PrintaRecord
1531449Stomee 	 * generated in that iteration of the consumer loop.  A value of zero
1541449Stomee 	 * indicates that we are not in the consumer loop, but that the
1551449Stomee 	 * callback was triggered instead by the Consumer getAggregate() method
1561449Stomee 	 * (from dtrace_aggregate_print()).
1571449Stomee 	 */
1581449Stomee 	hrtime_t dtjc_printa_snaptime;
1591449Stomee 
1601449Stomee 	/*
1611449Stomee 	 * The aggregation ID is used to optimize aggregation inclusion by
1621449Stomee 	 * testing for inclusion only when the aggregation has changed.
1631449Stomee 	 */
1641449Stomee 	int64_t dtjc_aggid;
1651449Stomee 	boolean_t dtjc_included;
1661449Stomee 
1671449Stomee 	/*
1681449Stomee 	 * The expected tuple member count is used to determine whether or not
1691449Stomee 	 * the aggregation tuple values are completely specified in the printa()
1701449Stomee 	 * format string.
1711449Stomee 	 */
1721449Stomee 	int dtjc_expected;
1731449Stomee 
1741449Stomee 	int dtjc_probedata_rec_i;	/* probe data record index */
1751449Stomee 
1761449Stomee 	/*
1771449Stomee 	 * The current DTrace action may apply across multiple libdtrace probe
1781449Stomee 	 * data records.
1791449Stomee 	 */
1801449Stomee 	dtrace_actkind_t dtjc_probedata_act;
1811449Stomee 
1821449Stomee 	/* Placeholder used when listing probes */
1831449Stomee 	dtrace_ecbdesc_t *dtjc_last_probe;
1841449Stomee 
1851449Stomee 	/* Function used by statement iterator when listing probes */
1861449Stomee 	dtrace_probe_f *dtjc_plistfunc;
1871449Stomee } dtj_consumer_t;
1881449Stomee 
1891449Stomee /*
1901449Stomee  * A view of a dtj_consumer_t that lasts only as long as a single native method
1911449Stomee  * call.  This view attaches state needed for interaction with Java and specific
1921449Stomee  * to the JNI.
1931449Stomee  */
1941449Stomee typedef struct dtj_java_consumer {
1951449Stomee 	/* Per-consumer state in global consumer table */
1961449Stomee 	dtj_consumer_t *dtjj_consumer;
1971449Stomee 
1981449Stomee 	JNIEnv *dtjj_jenv;	/* Java environment pointer */
1991449Stomee 	jobject dtjj_caller;	/* Java Consumer to call back with probe data */
2001449Stomee 
2011449Stomee 	/*
2021449Stomee 	 * Java Object references used across function boundaries, valid only
2031449Stomee 	 * within the current native method call.
2041449Stomee 	 */
2051449Stomee 
2061449Stomee 	jobject dtjj_probedata;	/* instance of class ProbeData */
2071449Stomee 
2081449Stomee 	/*
2091449Stomee 	 * StringBuffer used to concatenate buffered printa() output associated
2101449Stomee 	 * with the current tuple.
2111449Stomee 	 */
2121449Stomee 	jobject dtjj_printa_buffer;
2131449Stomee 
2141449Stomee 	jobject dtjj_aggregate;	/* instance of class Aggregate */
2151449Stomee 	jobject dtjj_tuple;	/* instance of class Tuple */
2161449Stomee 
2171449Stomee 	/*
2181449Stomee 	 * AggregationValue instances cached until we receive the
2191449Stomee 	 * DTRACE_BUFDATA_AGGLAST flag indicating the last callback associated
2201449Stomee 	 * with the current tuple.
2211449Stomee 	 */
2221449Stomee 	uu_list_t *dtjj_aggval_list;
2231449Stomee 
2241449Stomee 	/* AggregateSpec used by get_aggregate() */
2251449Stomee 	jobject dtjj_aggregate_spec;
2261449Stomee 
2271449Stomee 	jobject dtjj_probelist;	/* java.util.List returned by listProbes() */
2281449Stomee 
2291449Stomee 	/*
2301449Stomee 	 * Exception temporarily cleared by callback handlers who cannot return
2311449Stomee 	 * a signal to abort the consumer.  At a safe point when the consumer
2321449Stomee 	 * loop gets control back from libdtrace, the exception is rethrown.
2331449Stomee 	 */
2341449Stomee 	jthrowable dtjj_exception;
2351449Stomee 
2361449Stomee 	jobject dtjj_consumer_lock; /* per-consumer lock */
2371449Stomee 
2381449Stomee } dtj_java_consumer_t;
2391449Stomee 
2401449Stomee /*
2411449Stomee  * Cache of jclass, jmethodID, and jfieldID values, usable across multiple
2421449Stomee  * native method calls and multiple threads.  Caching all of them up front
2431449Stomee  * rather than as-needed guarantees early detection of incorrect class, method,
2441449Stomee  * or field definitions, and eliminates the need for test cases to cover
2451449Stomee  * seldom-used definitions.
2461449Stomee  *
2471449Stomee  * Suffix conventions:
2481449Stomee  *   jc  java class
2491449Stomee  *   jm  java method
2501449Stomee  *   jsm java static method
2511449Stomee  *   jf  java field
2521449Stomee  *   jsf java static field
2531449Stomee  */
2541449Stomee 
2551449Stomee /* LocalConsumer */
2561449Stomee extern jclass g_caller_jc;
2571449Stomee extern jmethodID g_gethandle_jm;
2581449Stomee extern jmethodID g_sethandle_jm;
2591449Stomee extern jmethodID g_pdatanext_jm;
2601449Stomee extern jmethodID g_drop_jm;
2611449Stomee extern jmethodID g_error_jm;
2621449Stomee extern jmethodID g_proc_jm;
2631449Stomee extern jmethodID g_interval_began_jm;
2641449Stomee extern jmethodID g_interval_ended_jm;
2651449Stomee extern jfieldID g_consumer_lock_jf;
2661449Stomee 
2671449Stomee /* DTraceException */
2681449Stomee extern jclass g_dtx_jc;
2691449Stomee extern jmethodID g_dtxinit_jm;
2701449Stomee 
2711449Stomee /* InterfaceAttributes */
2721449Stomee extern jclass g_attr_jc;
2731449Stomee extern jmethodID g_attrinit_jm;
2741449Stomee extern jmethodID g_attrset_name_jm;
2751449Stomee extern jmethodID g_attrset_data_jm;
2761449Stomee extern jmethodID g_attrset_class_jm;
2771449Stomee 
2781449Stomee /* ProbeDescription */
2791449Stomee extern jclass g_probedesc_jc;
2801449Stomee extern jmethodID g_probedescinit_jm;
2811449Stomee extern jfieldID g_probedesc_id_jf;
2821449Stomee 
2831449Stomee /* ProbeInfo */
2841449Stomee extern jclass g_probeinfo_jc;
2851449Stomee extern jmethodID g_probeinfoinit_jm;
2861449Stomee 
2871449Stomee /* Probe */
2881449Stomee extern jclass g_probe_jc;
2891449Stomee extern jmethodID g_probeinit_jm;
2901449Stomee 
2911449Stomee /* Program */
2921449Stomee extern jclass g_program_jc;
2931449Stomee extern jmethodID g_proginit_jm;
2941449Stomee extern jfieldID g_progid_jf;
2951449Stomee extern jfieldID g_proginfo_jf;
2961449Stomee 
2971449Stomee /* Program.File */
2981449Stomee extern jclass g_programfile_jc;
2991449Stomee extern jmethodID g_fproginit_jm;
3001449Stomee 
3011449Stomee /* ProgramInfo */
3021449Stomee extern jclass g_proginfo_jc;
3031449Stomee extern jmethodID g_proginfoinit_jm;
3041449Stomee 
3051449Stomee /* Flow */
3061449Stomee extern jclass g_flow_jc;
3071449Stomee extern jmethodID g_flowinit_jm;
3081449Stomee 
3091449Stomee /* ProbeData */
3101449Stomee extern jclass g_pdata_jc;
3111449Stomee extern jmethodID g_pdatainit_jm;
3121449Stomee extern jmethodID g_pdataadd_jm;
3131449Stomee extern jmethodID g_pdataadd_rec_jm;
3141449Stomee extern jmethodID g_pdataadd_trace_jm;
3151449Stomee extern jmethodID g_pdataadd_stack_jm;
3162777Stomee extern jmethodID g_pdataadd_symbol_jm;
3171449Stomee extern jmethodID g_pdataadd_printf_jm;
3181449Stomee extern jmethodID g_pdataadd_printa_jm;
3191449Stomee extern jmethodID g_pdatainvalidate_printa_jm;
3201449Stomee extern jmethodID g_pdataadd_aggrec_jm;
3211449Stomee extern jmethodID g_pdataadd_printa_str_jm;
3221449Stomee extern jmethodID g_pdataadd_exit_jm;
3231449Stomee extern jmethodID g_pdataattach_jm;
3241449Stomee extern jmethodID g_pdataset_formatted_jm;
3251449Stomee extern jmethodID g_pdataclear_jm;
3261449Stomee 
3271449Stomee /* Drop */
3281449Stomee extern jclass g_drop_jc;
3291449Stomee extern jmethodID g_dropinit_jm;
3301449Stomee 
3311449Stomee /* Error */
3321449Stomee extern jclass g_error_jc;
3331449Stomee extern jmethodID g_errinit_jm;
3341449Stomee 
3351449Stomee /* ProcessState */
3361449Stomee extern jclass g_process_jc;
3371449Stomee extern jmethodID g_procinit_jm;
3381449Stomee extern jmethodID g_procexit_jm;
3391449Stomee 
3401449Stomee /* Aggregate */
3411449Stomee extern jclass g_agg_jc;
3421449Stomee extern jmethodID g_agginit_jm;
3431449Stomee extern jmethodID g_aggaddrec_jm;
3441449Stomee 
3451449Stomee /* AggregateSpec */
3461449Stomee extern jclass g_aggspec_jc;
3471449Stomee extern jmethodID g_aggspec_included_jm;
3481449Stomee extern jmethodID g_aggspec_cleared_jm;
3491449Stomee 
3501449Stomee /* Tuple */
3511449Stomee extern jclass g_tuple_jc;
3521449Stomee extern jmethodID g_tupleinit_jm;
3531449Stomee extern jmethodID g_tupleadd_jm;
3541449Stomee extern jmethodID g_tuplesize_jm;
3551449Stomee extern jfieldID g_tuple_EMPTY_jsf;
3561449Stomee 
3571449Stomee /* AggregationRecord */
3581449Stomee extern jclass g_aggrec_jc;
3591449Stomee extern jmethodID g_aggrecinit_jm;
3601449Stomee extern jmethodID g_aggrecget_tuple_jm;
3611449Stomee 
3621449Stomee /* SumValue */
3631449Stomee extern jclass g_aggsum_jc;
3641449Stomee extern jmethodID g_aggsuminit_jm;
3651449Stomee 
3661449Stomee /* CountValue */
3671449Stomee extern jclass g_aggcount_jc;
3681449Stomee extern jmethodID g_aggcountinit_jm;
3691449Stomee 
3701449Stomee /* AvgValue */
3711449Stomee extern jclass g_aggavg_jc;
3721449Stomee extern jmethodID g_aggavginit_jm;
3731449Stomee 
3741449Stomee /* MinValue */
3751449Stomee extern jclass g_aggmin_jc;
3761449Stomee extern jmethodID g_aggmininit_jm;
3771449Stomee 
3781449Stomee /* MaxValue */
3791449Stomee extern jclass g_aggmax_jc;
3801449Stomee extern jmethodID g_aggmaxinit_jm;
3811449Stomee 
382*6136Stomee /* StddevValue */
383*6136Stomee extern jclass g_aggstddev_jc;
384*6136Stomee extern jmethodID g_aggstddevinit_jm;
385*6136Stomee 
3861449Stomee /* KernelStackRecord */
3871449Stomee extern jclass g_stack_jc;
3881449Stomee extern jmethodID g_parsestack_jsm;
3891449Stomee extern jmethodID g_stackinit_jm;
3901449Stomee extern jmethodID g_stackset_frames_jm;
3911449Stomee 
3921449Stomee /* UserStackRecord */
3931449Stomee extern jclass g_ustack_jc;
3941449Stomee extern jmethodID g_ustackinit_jm;
3951449Stomee extern jmethodID g_ustackset_frames_jm;
3961449Stomee 
3971449Stomee /* Distribution */
3981449Stomee extern jclass g_adist_jc;
3991449Stomee extern jmethodID g_dist_normal_jm;
4001449Stomee 
4011449Stomee /* LogDistribution */
4021449Stomee extern jclass g_dist_jc;
4031449Stomee extern jmethodID g_distinit_jm;
4041449Stomee 
4051449Stomee /* LinearDistribution */
4061449Stomee extern jclass g_ldist_jc;
4071449Stomee extern jmethodID g_ldistinit_jm;
4081449Stomee 
4092777Stomee /* KernelSymbolRecord */
4102777Stomee extern jclass g_symbol_jc;
4112777Stomee extern jmethodID g_symbolinit_jm;
4122777Stomee extern jmethodID g_symbolset_name_jm;
4132777Stomee 
4142777Stomee /* UserSymbolRecord */
4152777Stomee extern jclass g_usymbol_jc;
4162777Stomee extern jmethodID g_usymbolinit_jm;
4172777Stomee extern jmethodID g_usymbolset_name_jm;
4182777Stomee 
4192777Stomee /* ScalarRecord */
4202777Stomee extern jclass g_scalar_jc;
4212777Stomee extern jmethodID g_scalarinit_jm;
4222777Stomee 
4231449Stomee /*
4241449Stomee  * Populates the java class references and associated method and field IDs
4251449Stomee  * declared in this file (above).
4261449Stomee  *
4271449Stomee  * Throws NoClassDefFoundError, NoSuchMethodError, or NoSuchFieldError if any
4281449Stomee  * dtj_table_entry_t in dtj_jnitab.c is incorrect.
4291449Stomee  */
4301449Stomee extern dtj_status_t dtj_load(JNIEnv *);
4311449Stomee 
4321449Stomee /*
4331449Stomee  * Functions that create a structure return NULL if out of memory.  A Java
4341449Stomee  * OutOfMemoryError is pending in that case.
4351449Stomee  */
4361449Stomee extern dtj_request_t *dtj_request_create(JNIEnv *, dtj_request_type_t, ...);
4371449Stomee extern dtj_program_t *dtj_program_create(JNIEnv *, dtj_program_type_t,
4381449Stomee     const char *);
4391449Stomee extern dtj_aggval_t *dtj_aggval_create(JNIEnv *, jobject, const char *,
4401449Stomee     int64_t);
4411449Stomee 
4421449Stomee /*
4431449Stomee  * uu_list_t element destructors' signatures match uuwrap_value_destroy_f
4441449Stomee  */
4451449Stomee extern void dtj_request_destroy(void *, void *); /* expects NULL user arg */
4461449Stomee extern void dtj_program_destroy(void *, void *); /* expects NULL user arg */
4471449Stomee extern void dtj_aggval_destroy(void *, void *);	/* expects JNIEnv * user arg */
4481449Stomee 
4491449Stomee /* Allocates and frees per-consumer state kept in the global consumer table */
4501449Stomee extern dtj_consumer_t *dtj_consumer_create(JNIEnv *);
4511449Stomee extern void dtj_consumer_destroy(dtj_consumer_t *);
4521449Stomee 
4531449Stomee /* Sets callback handlers before calling dtrace_go() */
4541449Stomee extern dtj_status_t dtj_set_callback_handlers(dtj_java_consumer_t *);
4551449Stomee 
4561449Stomee /*
4571449Stomee  * Initializes Java Object references cached across multiple functions called
4581449Stomee  * within the consumer loop.  Deletes the references after exiting the consumer
4591449Stomee  * loop.  It is only necessary to initialize and finalize a dtj_java_consumer_t
4601449Stomee  * if the native method call will enter the consumer loop.
4611449Stomee  */
4621449Stomee extern dtj_status_t dtj_java_consumer_init(JNIEnv *, dtj_java_consumer_t *);
4631449Stomee extern void dtj_java_consumer_fini(JNIEnv *, dtj_java_consumer_t *);
4641449Stomee 
4651449Stomee /*
4661449Stomee  * Throws a DTraceException with a message constructed from the given format
4671449Stomee  * string and variable arg list.
4681449Stomee  */
4691449Stomee extern void dtj_throw_dtrace_exception(dtj_java_consumer_t *,
4701449Stomee     const char *, ...);
4711449Stomee 
4721449Stomee /* Returns NULL if pending Java Exception or OutOfMemoryError */
4731449Stomee extern jobject dtj_new_probedesc(dtj_java_consumer_t *,
4741449Stomee     const dtrace_probedesc_t *);
4751449Stomee extern jobject dtj_new_probeinfo(dtj_java_consumer_t *,
4761449Stomee     const dtrace_probeinfo_t *);
4771449Stomee extern jobject dtj_new_attribute(dtj_java_consumer_t *,
4781449Stomee     const dtrace_attribute_t *);
4791449Stomee 
4801449Stomee /*
4811449Stomee  * Returns NULL if the given fault is unrecognized, otherwise returns the name
4821449Stomee  * of the fault, guaranteed not to change across multiple versions of this API
4831449Stomee  * even if the integer value changes in libdtrace.
4841449Stomee  */
4851449Stomee extern const char *dtj_get_fault_name(int);
4861449Stomee 
4871449Stomee /* Gets the libdtrace error number and message */
4881449Stomee extern dtj_status_t dtj_get_dtrace_error(dtj_java_consumer_t *, dtj_error_t *);
4891449Stomee 
4901449Stomee /* Stops the DTrace consumer */
4911449Stomee extern void dtj_stop(dtj_java_consumer_t *);
4921449Stomee 
4931449Stomee /*
4941449Stomee  * The Consumer getAggregate() method runs in the caller's current thread
4951449Stomee  * separate from the consumer loop.
4961449Stomee  */
4971449Stomee extern jobject dtj_get_aggregate(dtj_java_consumer_t *);
4981449Stomee 
4991449Stomee /*
5001449Stomee  * A blocking call that runs the consumer loop.  If this function returns an
5011449Stomee  * error status, it is necessary to call stop() in order to dtrace_stop() the
5021449Stomee  * consumer in libdtrace (it is safe to call stop() in either case).
5031449Stomee  */
5041449Stomee extern dtj_status_t dtj_consume(dtj_java_consumer_t *);
5051449Stomee 
5061449Stomee #ifdef	__cplusplus
5071449Stomee }
5081449Stomee #endif
5091449Stomee 
5101449Stomee #endif	/* _DTRACE_JNI_H */
511