fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER START
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The contents of this file are subject to the terms of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Common Development and Distribution License (the "License").
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You may not use this file except in compliance with the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * or http://www.opensolaris.org/os/licensing.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * See the License for the specific language governing permissions
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and limitations under the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * When distributing Covered Code, include this CDDL HEADER in each
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If applicable, add the following below this CDDL HEADER, with the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * fields enclosed by brackets "[]" replaced with your own identifying
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * information: Portions Copyright [yyyy] [name of copyright owner]
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER END
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
e77b06d21580f630e0a7c437495ab283d3672828tomee * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Use is subject to license terms.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#ifndef _DTRACE_JNI_H
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define _DTRACE_JNI_H
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <libuutil.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <jni.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <dtrace.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <dtj_util.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#ifdef __cplusplus
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern "C" {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#endif
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Java DTrace API native library */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Thread-specific data key used to obtain JNI state specific to either the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * consumer loop (calls dtrace_work()) or the getAggregate() method (calls
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_aggregate_print()).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern pthread_key_t g_dtj_consumer_key;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef enum dtj_consumer_state {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_CONSUMER_INIT,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_CONSUMER_GO,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_CONSUMER_START,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_CONSUMER_STOP
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_consumer_state_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct dtj_error {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int dtje_number; /* dtrace_errno() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *dtje_message; /* dtrace_errmsg() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_error_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Identifies which function should handle a request dequeued after
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_sleep().
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef enum dtj_request_type {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_REQUEST_OPTION /* set DTrace runtime option */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_request_type_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * A request made from Java (by native method call) that is unsafe to process
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * until just after the consumer loop wakes up from dtrace_sleep().
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct dtj_request {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_request_type_t dtjr_type; /* request handler ID */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *dtjr_args; /* string args to request handler */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_t dtjr_node; /* points to next and prev requests */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_request_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef enum dtj_program_type {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_PROGRAM_NONE,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_PROGRAM_STRING, /* dtrace_program_strcompile() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_PROGRAM_FILE /* dtrace_program_fcompile() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_program_type_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Identifier and description of a compiled DTrace program */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct dtj_program {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_type_t dtjp_type; /* string or file */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *dtjp_name; /* string or filename for err msg */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_prog_t *dtjp_program; /* libdtrace program handle */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proginfo_t dtjp_info; /* program attributes */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t dtjp_enabled; /* dtrace_program_exec() flag */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_t dtjp_node; /* points to next and prev programs */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_program_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * An entry used to maintain the association between the value of an aggregating
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * action (such as count()) and the aggregation to which the value belongs until
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * all the data associated with a single tuple is available to the callback
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * handler.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct dtj_aggval {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtja_value; /* value of aggregating action */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *dtja_aggname; /* aggregation name */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int64_t dtja_aggid; /* libdtrace aggregation ID */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_t dtja_node; /* points to next and prev aggvals */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_aggval_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Per-consumer state, including the libdtrace consumer handle, is valid across
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * multiple threads. One consumer entry is added to a global table per
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_open().
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct dtj_consumer {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Consumer state */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtjc_dtp; /* libdtrace consumer handle */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *dtjc_program_list; /* program_t list */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *dtjc_process_list; /* proc handle list */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Count of processes that have ended. The consumer is stopped when
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * this count equals the number of outstanding target processes and
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * grabbed processes (see the Java Consumer createProcess() and
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * grabProcess() methods).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int dtjc_procs_ended;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Bit-field passed to dtrace_program_strcompile() and
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_program_fcompile() containing compile flags. The flags are
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * set from Java by the setOption() Consumer method (just like the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * runtime options handled by dtrace_setopt(), except that they must be
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * set before program compilation to have any effect).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uint_t dtjc_cflags;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t dtjc_flow; /* current value of the flowindent option */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_state_t dtjc_state; /* execution state */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t dtjc_interrupt; /* flag that stops consumer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Pending requests */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *dtjc_request_list; /* request_t queue */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pthread_mutex_t dtjc_request_list_lock;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Cached for optimization and for use across functions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Nanosecond timestamp cached in the consumer loop just before
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_work(). The timestamp is applied to each Java PrintaRecord
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * generated in that iteration of the consumer loop. A value of zero
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * indicates that we are not in the consumer loop, but that the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * callback was triggered instead by the Consumer getAggregate() method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * (from dtrace_aggregate_print()).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee hrtime_t dtjc_printa_snaptime;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The aggregation ID is used to optimize aggregation inclusion by
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * testing for inclusion only when the aggregation has changed.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int64_t dtjc_aggid;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t dtjc_included;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The expected tuple member count is used to determine whether or not
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * the aggregation tuple values are completely specified in the printa()
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * format string.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int dtjc_expected;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int dtjc_probedata_rec_i; /* probe data record index */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The current DTrace action may apply across multiple libdtrace probe
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * data records.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_actkind_t dtjc_probedata_act;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Placeholder used when listing probes */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_ecbdesc_t *dtjc_last_probe;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Function used by statement iterator when listing probes */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probe_f *dtjc_plistfunc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_consumer_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * A view of a dtj_consumer_t that lasts only as long as a single native method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * call. This view attaches state needed for interaction with Java and specific
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * to the JNI.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct dtj_java_consumer {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Per-consumer state in global consumer table */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t *dtjj_consumer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *dtjj_jenv; /* Java environment pointer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_caller; /* Java Consumer to call back with probe data */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Java Object references used across function boundaries, valid only
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * within the current native method call.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_probedata; /* instance of class ProbeData */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * StringBuffer used to concatenate buffered printa() output associated
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * with the current tuple.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_printa_buffer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_aggregate; /* instance of class Aggregate */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_tuple; /* instance of class Tuple */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * AggregationValue instances cached until we receive the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * DTRACE_BUFDATA_AGGLAST flag indicating the last callback associated
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * with the current tuple.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *dtjj_aggval_list;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* AggregateSpec used by get_aggregate() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_aggregate_spec;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_probelist; /* java.util.List returned by listProbes() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Exception temporarily cleared by callback handlers who cannot return
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * a signal to abort the consumer. At a safe point when the consumer
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * loop gets control back from libdtrace, the exception is rethrown.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jthrowable dtjj_exception;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject dtjj_consumer_lock; /* per-consumer lock */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee} dtj_java_consumer_t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Cache of jclass, jmethodID, and jfieldID values, usable across multiple
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * native method calls and multiple threads. Caching all of them up front
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * rather than as-needed guarantees early detection of incorrect class, method,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * or field definitions, and eliminates the need for test cases to cover
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * seldom-used definitions.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Suffix conventions:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * jc java class
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * jm java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * jsm java static method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * jf java field
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * jsf java static field
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* LocalConsumer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_caller_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_gethandle_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_sethandle_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdatanext_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_drop_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_error_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_proc_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_interval_began_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_interval_ended_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jfieldID g_consumer_lock_jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* DTraceException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_dtx_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_dtxinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* InterfaceAttributes */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_attr_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_attrinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_attrset_name_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_attrset_data_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_attrset_class_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ProbeDescription */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_probedesc_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_probedescinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jfieldID g_probedesc_id_jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ProbeInfo */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_probeinfo_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_probeinfoinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Probe */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_probe_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_probeinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Program */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_program_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_proginit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jfieldID g_progid_jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jfieldID g_proginfo_jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Program.File */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_programfile_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_fproginit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ProgramInfo */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_proginfo_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_proginfoinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Flow */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_flow_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_flowinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ProbeData */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_pdata_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdatainit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_rec_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_trace_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_stack_jm;
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jmethodID g_pdataadd_symbol_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_printf_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_printa_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdatainvalidate_printa_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_aggrec_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_printa_str_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataadd_exit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataattach_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataset_formatted_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_pdataclear_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Drop */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_drop_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_dropinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Error */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_error_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_errinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ProcessState */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_process_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_procinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_procexit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Aggregate */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_agg_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_agginit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggaddrec_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* AggregateSpec */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggspec_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggspec_included_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggspec_cleared_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Tuple */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_tuple_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_tupleinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_tupleadd_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_tuplesize_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jfieldID g_tuple_EMPTY_jsf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* AggregationRecord */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggrec_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggrecinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggrecget_tuple_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* SumValue */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggsum_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggsuminit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* CountValue */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggcount_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggcountinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* AvgValue */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggavg_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggavginit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* MinValue */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggmin_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggmininit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* MaxValue */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_aggmax_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_aggmaxinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomee/* StddevValue */
e77b06d21580f630e0a7c437495ab283d3672828tomeeextern jclass g_aggstddev_jc;
e77b06d21580f630e0a7c437495ab283d3672828tomeeextern jmethodID g_aggstddevinit_jm;
e77b06d21580f630e0a7c437495ab283d3672828tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* KernelStackRecord */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_stack_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_parsestack_jsm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_stackinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_stackset_frames_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* UserStackRecord */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_ustack_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_ustackinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_ustackset_frames_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Distribution */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_adist_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_dist_normal_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* LogDistribution */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_dist_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_distinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe/* LogLinearDistribution */
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Loweextern jclass g_lldist_jc;
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Loweextern jmethodID g_lldistinit_jm;
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* LinearDistribution */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jclass g_ldist_jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jmethodID g_ldistinit_jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee/* KernelSymbolRecord */
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jclass g_symbol_jc;
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jmethodID g_symbolinit_jm;
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jmethodID g_symbolset_name_jm;
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee/* UserSymbolRecord */
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jclass g_usymbol_jc;
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jmethodID g_usymbolinit_jm;
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jmethodID g_usymbolset_name_jm;
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee/* ScalarRecord */
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jclass g_scalar_jc;
127bbe13a6d36580af6a8ded154f1201a6250772tomeeextern jmethodID g_scalarinit_jm;
127bbe13a6d36580af6a8ded154f1201a6250772tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Populates the java class references and associated method and field IDs
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * declared in this file (above).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Throws NoClassDefFoundError, NoSuchMethodError, or NoSuchFieldError if any
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtj_table_entry_t in dtj_jnitab.c is incorrect.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_status_t dtj_load(JNIEnv *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Functions that create a structure return NULL if out of memory. A Java
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * OutOfMemoryError is pending in that case.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_request_t *dtj_request_create(JNIEnv *, dtj_request_type_t, ...);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_program_t *dtj_program_create(JNIEnv *, dtj_program_type_t,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_aggval_t *dtj_aggval_create(JNIEnv *, jobject, const char *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int64_t);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * uu_list_t element destructors' signatures match uuwrap_value_destroy_f
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_request_destroy(void *, void *); /* expects NULL user arg */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_program_destroy(void *, void *); /* expects NULL user arg */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_aggval_destroy(void *, void *); /* expects JNIEnv * user arg */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Allocates and frees per-consumer state kept in the global consumer table */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_consumer_t *dtj_consumer_create(JNIEnv *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_consumer_destroy(dtj_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Sets callback handlers before calling dtrace_go() */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_status_t dtj_set_callback_handlers(dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Initializes Java Object references cached across multiple functions called
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * within the consumer loop. Deletes the references after exiting the consumer
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * loop. It is only necessary to initialize and finalize a dtj_java_consumer_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * if the native method call will enter the consumer loop.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_status_t dtj_java_consumer_init(JNIEnv *, dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_java_consumer_fini(JNIEnv *, dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Throws a DTraceException with a message constructed from the given format
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * string and variable arg list.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_throw_dtrace_exception(dtj_java_consumer_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *, ...);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Returns NULL if pending Java Exception or OutOfMemoryError */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jobject dtj_new_probedesc(dtj_java_consumer_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtrace_probedesc_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jobject dtj_new_probeinfo(dtj_java_consumer_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtrace_probeinfo_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jobject dtj_new_attribute(dtj_java_consumer_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtrace_attribute_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns NULL if the given fault is unrecognized, otherwise returns the name
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * of the fault, guaranteed not to change across multiple versions of this API
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * even if the integer value changes in libdtrace.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern const char *dtj_get_fault_name(int);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Gets the libdtrace error number and message */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_status_t dtj_get_dtrace_error(dtj_java_consumer_t *, dtj_error_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Stops the DTrace consumer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void dtj_stop(dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The Consumer getAggregate() method runs in the caller's current thread
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * separate from the consumer loop.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern jobject dtj_get_aggregate(dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * A blocking call that runs the consumer loop. If this function returns an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * error status, it is necessary to call stop() in order to dtrace_stop() the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * consumer in libdtrace (it is safe to call stop() in either case).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern dtj_status_t dtj_consume(dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#ifdef __cplusplus
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#endif
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#endif /* _DTRACE_JNI_H */