xref: /titanic_51/usr/src/lib/libdtrace_jni/common/dtrace_jni.h (revision ae94d716ff8759d2dc2de680b5b85a291219a4c1)
1fb3fb4f3Stomee /*
2fb3fb4f3Stomee  * CDDL HEADER START
3fb3fb4f3Stomee  *
4fb3fb4f3Stomee  * The contents of this file are subject to the terms of the
5fb3fb4f3Stomee  * Common Development and Distribution License (the "License").
6fb3fb4f3Stomee  * You may not use this file except in compliance with the License.
7fb3fb4f3Stomee  *
8fb3fb4f3Stomee  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fb3fb4f3Stomee  * or http://www.opensolaris.org/os/licensing.
10fb3fb4f3Stomee  * See the License for the specific language governing permissions
11fb3fb4f3Stomee  * and limitations under the License.
12fb3fb4f3Stomee  *
13fb3fb4f3Stomee  * When distributing Covered Code, include this CDDL HEADER in each
14fb3fb4f3Stomee  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fb3fb4f3Stomee  * If applicable, add the following below this CDDL HEADER, with the
16fb3fb4f3Stomee  * fields enclosed by brackets "[]" replaced with your own identifying
17fb3fb4f3Stomee  * information: Portions Copyright [yyyy] [name of copyright owner]
18fb3fb4f3Stomee  *
19fb3fb4f3Stomee  * CDDL HEADER END
20fb3fb4f3Stomee  */
21fb3fb4f3Stomee 
22fb3fb4f3Stomee /*
23e77b06d2Stomee  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24fb3fb4f3Stomee  * Use is subject to license terms.
25fb3fb4f3Stomee  */
26fb3fb4f3Stomee 
27fb3fb4f3Stomee #ifndef	_DTRACE_JNI_H
28fb3fb4f3Stomee #define	_DTRACE_JNI_H
29fb3fb4f3Stomee 
30fb3fb4f3Stomee #include <libuutil.h>
31fb3fb4f3Stomee #include <jni.h>
32fb3fb4f3Stomee #include <dtrace.h>
33fb3fb4f3Stomee #include <dtj_util.h>
34fb3fb4f3Stomee 
35fb3fb4f3Stomee #ifdef	__cplusplus
36fb3fb4f3Stomee extern "C" {
37fb3fb4f3Stomee #endif
38fb3fb4f3Stomee 
39fb3fb4f3Stomee /* Java DTrace API native library */
40fb3fb4f3Stomee 
41fb3fb4f3Stomee 
42fb3fb4f3Stomee /*
43fb3fb4f3Stomee  * Thread-specific data key used to obtain JNI state specific to either the
44fb3fb4f3Stomee  * consumer loop (calls dtrace_work()) or the getAggregate() method (calls
45fb3fb4f3Stomee  * dtrace_aggregate_print()).
46fb3fb4f3Stomee  */
47fb3fb4f3Stomee extern pthread_key_t g_dtj_consumer_key;
48fb3fb4f3Stomee 
49fb3fb4f3Stomee typedef enum dtj_consumer_state {
50fb3fb4f3Stomee 	DTJ_CONSUMER_INIT,
51fb3fb4f3Stomee 	DTJ_CONSUMER_GO,
52fb3fb4f3Stomee 	DTJ_CONSUMER_START,
53fb3fb4f3Stomee 	DTJ_CONSUMER_STOP
54fb3fb4f3Stomee } dtj_consumer_state_t;
55fb3fb4f3Stomee 
56fb3fb4f3Stomee typedef struct dtj_error {
57fb3fb4f3Stomee 	int dtje_number;		/* dtrace_errno() */
58fb3fb4f3Stomee 	const char *dtje_message;	/* dtrace_errmsg() */
59fb3fb4f3Stomee } dtj_error_t;
60fb3fb4f3Stomee 
61fb3fb4f3Stomee /*
62fb3fb4f3Stomee  * Identifies which function should handle a request dequeued after
63fb3fb4f3Stomee  * dtrace_sleep().
64fb3fb4f3Stomee  */
65fb3fb4f3Stomee typedef enum dtj_request_type {
66fb3fb4f3Stomee 	DTJ_REQUEST_OPTION		/* set DTrace runtime option */
67fb3fb4f3Stomee } dtj_request_type_t;
68fb3fb4f3Stomee 
69fb3fb4f3Stomee /*
70fb3fb4f3Stomee  * A request made from Java (by native method call) that is unsafe to process
71fb3fb4f3Stomee  * until just after the consumer loop wakes up from dtrace_sleep().
72fb3fb4f3Stomee  */
73fb3fb4f3Stomee typedef struct dtj_request {
74fb3fb4f3Stomee 	dtj_request_type_t dtjr_type;	/* request handler ID */
75fb3fb4f3Stomee 	uu_list_t *dtjr_args;		/* string args to request handler */
76fb3fb4f3Stomee 	uu_list_node_t dtjr_node;	/* points to next and prev requests */
77fb3fb4f3Stomee } dtj_request_t;
78fb3fb4f3Stomee 
79fb3fb4f3Stomee typedef enum dtj_program_type {
80fb3fb4f3Stomee 	DTJ_PROGRAM_NONE,
81fb3fb4f3Stomee 	DTJ_PROGRAM_STRING,		/* dtrace_program_strcompile() */
82fb3fb4f3Stomee 	DTJ_PROGRAM_FILE		/* dtrace_program_fcompile() */
83fb3fb4f3Stomee } dtj_program_type_t;
84fb3fb4f3Stomee 
85fb3fb4f3Stomee /* Identifier and description of a compiled DTrace program */
86fb3fb4f3Stomee typedef struct dtj_program {
87fb3fb4f3Stomee 	dtj_program_type_t dtjp_type;	/* string or file */
88fb3fb4f3Stomee 	const char *dtjp_name;		/* string or filename for err msg */
89fb3fb4f3Stomee 	dtrace_prog_t *dtjp_program;	/* libdtrace program handle */
90fb3fb4f3Stomee 	dtrace_proginfo_t dtjp_info;	/* program attributes */
91fb3fb4f3Stomee 	boolean_t dtjp_enabled;		/* dtrace_program_exec() flag */
92fb3fb4f3Stomee 	uu_list_node_t dtjp_node;	/* points to next and prev programs */
93fb3fb4f3Stomee } dtj_program_t;
94fb3fb4f3Stomee 
95fb3fb4f3Stomee /*
96fb3fb4f3Stomee  * An entry used to maintain the association between the value of an aggregating
97fb3fb4f3Stomee  * action (such as count()) and the aggregation to which the value belongs until
98fb3fb4f3Stomee  * all the data associated with a single tuple is available to the callback
99fb3fb4f3Stomee  * handler.
100fb3fb4f3Stomee  */
101fb3fb4f3Stomee typedef struct dtj_aggval {
102fb3fb4f3Stomee 	jobject dtja_value;		/* value of aggregating action */
103fb3fb4f3Stomee 	const char *dtja_aggname;	/* aggregation name */
104fb3fb4f3Stomee 	int64_t dtja_aggid;		/* libdtrace aggregation ID */
105fb3fb4f3Stomee 	uu_list_node_t dtja_node;	/* points to next and prev aggvals */
106fb3fb4f3Stomee } dtj_aggval_t;
107fb3fb4f3Stomee 
108fb3fb4f3Stomee /*
109fb3fb4f3Stomee  * Per-consumer state, including the libdtrace consumer handle, is valid across
110fb3fb4f3Stomee  * multiple threads.  One consumer entry is added to a global table per
111fb3fb4f3Stomee  * dtrace_open().
112fb3fb4f3Stomee  */
113fb3fb4f3Stomee typedef struct dtj_consumer {
114fb3fb4f3Stomee 	/* Consumer state */
115fb3fb4f3Stomee 
116fb3fb4f3Stomee 	dtrace_hdl_t *dtjc_dtp;		/* libdtrace consumer handle */
117fb3fb4f3Stomee 	uu_list_t *dtjc_program_list;	/* program_t list */
118fb3fb4f3Stomee 	uu_list_t *dtjc_process_list;	/* proc handle list */
119fb3fb4f3Stomee 
120fb3fb4f3Stomee 	/*
121fb3fb4f3Stomee 	 * Count of processes that have ended.  The consumer is stopped when
122fb3fb4f3Stomee 	 * this count equals the number of outstanding target processes and
123fb3fb4f3Stomee 	 * grabbed processes (see the Java Consumer createProcess() and
124fb3fb4f3Stomee 	 * grabProcess() methods).
125fb3fb4f3Stomee 	 */
126fb3fb4f3Stomee 	int dtjc_procs_ended;
127fb3fb4f3Stomee 
128fb3fb4f3Stomee 	/*
129fb3fb4f3Stomee 	 * Bit-field passed to dtrace_program_strcompile() and
130fb3fb4f3Stomee 	 * dtrace_program_fcompile() containing compile flags.  The flags are
131fb3fb4f3Stomee 	 * set from Java by the setOption() Consumer method (just like the
132fb3fb4f3Stomee 	 * runtime options handled by dtrace_setopt(), except that they must be
133fb3fb4f3Stomee 	 * set before program compilation to have any effect).
134fb3fb4f3Stomee 	 */
135fb3fb4f3Stomee 	uint_t dtjc_cflags;
136fb3fb4f3Stomee 
137fb3fb4f3Stomee 	boolean_t dtjc_flow;	/* current value of the flowindent option */
138fb3fb4f3Stomee 	dtj_consumer_state_t dtjc_state; /* execution state */
139fb3fb4f3Stomee 	boolean_t dtjc_interrupt;	/* flag that stops consumer */
140fb3fb4f3Stomee 
141fb3fb4f3Stomee 	/* Pending requests */
142fb3fb4f3Stomee 	uu_list_t *dtjc_request_list;	/* request_t queue */
143fb3fb4f3Stomee 	pthread_mutex_t dtjc_request_list_lock;
144fb3fb4f3Stomee 
145fb3fb4f3Stomee 
146fb3fb4f3Stomee 	/* Cached for optimization and for use across functions */
147fb3fb4f3Stomee 
148fb3fb4f3Stomee 	/*
149fb3fb4f3Stomee 	 * Nanosecond timestamp cached in the consumer loop just before
150fb3fb4f3Stomee 	 * dtrace_work().  The timestamp is applied to each Java PrintaRecord
151fb3fb4f3Stomee 	 * generated in that iteration of the consumer loop.  A value of zero
152fb3fb4f3Stomee 	 * indicates that we are not in the consumer loop, but that the
153fb3fb4f3Stomee 	 * callback was triggered instead by the Consumer getAggregate() method
154fb3fb4f3Stomee 	 * (from dtrace_aggregate_print()).
155fb3fb4f3Stomee 	 */
156fb3fb4f3Stomee 	hrtime_t dtjc_printa_snaptime;
157fb3fb4f3Stomee 
158fb3fb4f3Stomee 	/*
159fb3fb4f3Stomee 	 * The aggregation ID is used to optimize aggregation inclusion by
160fb3fb4f3Stomee 	 * testing for inclusion only when the aggregation has changed.
161fb3fb4f3Stomee 	 */
162fb3fb4f3Stomee 	int64_t dtjc_aggid;
163fb3fb4f3Stomee 	boolean_t dtjc_included;
164fb3fb4f3Stomee 
165fb3fb4f3Stomee 	/*
166fb3fb4f3Stomee 	 * The expected tuple member count is used to determine whether or not
167fb3fb4f3Stomee 	 * the aggregation tuple values are completely specified in the printa()
168fb3fb4f3Stomee 	 * format string.
169fb3fb4f3Stomee 	 */
170fb3fb4f3Stomee 	int dtjc_expected;
171fb3fb4f3Stomee 
172fb3fb4f3Stomee 	int dtjc_probedata_rec_i;	/* probe data record index */
173fb3fb4f3Stomee 
174fb3fb4f3Stomee 	/*
175fb3fb4f3Stomee 	 * The current DTrace action may apply across multiple libdtrace probe
176fb3fb4f3Stomee 	 * data records.
177fb3fb4f3Stomee 	 */
178fb3fb4f3Stomee 	dtrace_actkind_t dtjc_probedata_act;
179fb3fb4f3Stomee 
180fb3fb4f3Stomee 	/* Placeholder used when listing probes */
181fb3fb4f3Stomee 	dtrace_ecbdesc_t *dtjc_last_probe;
182fb3fb4f3Stomee 
183fb3fb4f3Stomee 	/* Function used by statement iterator when listing probes */
184fb3fb4f3Stomee 	dtrace_probe_f *dtjc_plistfunc;
185fb3fb4f3Stomee } dtj_consumer_t;
186fb3fb4f3Stomee 
187fb3fb4f3Stomee /*
188fb3fb4f3Stomee  * A view of a dtj_consumer_t that lasts only as long as a single native method
189fb3fb4f3Stomee  * call.  This view attaches state needed for interaction with Java and specific
190fb3fb4f3Stomee  * to the JNI.
191fb3fb4f3Stomee  */
192fb3fb4f3Stomee typedef struct dtj_java_consumer {
193fb3fb4f3Stomee 	/* Per-consumer state in global consumer table */
194fb3fb4f3Stomee 	dtj_consumer_t *dtjj_consumer;
195fb3fb4f3Stomee 
196fb3fb4f3Stomee 	JNIEnv *dtjj_jenv;	/* Java environment pointer */
197fb3fb4f3Stomee 	jobject dtjj_caller;	/* Java Consumer to call back with probe data */
198fb3fb4f3Stomee 
199fb3fb4f3Stomee 	/*
200fb3fb4f3Stomee 	 * Java Object references used across function boundaries, valid only
201fb3fb4f3Stomee 	 * within the current native method call.
202fb3fb4f3Stomee 	 */
203fb3fb4f3Stomee 
204fb3fb4f3Stomee 	jobject dtjj_probedata;	/* instance of class ProbeData */
205fb3fb4f3Stomee 
206fb3fb4f3Stomee 	/*
207fb3fb4f3Stomee 	 * StringBuffer used to concatenate buffered printa() output associated
208fb3fb4f3Stomee 	 * with the current tuple.
209fb3fb4f3Stomee 	 */
210fb3fb4f3Stomee 	jobject dtjj_printa_buffer;
211fb3fb4f3Stomee 
212fb3fb4f3Stomee 	jobject dtjj_aggregate;	/* instance of class Aggregate */
213fb3fb4f3Stomee 	jobject dtjj_tuple;	/* instance of class Tuple */
214fb3fb4f3Stomee 
215fb3fb4f3Stomee 	/*
216fb3fb4f3Stomee 	 * AggregationValue instances cached until we receive the
217fb3fb4f3Stomee 	 * DTRACE_BUFDATA_AGGLAST flag indicating the last callback associated
218fb3fb4f3Stomee 	 * with the current tuple.
219fb3fb4f3Stomee 	 */
220fb3fb4f3Stomee 	uu_list_t *dtjj_aggval_list;
221fb3fb4f3Stomee 
222fb3fb4f3Stomee 	/* AggregateSpec used by get_aggregate() */
223fb3fb4f3Stomee 	jobject dtjj_aggregate_spec;
224fb3fb4f3Stomee 
225fb3fb4f3Stomee 	jobject dtjj_probelist;	/* java.util.List returned by listProbes() */
226fb3fb4f3Stomee 
227fb3fb4f3Stomee 	/*
228fb3fb4f3Stomee 	 * Exception temporarily cleared by callback handlers who cannot return
229fb3fb4f3Stomee 	 * a signal to abort the consumer.  At a safe point when the consumer
230fb3fb4f3Stomee 	 * loop gets control back from libdtrace, the exception is rethrown.
231fb3fb4f3Stomee 	 */
232fb3fb4f3Stomee 	jthrowable dtjj_exception;
233fb3fb4f3Stomee 
234fb3fb4f3Stomee 	jobject dtjj_consumer_lock; /* per-consumer lock */
235fb3fb4f3Stomee 
236fb3fb4f3Stomee } dtj_java_consumer_t;
237fb3fb4f3Stomee 
238fb3fb4f3Stomee /*
239fb3fb4f3Stomee  * Cache of jclass, jmethodID, and jfieldID values, usable across multiple
240fb3fb4f3Stomee  * native method calls and multiple threads.  Caching all of them up front
241fb3fb4f3Stomee  * rather than as-needed guarantees early detection of incorrect class, method,
242fb3fb4f3Stomee  * or field definitions, and eliminates the need for test cases to cover
243fb3fb4f3Stomee  * seldom-used definitions.
244fb3fb4f3Stomee  *
245fb3fb4f3Stomee  * Suffix conventions:
246fb3fb4f3Stomee  *   jc  java class
247fb3fb4f3Stomee  *   jm  java method
248fb3fb4f3Stomee  *   jsm java static method
249fb3fb4f3Stomee  *   jf  java field
250fb3fb4f3Stomee  *   jsf java static field
251fb3fb4f3Stomee  */
252fb3fb4f3Stomee 
253fb3fb4f3Stomee /* LocalConsumer */
254fb3fb4f3Stomee extern jclass g_caller_jc;
255fb3fb4f3Stomee extern jmethodID g_gethandle_jm;
256fb3fb4f3Stomee extern jmethodID g_sethandle_jm;
257fb3fb4f3Stomee extern jmethodID g_pdatanext_jm;
258fb3fb4f3Stomee extern jmethodID g_drop_jm;
259fb3fb4f3Stomee extern jmethodID g_error_jm;
260fb3fb4f3Stomee extern jmethodID g_proc_jm;
261fb3fb4f3Stomee extern jmethodID g_interval_began_jm;
262fb3fb4f3Stomee extern jmethodID g_interval_ended_jm;
263fb3fb4f3Stomee extern jfieldID g_consumer_lock_jf;
264fb3fb4f3Stomee 
265fb3fb4f3Stomee /* DTraceException */
266fb3fb4f3Stomee extern jclass g_dtx_jc;
267fb3fb4f3Stomee extern jmethodID g_dtxinit_jm;
268fb3fb4f3Stomee 
269fb3fb4f3Stomee /* InterfaceAttributes */
270fb3fb4f3Stomee extern jclass g_attr_jc;
271fb3fb4f3Stomee extern jmethodID g_attrinit_jm;
272fb3fb4f3Stomee extern jmethodID g_attrset_name_jm;
273fb3fb4f3Stomee extern jmethodID g_attrset_data_jm;
274fb3fb4f3Stomee extern jmethodID g_attrset_class_jm;
275fb3fb4f3Stomee 
276fb3fb4f3Stomee /* ProbeDescription */
277fb3fb4f3Stomee extern jclass g_probedesc_jc;
278fb3fb4f3Stomee extern jmethodID g_probedescinit_jm;
279fb3fb4f3Stomee extern jfieldID g_probedesc_id_jf;
280fb3fb4f3Stomee 
281fb3fb4f3Stomee /* ProbeInfo */
282fb3fb4f3Stomee extern jclass g_probeinfo_jc;
283fb3fb4f3Stomee extern jmethodID g_probeinfoinit_jm;
284fb3fb4f3Stomee 
285fb3fb4f3Stomee /* Probe */
286fb3fb4f3Stomee extern jclass g_probe_jc;
287fb3fb4f3Stomee extern jmethodID g_probeinit_jm;
288fb3fb4f3Stomee 
289fb3fb4f3Stomee /* Program */
290fb3fb4f3Stomee extern jclass g_program_jc;
291fb3fb4f3Stomee extern jmethodID g_proginit_jm;
292fb3fb4f3Stomee extern jfieldID g_progid_jf;
293fb3fb4f3Stomee extern jfieldID g_proginfo_jf;
294fb3fb4f3Stomee 
295fb3fb4f3Stomee /* Program.File */
296fb3fb4f3Stomee extern jclass g_programfile_jc;
297fb3fb4f3Stomee extern jmethodID g_fproginit_jm;
298fb3fb4f3Stomee 
299fb3fb4f3Stomee /* ProgramInfo */
300fb3fb4f3Stomee extern jclass g_proginfo_jc;
301fb3fb4f3Stomee extern jmethodID g_proginfoinit_jm;
302fb3fb4f3Stomee 
303fb3fb4f3Stomee /* Flow */
304fb3fb4f3Stomee extern jclass g_flow_jc;
305fb3fb4f3Stomee extern jmethodID g_flowinit_jm;
306fb3fb4f3Stomee 
307fb3fb4f3Stomee /* ProbeData */
308fb3fb4f3Stomee extern jclass g_pdata_jc;
309fb3fb4f3Stomee extern jmethodID g_pdatainit_jm;
310fb3fb4f3Stomee extern jmethodID g_pdataadd_jm;
311fb3fb4f3Stomee extern jmethodID g_pdataadd_rec_jm;
312fb3fb4f3Stomee extern jmethodID g_pdataadd_trace_jm;
313fb3fb4f3Stomee extern jmethodID g_pdataadd_stack_jm;
314127bbe13Stomee extern jmethodID g_pdataadd_symbol_jm;
315fb3fb4f3Stomee extern jmethodID g_pdataadd_printf_jm;
316fb3fb4f3Stomee extern jmethodID g_pdataadd_printa_jm;
317fb3fb4f3Stomee extern jmethodID g_pdatainvalidate_printa_jm;
318fb3fb4f3Stomee extern jmethodID g_pdataadd_aggrec_jm;
319fb3fb4f3Stomee extern jmethodID g_pdataadd_printa_str_jm;
320fb3fb4f3Stomee extern jmethodID g_pdataadd_exit_jm;
321fb3fb4f3Stomee extern jmethodID g_pdataattach_jm;
322fb3fb4f3Stomee extern jmethodID g_pdataset_formatted_jm;
323fb3fb4f3Stomee extern jmethodID g_pdataclear_jm;
324fb3fb4f3Stomee 
325fb3fb4f3Stomee /* Drop */
326fb3fb4f3Stomee extern jclass g_drop_jc;
327fb3fb4f3Stomee extern jmethodID g_dropinit_jm;
328fb3fb4f3Stomee 
329fb3fb4f3Stomee /* Error */
330fb3fb4f3Stomee extern jclass g_error_jc;
331fb3fb4f3Stomee extern jmethodID g_errinit_jm;
332fb3fb4f3Stomee 
333fb3fb4f3Stomee /* ProcessState */
334fb3fb4f3Stomee extern jclass g_process_jc;
335fb3fb4f3Stomee extern jmethodID g_procinit_jm;
336fb3fb4f3Stomee extern jmethodID g_procexit_jm;
337fb3fb4f3Stomee 
338fb3fb4f3Stomee /* Aggregate */
339fb3fb4f3Stomee extern jclass g_agg_jc;
340fb3fb4f3Stomee extern jmethodID g_agginit_jm;
341fb3fb4f3Stomee extern jmethodID g_aggaddrec_jm;
342fb3fb4f3Stomee 
343fb3fb4f3Stomee /* AggregateSpec */
344fb3fb4f3Stomee extern jclass g_aggspec_jc;
345fb3fb4f3Stomee extern jmethodID g_aggspec_included_jm;
346fb3fb4f3Stomee extern jmethodID g_aggspec_cleared_jm;
347fb3fb4f3Stomee 
348fb3fb4f3Stomee /* Tuple */
349fb3fb4f3Stomee extern jclass g_tuple_jc;
350fb3fb4f3Stomee extern jmethodID g_tupleinit_jm;
351fb3fb4f3Stomee extern jmethodID g_tupleadd_jm;
352fb3fb4f3Stomee extern jmethodID g_tuplesize_jm;
353fb3fb4f3Stomee extern jfieldID g_tuple_EMPTY_jsf;
354fb3fb4f3Stomee 
355fb3fb4f3Stomee /* AggregationRecord */
356fb3fb4f3Stomee extern jclass g_aggrec_jc;
357fb3fb4f3Stomee extern jmethodID g_aggrecinit_jm;
358fb3fb4f3Stomee extern jmethodID g_aggrecget_tuple_jm;
359fb3fb4f3Stomee 
360fb3fb4f3Stomee /* SumValue */
361fb3fb4f3Stomee extern jclass g_aggsum_jc;
362fb3fb4f3Stomee extern jmethodID g_aggsuminit_jm;
363fb3fb4f3Stomee 
364fb3fb4f3Stomee /* CountValue */
365fb3fb4f3Stomee extern jclass g_aggcount_jc;
366fb3fb4f3Stomee extern jmethodID g_aggcountinit_jm;
367fb3fb4f3Stomee 
368fb3fb4f3Stomee /* AvgValue */
369fb3fb4f3Stomee extern jclass g_aggavg_jc;
370fb3fb4f3Stomee extern jmethodID g_aggavginit_jm;
371fb3fb4f3Stomee 
372fb3fb4f3Stomee /* MinValue */
373fb3fb4f3Stomee extern jclass g_aggmin_jc;
374fb3fb4f3Stomee extern jmethodID g_aggmininit_jm;
375fb3fb4f3Stomee 
376fb3fb4f3Stomee /* MaxValue */
377fb3fb4f3Stomee extern jclass g_aggmax_jc;
378fb3fb4f3Stomee extern jmethodID g_aggmaxinit_jm;
379fb3fb4f3Stomee 
380e77b06d2Stomee /* StddevValue */
381e77b06d2Stomee extern jclass g_aggstddev_jc;
382e77b06d2Stomee extern jmethodID g_aggstddevinit_jm;
383e77b06d2Stomee 
384fb3fb4f3Stomee /* KernelStackRecord */
385fb3fb4f3Stomee extern jclass g_stack_jc;
386fb3fb4f3Stomee extern jmethodID g_parsestack_jsm;
387fb3fb4f3Stomee extern jmethodID g_stackinit_jm;
388fb3fb4f3Stomee extern jmethodID g_stackset_frames_jm;
389fb3fb4f3Stomee 
390fb3fb4f3Stomee /* UserStackRecord */
391fb3fb4f3Stomee extern jclass g_ustack_jc;
392fb3fb4f3Stomee extern jmethodID g_ustackinit_jm;
393fb3fb4f3Stomee extern jmethodID g_ustackset_frames_jm;
394fb3fb4f3Stomee 
395fb3fb4f3Stomee /* Distribution */
396fb3fb4f3Stomee extern jclass g_adist_jc;
397fb3fb4f3Stomee extern jmethodID g_dist_normal_jm;
398fb3fb4f3Stomee 
399fb3fb4f3Stomee /* LogDistribution */
400fb3fb4f3Stomee extern jclass g_dist_jc;
401fb3fb4f3Stomee extern jmethodID g_distinit_jm;
402fb3fb4f3Stomee 
403*ae94d716SRichard Lowe /* LogLinearDistribution */
404*ae94d716SRichard Lowe extern jclass g_lldist_jc;
405*ae94d716SRichard Lowe extern jmethodID g_lldistinit_jm;
406*ae94d716SRichard Lowe 
407fb3fb4f3Stomee /* LinearDistribution */
408fb3fb4f3Stomee extern jclass g_ldist_jc;
409fb3fb4f3Stomee extern jmethodID g_ldistinit_jm;
410fb3fb4f3Stomee 
411127bbe13Stomee /* KernelSymbolRecord */
412127bbe13Stomee extern jclass g_symbol_jc;
413127bbe13Stomee extern jmethodID g_symbolinit_jm;
414127bbe13Stomee extern jmethodID g_symbolset_name_jm;
415127bbe13Stomee 
416127bbe13Stomee /* UserSymbolRecord */
417127bbe13Stomee extern jclass g_usymbol_jc;
418127bbe13Stomee extern jmethodID g_usymbolinit_jm;
419127bbe13Stomee extern jmethodID g_usymbolset_name_jm;
420127bbe13Stomee 
421127bbe13Stomee /* ScalarRecord */
422127bbe13Stomee extern jclass g_scalar_jc;
423127bbe13Stomee extern jmethodID g_scalarinit_jm;
424127bbe13Stomee 
425fb3fb4f3Stomee /*
426fb3fb4f3Stomee  * Populates the java class references and associated method and field IDs
427fb3fb4f3Stomee  * declared in this file (above).
428fb3fb4f3Stomee  *
429fb3fb4f3Stomee  * Throws NoClassDefFoundError, NoSuchMethodError, or NoSuchFieldError if any
430fb3fb4f3Stomee  * dtj_table_entry_t in dtj_jnitab.c is incorrect.
431fb3fb4f3Stomee  */
432fb3fb4f3Stomee extern dtj_status_t dtj_load(JNIEnv *);
433fb3fb4f3Stomee 
434fb3fb4f3Stomee /*
435fb3fb4f3Stomee  * Functions that create a structure return NULL if out of memory.  A Java
436fb3fb4f3Stomee  * OutOfMemoryError is pending in that case.
437fb3fb4f3Stomee  */
438fb3fb4f3Stomee extern dtj_request_t *dtj_request_create(JNIEnv *, dtj_request_type_t, ...);
439fb3fb4f3Stomee extern dtj_program_t *dtj_program_create(JNIEnv *, dtj_program_type_t,
440fb3fb4f3Stomee     const char *);
441fb3fb4f3Stomee extern dtj_aggval_t *dtj_aggval_create(JNIEnv *, jobject, const char *,
442fb3fb4f3Stomee     int64_t);
443fb3fb4f3Stomee 
444fb3fb4f3Stomee /*
445fb3fb4f3Stomee  * uu_list_t element destructors' signatures match uuwrap_value_destroy_f
446fb3fb4f3Stomee  */
447fb3fb4f3Stomee extern void dtj_request_destroy(void *, void *); /* expects NULL user arg */
448fb3fb4f3Stomee extern void dtj_program_destroy(void *, void *); /* expects NULL user arg */
449fb3fb4f3Stomee extern void dtj_aggval_destroy(void *, void *);	/* expects JNIEnv * user arg */
450fb3fb4f3Stomee 
451fb3fb4f3Stomee /* Allocates and frees per-consumer state kept in the global consumer table */
452fb3fb4f3Stomee extern dtj_consumer_t *dtj_consumer_create(JNIEnv *);
453fb3fb4f3Stomee extern void dtj_consumer_destroy(dtj_consumer_t *);
454fb3fb4f3Stomee 
455fb3fb4f3Stomee /* Sets callback handlers before calling dtrace_go() */
456fb3fb4f3Stomee extern dtj_status_t dtj_set_callback_handlers(dtj_java_consumer_t *);
457fb3fb4f3Stomee 
458fb3fb4f3Stomee /*
459fb3fb4f3Stomee  * Initializes Java Object references cached across multiple functions called
460fb3fb4f3Stomee  * within the consumer loop.  Deletes the references after exiting the consumer
461fb3fb4f3Stomee  * loop.  It is only necessary to initialize and finalize a dtj_java_consumer_t
462fb3fb4f3Stomee  * if the native method call will enter the consumer loop.
463fb3fb4f3Stomee  */
464fb3fb4f3Stomee extern dtj_status_t dtj_java_consumer_init(JNIEnv *, dtj_java_consumer_t *);
465fb3fb4f3Stomee extern void dtj_java_consumer_fini(JNIEnv *, dtj_java_consumer_t *);
466fb3fb4f3Stomee 
467fb3fb4f3Stomee /*
468fb3fb4f3Stomee  * Throws a DTraceException with a message constructed from the given format
469fb3fb4f3Stomee  * string and variable arg list.
470fb3fb4f3Stomee  */
471fb3fb4f3Stomee extern void dtj_throw_dtrace_exception(dtj_java_consumer_t *,
472fb3fb4f3Stomee     const char *, ...);
473fb3fb4f3Stomee 
474fb3fb4f3Stomee /* Returns NULL if pending Java Exception or OutOfMemoryError */
475fb3fb4f3Stomee extern jobject dtj_new_probedesc(dtj_java_consumer_t *,
476fb3fb4f3Stomee     const dtrace_probedesc_t *);
477fb3fb4f3Stomee extern jobject dtj_new_probeinfo(dtj_java_consumer_t *,
478fb3fb4f3Stomee     const dtrace_probeinfo_t *);
479fb3fb4f3Stomee extern jobject dtj_new_attribute(dtj_java_consumer_t *,
480fb3fb4f3Stomee     const dtrace_attribute_t *);
481fb3fb4f3Stomee 
482fb3fb4f3Stomee /*
483fb3fb4f3Stomee  * Returns NULL if the given fault is unrecognized, otherwise returns the name
484fb3fb4f3Stomee  * of the fault, guaranteed not to change across multiple versions of this API
485fb3fb4f3Stomee  * even if the integer value changes in libdtrace.
486fb3fb4f3Stomee  */
487fb3fb4f3Stomee extern const char *dtj_get_fault_name(int);
488fb3fb4f3Stomee 
489fb3fb4f3Stomee /* Gets the libdtrace error number and message */
490fb3fb4f3Stomee extern dtj_status_t dtj_get_dtrace_error(dtj_java_consumer_t *, dtj_error_t *);
491fb3fb4f3Stomee 
492fb3fb4f3Stomee /* Stops the DTrace consumer */
493fb3fb4f3Stomee extern void dtj_stop(dtj_java_consumer_t *);
494fb3fb4f3Stomee 
495fb3fb4f3Stomee /*
496fb3fb4f3Stomee  * The Consumer getAggregate() method runs in the caller's current thread
497fb3fb4f3Stomee  * separate from the consumer loop.
498fb3fb4f3Stomee  */
499fb3fb4f3Stomee extern jobject dtj_get_aggregate(dtj_java_consumer_t *);
500fb3fb4f3Stomee 
501fb3fb4f3Stomee /*
502fb3fb4f3Stomee  * A blocking call that runs the consumer loop.  If this function returns an
503fb3fb4f3Stomee  * error status, it is necessary to call stop() in order to dtrace_stop() the
504fb3fb4f3Stomee  * consumer in libdtrace (it is safe to call stop() in either case).
505fb3fb4f3Stomee  */
506fb3fb4f3Stomee extern dtj_status_t dtj_consume(dtj_java_consumer_t *);
507fb3fb4f3Stomee 
508fb3fb4f3Stomee #ifdef	__cplusplus
509fb3fb4f3Stomee }
510fb3fb4f3Stomee #endif
511fb3fb4f3Stomee 
512fb3fb4f3Stomee #endif	/* _DTRACE_JNI_H */
513