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