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