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#pragma ident "%Z%%M% %I% %E% SMI"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stdio.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <errno.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <string.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stdlib.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <unistd.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <libgen.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <assert.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <strings.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <libproc.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <pthread.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <dtrace_jni.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* generated by javah */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <LocalConsumer.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_jni.c defines all the native methods of the Java DTrace API. Every
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * native method is declared in a single class, LocalConsumer.java.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Notes:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The data generating loop must explicitly release every object reference it
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * obtains in order to avoid a memory leak. A local JNI object reference is not
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * automatically released until control returns to java, which never happens as
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * long as the data generating loop runs. This applies to any JNI function that
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * obtains an object reference (such as CallObjectMethod() or NewObject()). A
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * local reference is released by calling DeleteLocalRef(), which is safe to
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * call with an exception pending.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * It is important to check for an exception after calling java code from native
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * C, such as after notifying the java consumer of new data. Failure to do this
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * makes it possible for users of the interface to crash the JVM by throwing an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * exception in java code.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Some JNI functions, like GetIntField() or ReleaseStringUTFChars(), do not
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * need to be checked for exceptions.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * GetStringUTFChars() returns NULL if and only if an exception was thrown.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * It is important to stop a DTrace consumer and remove it if an exception
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * occurs. This API guarantees that a consumer is stopped automatically if it
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * throws an exception. An application running multiple DTrace consumers
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * simultaneously should be able to continue running the others normally if any
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * fail.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Calls to libdtrace are not guaranteed to be MT-safe. Even if they are
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * currently MT-safe, they are not guaranteed to remain that way. To address
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * this, a global lock (the LocalConsumer.class reference) is used around calls
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * to libdtrace. In many cases, the locking is done in java, which should be
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * indicated in this file by a comment above the function that assumes prior
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * locking. To access the same global lock from native C code, the JNI function
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * MonitorEnter() is used. Each MonitorEnter() must have a matching
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * MonitorExit() or the application will hang (all consumer threads). The
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * consumer loop and the getAggregate() method require a per-consumer lock
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * rather than a global lock; in that case the argument to MonitorEnter() and
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * MonitorExit() is the consumerLock member of the LocalConsumer, not the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * LocalConsumer itself.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee/*
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Increment the version whenever there is a change in the interface between
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Java and native code, whether from Java into native code:
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * - LocalConsumer.h (generated by javah)
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * or from native code back into Java:
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * - dtj_table_load() in dtj_jnitab.c
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * Changes to dtj_load_common() in dtj_util.c should not normally require a
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * version update, since dtj_util.c defines classes in the JDK, not classes in
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * the Java DTrace API.
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee *
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee * This version needs to match the version in LocalConsumer.java
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee */
e77b06d21580f630e0a7c437495ab283d3672828tomee#define DTRACE_JNI_VERSION 3
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define FIRST_HANDLE 0 /* sequence-generated consumer ID */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define NO_HANDLE -1
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define INITIAL_CAPACITY 8 /* initial size of consumer array */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define MAX_CAPACITY_INCREMENT 1024
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t g_dtj_load = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int g_handle_seq = NO_HANDLE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * key: caller's consumer handle (int)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * value: per-consumer data includes dtrace handle (consumer_t *)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_consumer_t **g_consumer_table = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic size_t g_consumer_capacity = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic size_t g_consumer_count = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic size_t g_max_capacity_increment = MAX_CAPACITY_INCREMENT;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic size_t g_max_consumers = 0; /* no maximum */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t g_init = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic pthread_mutex_t g_table_lock;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic pthread_mutexattr_t g_table_lock_attr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeepthread_key_t g_dtj_consumer_key;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_get_handle(JNIEnv *, jobject);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t dtj_get_java_consumer(JNIEnv *, jobject,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic const char *dtj_getexecname(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic jobject dtj_get_program_info(dtj_java_consumer_t *, dtrace_proginfo_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic jobject dtj_add_program(dtj_java_consumer_t *, dtj_program_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_flag(uint_t *, uint_t, boolean_t *, boolean_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t dtj_cflag(dtj_java_consumer_t *, const char *, boolean_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_list_probes(JNIEnv *, jobject, jobject, jobject,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probe_f *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_list_compiled_probes(JNIEnv *, jobject, jobject, jobject,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probe_f *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_list_probe(dtrace_hdl_t *, const dtrace_probedesc_t *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_list_probe_detail(dtrace_hdl_t *, const dtrace_probedesc_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_list_stmt(dtrace_hdl_t *, dtrace_prog_t *, dtrace_stmtdesc_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t dtj_add_consumer(JNIEnv *, dtj_consumer_t *, int *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_consumer_t *dtj_remove_consumer(JNIEnv *, jobject);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_consumer_t *dtj_remove_consumer_at(int);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets a sequence-generated consumer ID, or NO_HANDLE if exception pending
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_get_handle(JNIEnv *jenv, jobject caller)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int handle;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv, "JNI table not loaded");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NO_HANDLE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee handle = (*jenv)->CallIntMethod(jenv, caller, g_gethandle_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NO_HANDLE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (handle == NO_HANDLE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv, "no consumer handle");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (handle);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Populates the given java consumer created for use in the current native
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * method call. If the return value is DTJ_ERR, a java exception is pending.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Throws IllegalStateException if the caller does not have a valid handle.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Throws NoSuchElementException if the caller's handle is not in the global
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * caller table.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_get_java_consumer(JNIEnv *jenv, jobject caller, dtj_java_consumer_t *jc)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t *consumer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int handle = dtj_get_handle(jenv, caller);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (handle == NO_HANDLE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_lock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_consumer_table) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((handle >= 0) && (handle < g_consumer_capacity)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = g_consumer_table[handle];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (consumer == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_no_such_element(jenv, "consumer handle %d", handle);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Initialize java consumer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bzero(jc, sizeof (dtj_java_consumer_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Attach per-consumer data */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc->dtjj_consumer = consumer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Attach per-JNI-invocation data */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc->dtjj_caller = caller;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc->dtjj_jenv = jenv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_OK);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Adds a consumer to the global consumer table.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns B_TRUE if successful; a java exception is pending otherwise.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Postcondition: if successful, g_handle_seq is the handle of the consumer just
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * added.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_add_consumer(JNIEnv *jenv, dtj_consumer_t *c, int *seq)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int start;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_init) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_key_create(&g_dtj_consumer_key, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutexattr_init(&g_table_lock_attr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutexattr_settype(&g_table_lock_attr,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee PTHREAD_MUTEX_RECURSIVE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_init(&g_table_lock,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee &g_table_lock_attr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_init = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *seq = NO_HANDLE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_lock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_consumer_table == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_table = malloc(INITIAL_CAPACITY *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_consumer_t *));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_consumer_table) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_handle_seq = NO_HANDLE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not allocate consumer table");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bzero(g_consumer_table, (INITIAL_CAPACITY *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_consumer_t *)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_capacity = INITIAL_CAPACITY;
8162146132b0fb9b7c6dc3371ff205edc236ebfatomee } else if ((g_max_consumers > 0) && (g_consumer_count >=
8162146132b0fb9b7c6dc3371ff205edc236ebfatomee g_max_consumers)) {
8162146132b0fb9b7c6dc3371ff205edc236ebfatomee dtj_throw_resource_limit(jenv, "Too many consumers");
8162146132b0fb9b7c6dc3371ff205edc236ebfatomee (void) pthread_mutex_unlock(&g_table_lock);
8162146132b0fb9b7c6dc3371ff205edc236ebfatomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (g_consumer_count >= g_consumer_capacity) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t **t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee size_t new_capacity;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_consumer_capacity <= g_max_capacity_increment) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee new_capacity = (g_consumer_capacity * 2);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee new_capacity = (g_consumer_capacity +
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_max_capacity_increment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((g_max_consumers > 0) && (new_capacity > g_max_consumers)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee new_capacity = g_max_consumers;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee t = realloc(g_consumer_table,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee new_capacity * sizeof (dtj_consumer_t *));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!t) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not reallocate consumer table");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_table = t;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bzero(g_consumer_table + g_consumer_capacity, ((new_capacity -
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_capacity) * sizeof (dtj_consumer_t *)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_capacity = new_capacity;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Look for an empty slot in the table */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_handle_seq = (g_handle_seq == NO_HANDLE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ? FIRST_HANDLE : g_handle_seq + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_handle_seq >= g_consumer_capacity) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_handle_seq = FIRST_HANDLE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee start = g_handle_seq; /* guard against infinite loop */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (g_consumer_table[g_handle_seq] != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ++g_handle_seq;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_handle_seq == start) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv, "consumer table full,"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee " but count %d < capacity %d",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_count, g_consumer_capacity);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (g_handle_seq >= g_consumer_capacity) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_handle_seq = FIRST_HANDLE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_table[g_handle_seq] = c;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *seq = g_handle_seq;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ++g_consumer_count;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Removes a consumer from the global consumer table. The call may be initiated
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * from Java code or from native code (because an exception has occurred).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Precondition: no exception pending (any pending exception must be temporarily
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * cleared)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns NULL if the caller is not in the table or if this function throws an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * exception; either case leaves the global consumer table unchanged.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Throws IllegalStateException if the caller does not have a valid handle.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_consumer_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_remove_consumer(JNIEnv *jenv, jobject caller)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t *consumer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int handle = dtj_get_handle(jenv, caller);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (handle == NO_HANDLE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = dtj_remove_consumer_at(handle);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (consumer);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns NULL if there is no consumer with the given handle. Does not throw
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * exceptions.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_consumer_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_remove_consumer_at(int handle)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t *consumer;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_lock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_consumer_table) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((handle >= 0) && (handle < g_consumer_capacity)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = g_consumer_table[handle];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (consumer != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_table[handle] = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee --g_consumer_count;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_consumer_count == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(g_consumer_table);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_table = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_consumer_capacity = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_handle_seq = NO_HANDLE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee consumer = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (consumer);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Gets the name of the executable in case it is an application with an embedded
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * JVM and not "java". Implementation is copied from lib/mpss/common/mpss.c.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The use of static auxv_t makes the MT-level unsafe. The caller is expected
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * to use the global lock (LocalConsumer.class).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic const char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_getexecname(void)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *execname = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee static auxv_t auxb;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The first time through, read the initial aux vector that was
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * passed to the process at exec(2). Only do this once.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int fd = open("/proc/self/auxv", O_RDONLY);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (fd >= 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (read(fd, &auxb, sizeof (auxv_t)) == sizeof (auxv_t)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (auxb.a_type == AT_SUN_EXECNAME) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee execname = auxb.a_un.a_ptr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) close(fd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (execname);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Add the compiled program to a list of programs the API expects to enable.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns the Program instance identifying the listed program, or NULL if the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Program constructor fails (exception pending in that case).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic jobject
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_add_program(dtj_java_consumer_t *jc, dtj_program_t *p)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *jenv = jc->dtjj_jenv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject jprogram = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee switch (p->dtjp_type) {
e77b06d21580f630e0a7c437495ab283d3672828tomee case DTJ_PROGRAM_STRING:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprogram = (*jenv)->NewObject(jenv, g_program_jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_proginit_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
e77b06d21580f630e0a7c437495ab283d3672828tomee case DTJ_PROGRAM_FILE:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprogram = (*jenv)->NewObject(jenv, g_programfile_jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_fproginit_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
e77b06d21580f630e0a7c437495ab283d3672828tomee default:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_argument(jenv, "unexpected program type %d\n",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee p->dtjp_type);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->SetIntField(jenv, jprogram, g_progid_jf,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_numnodes(jc->dtjj_consumer->dtjc_program_list));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(jc->dtjj_consumer->dtjc_program_list, p)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jprogram);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not add program");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jprogram);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns a new ProgramInfo, or NULL if the constructor fails (java exception
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * pending in that case).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic jobject
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_get_program_info(dtj_java_consumer_t *jc, dtrace_proginfo_t *pinfo)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *jenv = jc->dtjj_jenv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject minProbeAttributes = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject minStatementAttributes = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject programInfo = NULL; /* return value */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee minProbeAttributes = dtj_new_attribute(jc, &pinfo->dpi_descattr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!minProbeAttributes) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee minStatementAttributes = dtj_new_attribute(jc, &pinfo->dpi_stmtattr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!minStatementAttributes) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, minProbeAttributes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee programInfo = (*jenv)->NewObject(jenv, g_proginfo_jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_proginfoinit_jm, minProbeAttributes, minStatementAttributes,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pinfo->dpi_matches);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, minProbeAttributes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, minStatementAttributes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (programInfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Called by LocalConsumer static initializer.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1checkVersion(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass class, jint version)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (version != DTRACE_JNI_VERSION) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "LocalConsumer version %d incompatible with native "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "implementation version %d", version, DTRACE_JNI_VERSION);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Called by LocalConsumer static initializer.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1loadJniTable(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_dtj_load) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * JNI table includes a global reference to the LocalConsumer
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * class, preventing the class from being unloaded. The
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * LocalConsumer static initializer should never execute more
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * than once.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "JNI table already loaded");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* If this fails, a Java Error (e.g. NoSuchMethodError) is pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_load(env) == DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_dtj_load = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1open(JNIEnv *env, jobject obj,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobjectArray flags)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t *c;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *f; /* flag name */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int oflags = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int i, len;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int id;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int err;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject flag = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring flagname = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "JNI table not loaded");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c = dtj_consumer_create(env);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Get open flags */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee len = (flags ? (*env)->GetArrayLength(env, flags) : 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; i < len; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee flag = (*env)->GetObjectArrayElement(env, flags, i);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee flagname = (*env)->CallObjectMethod(env, flag, g_enumname_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, flag);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f = (*env)->GetStringUTFChars(env, flagname, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, flagname);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (strcmp(f, "ILP32") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee oflags |= DTRACE_O_ILP32;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(f, "LP64") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee oflags |= DTRACE_O_LP64;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, flagname, f);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, flagname);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Check for mutually exclusive flags */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((oflags & DTRACE_O_ILP32) && (oflags & DTRACE_O_LP64)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_argument(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Cannot set both ILP32 and LP64");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Make sure we can add the consumer before calling dtrace_open().
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Repeated calls to open() when the consumer table is maxed out should
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * avoid calling dtrace_open(). (Normally there is no limit to the size
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * of the consumer table, but the undocumented JAVA_DTRACE_MAX_CONSUMERS
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * system property lets you set a limit after which
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * ResourceLimitException is thrown.)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_add_consumer(env, c, &id)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->CallVoidMethod(env, obj, g_sethandle_jm, id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) dtj_remove_consumer_at(id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((dtp = dtrace_open(DTRACE_VERSION, oflags, &err)) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_jenv = env;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc, dtrace_errmsg(NULL, err));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) dtj_remove_consumer_at(id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->dtjc_dtp = dtp; /* set consumer handle to native DTrace library */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_flag(uint_t *flags, uint_t flag, boolean_t *get, boolean_t *set)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee assert((get && !set) || (set && !get));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (get) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *get = (*flags & flag);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*set) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *flags |= flag;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *flags &= ~flag;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns B_TRUE if opt is a recognized compile flag, B_FALSE otherwise.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cflag(dtj_java_consumer_t *jc, const char *opt, boolean_t *get,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t *set)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t is_cflag = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uint_t *flags = &jc->dtjj_consumer->dtjc_cflags;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomee /* see lib/libdtrace/common/dt_options.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (strcmp(opt, "argref") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_ARGREF, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "cpp") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_CPP, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "defaultargs") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_DEFARG, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "empty") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_EMPTY, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "errtags") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_ETAGS, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "knodefs") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_KNODEF, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "nolibs") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_NOLIBS, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "pspec") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_PSPEC, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "unodefs") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_UNODEF, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "verbose") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_DIFV, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strcmp(opt, "zdefs") == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_flag(flags, DTRACE_C_ZDEFS, get, set);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee is_cflag = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (is_cflag && set &&
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jc->dtjj_consumer->dtjc_state != DTJ_CONSUMER_INIT)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jc->dtjj_jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "cannot set compile time option \"%s\" after calling go()",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (is_cflag);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (is_cflag);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jobject JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1compileString(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jstring program, jobjectArray args)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *prog;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int argc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **argv = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jprogram = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prog = (*env)->GetStringUTFChars(env, program, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee p = dtj_program_create(env, DTJ_PROGRAM_STRING, prog);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!p) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, program, prog);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (args) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv = dtj_get_argv(env, args, &argc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, program, prog);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_destroy(p, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((p->dtjp_program = dtrace_program_strcompile(dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prog, DTRACE_PROBESPEC_NAME, jc.dtjj_consumer->dtjc_cflags,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argc, argv)) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "invalid probe specifier %s: %s",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prog, dtrace_errmsg(dtp, dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, program, prog);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_destroy(p, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, program, prog);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprogram = dtj_add_program(&jc, p);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jprogram); /* NULL if exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jobject JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1compileFile(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jstring filename, jobjectArray args)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee FILE *fp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *file;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int argc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **argv = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jprogram = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee file = dtj_GetStringNativeChars(env, filename);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fp = fopen(file, "r")) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc, "failed to open %s", file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(env, filename, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee p = dtj_program_create(env, DTJ_PROGRAM_FILE, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!p) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(env, filename, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (args) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv = dtj_get_argv(env, args, &argc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(env, filename, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_destroy(p, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((p->dtjp_program = dtrace_program_fcompile(dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee fp, jc.dtjj_consumer->dtjc_cflags, argc, argv)) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "failed to compile script %s: %s", file,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errmsg(dtp, dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(env, filename, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_destroy(p, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(env, filename, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprogram = dtj_add_program(&jc, p);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jprogram); /* NULL if exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1exec(JNIEnv *env, jobject obj,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject program)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int progid = -1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proginfo_t *pinfo = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int i;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (program) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee progid = (*env)->GetIntField(env, program, g_progid_jf);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_list_empty(jc.dtjj_consumer->dtjc_program_list)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "no program compiled");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_program_list, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; (p = uu_list_walk_next(itr)) != NULL; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* enable all probes or those of given program only */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((progid != -1) && (progid != i)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (p->dtjp_enabled) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "program already enabled");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pinfo = &p->dtjp_info;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_program_exec(dtp, p->dtjp_program, pinfo) == -1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "failed to enable %s: %s", p->dtjp_name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errmsg(dtp, dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee p->dtjp_enabled = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (program) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject programInfo = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!pinfo) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Consumer.enable() has already checked that the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * program was compiled by this consumer. This is an
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * implementation error, not a user error.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "program not found");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee programInfo = dtj_get_program_info(&jc, pinfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!programInfo) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->SetObjectField(env, program, g_proginfo_jf,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee programInfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, programInfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1getProgramInfo(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jobject program)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int progid;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proginfo_t *pinfo = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int i;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject programInfo = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee progid = (*env)->GetIntField(env, program, g_progid_jf);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_list_empty(jc.dtjj_consumer->dtjc_program_list)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "no program compiled");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_program_list, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; ((p = uu_list_walk_next(itr)) != NULL) && !pinfo; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (progid != i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* get info of given program only */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pinfo = &p->dtjp_info;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_program_info(dtp, p->dtjp_program, pinfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee programInfo = dtj_get_program_info(&jc, pinfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!programInfo) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->SetObjectField(env, program, g_proginfo_jf,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee programInfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, programInfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1setOption(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jstring option, jstring value)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *opt;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *val;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t on;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee opt = (*env)->GetStringUTFChars(env, option, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!opt) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not allocate option string");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (value) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee val = (*env)->GetStringUTFChars(env, value, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!val) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not allocate option value string");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, option, opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_setopt() sets option to 0 if value is NULL. That's
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * not the same thing as unsetting a boolean option, since
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * libdtrace uses -2 to mean unset. We'll leave it to
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * LocalConsumer.java to disallow null or not.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee val = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Check for boolean compile-time options not handled by
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_setopt().
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee on = (!val || (strcmp(val, "unset") != 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_cflag(&jc, opt, NULL, &on)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, option, opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (value) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, value, val);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The transition from INIT to GO is protected by synchronization
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * (a per-consumer lock) in LocalConsumer.java, ensuring that go() and
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * setOption() execute sequentially.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jc.dtjj_consumer->dtjc_state != DTJ_CONSUMER_INIT) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If the consumer is already running, defer setting the option
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * until we wake up from dtrace_sleep.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_request_t *request;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_lock(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee &jc.dtjj_consumer->dtjc_request_list_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee request = dtj_request_create(env, DTJ_REQUEST_OPTION, opt, val);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (request) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(jc.dtjj_consumer->dtjc_request_list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee request)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add setOption request");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } /* else java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee &jc.dtjj_consumer->dtjc_request_list_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_setopt(dtp, opt, val) == -1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc, dtrace_errmsg(dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, option, opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (value) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, value, val);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jlong JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1getOption(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jstring option)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *opt;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_optval_t optval;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t cflag;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee opt = (*env)->GetStringUTFChars(env, option, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!opt) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not allocate option string");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Check for boolean compile-time options not handled by
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_setopt().
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_cflag(&jc, opt, &cflag, NULL)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, option, opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (cflag ? 1 : DTRACEOPT_UNSET);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_getopt(dtp, opt, &optval) == -1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "couldn't get option %s: %s", opt,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errmsg(dtp, dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, option, opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, option, opt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (optval);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Throws IllegalStateException if not all compiled programs are enabled.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1checkProgramEnabling(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_list_empty(jc.dtjj_consumer->dtjc_program_list)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env, "no program compiled");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_program_list, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((p = uu_list_walk_next(itr)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!p->dtjp_enabled) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *type;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee switch (p->dtjp_type) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case DTJ_PROGRAM_STRING:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee type = "description";
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case DTJ_PROGRAM_FILE:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee type = "script";
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee default:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee assert(p->dtjp_type == DTJ_PROGRAM_STRING ||
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee p->dtjp_type == DTJ_PROGRAM_FILE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Not all compiled probes are enabled. "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Compiled %s %s not enabled.",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee type, p->dtjp_name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jboolean JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1isEnabled(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (JNI_FALSE); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_list_empty(jc.dtjj_consumer->dtjc_program_list)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (JNI_FALSE); /* no program compiled */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_program_list, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((p = uu_list_walk_next(itr)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!p->dtjp_enabled) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (JNI_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (JNI_TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1go(JNIEnv *env, jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_set_callback_handlers(&jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_go(dtp) != 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not enable tracing: %s",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errmsg(dtp, dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_state = DTJ_CONSUMER_GO;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class). Called when aborting the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * consumer loop before it starts.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1stop(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_stop(dtp) == -1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "couldn't stop tracing: %s",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errmsg(jc.dtjj_consumer->dtjc_dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errno(jc.dtjj_consumer->dtjc_dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_state = DTJ_CONSUMER_STOP;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1consume(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_state = DTJ_CONSUMER_START;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_java_consumer_init(env, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Must set the thread-specific java consumer before starting the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_work() loop because the bufhandler can also be invoked by
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * getAggregate() from another thread. The bufhandler needs access to
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * the correct JNI state specific to either the consumer loop or the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * getAggregate() call.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_setspecific(g_dtj_consumer_key, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jc.dtjj_consumer->dtjc_process_list != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee struct ps_prochandle *P;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee /* Must not call MonitorEnter with a pending exception */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if ((*env)->ExceptionCheck(env)) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee dtj_java_consumer_fini(env, &jc);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee return; /* java exception pending */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->MonitorEnter(env, g_caller_jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_fini(env, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_process_list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((P = dtj_pointer_list_walk_next(itr)) !=
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_INVALID_PTR) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proc_continue(dtp, P);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->MonitorExit(env, g_caller_jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_fini(env, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Blocking call starts consumer loop.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) dtj_consume(&jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_fini(env, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Stop the consumer after the consumer loop terminates, whether
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * normally because of the exit() action or LocalConsumer.stop(), or
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * abnormally because of an exception. The call is ignored if the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * consumer is already stopped. It is safe to call dtj_stop() with a
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * pending exception.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_stop(&jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Interrupts a running consumer. May be called from any thread.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1interrupt(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_interrupt = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1close(JNIEnv *env, jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Need to release any created procs here, since the consumer_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * destructor (called by _destroy) will not have access to the dtrace
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * handle needed to release them (this function closes the dtrace
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * handle).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jc.dtjj_consumer->dtjc_process_list != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee struct ps_prochandle *P;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_process_list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((P = dtj_pointer_list_walk_next(itr)) !=
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee DTJ_INVALID_PTR) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proc_release(dtp, P);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_close(dtp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Static Consumer.java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jint JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1openCount(JNIEnv *env, jclass c)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int open;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_lock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_consumer_table == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee open = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee open = g_consumer_count;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_mutex_unlock(&g_table_lock);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (open);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Static Consumer.java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jlong JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1quantizeBucket(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass c, jint bucket)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTRACE_QUANTIZE_BUCKETVAL(bucket));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jstring JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1lookupKernelFunction(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *jenv, jobject caller, jobject address)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jfunc; /* return value */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee GElf_Addr addr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char dummy;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *s;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int rc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(jenv, caller, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->IsInstanceOf(jenv, address, g_int_jc)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* intValue() of class Number does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee addr = (GElf_Addr)(uint32_t)(*jenv)->CallIntMethod(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee address, g_intval_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if ((*jenv)->IsInstanceOf(jenv, address, g_number_jc)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* longValue() of class Number does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee addr = (GElf_Addr)(*jenv)->CallLongMethod(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee address, g_longval_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_class_cast(jenv, "Expected Number address");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee rc = dtrace_addr2str(dtp, addr, &dummy, 1);
4b65bfac5998e1c60d0a7606c2ea2d298f1d42a6tomee s = malloc(rc + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate kernel function name");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
4b65bfac5998e1c60d0a7606c2ea2d298f1d42a6tomee (void) dtrace_addr2str(dtp, addr, s, rc + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jfunc = (*jenv)->NewStringUTF(jenv, s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jfunc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock in Consumer.java
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jstring JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1lookupUserFunction(JNIEnv *jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject caller, jint pid, jobject address)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jfunc; /* return value */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee GElf_Addr addr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char dummy;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *s;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int rc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(jenv, caller, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->IsInstanceOf(jenv, address, g_int_jc)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* intValue() of class Number does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee addr = (GElf_Addr)(uint32_t)(*jenv)->CallIntMethod(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee address, g_intval_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if ((*jenv)->IsInstanceOf(jenv, address, g_number_jc)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* longValue() of class Number does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee addr = (GElf_Addr)(*jenv)->CallLongMethod(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee address, g_longval_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_class_cast(jenv, "Expected Number address");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee rc = dtrace_uaddr2str(dtp, pid, addr, &dummy, 1);
4b65bfac5998e1c60d0a7606c2ea2d298f1d42a6tomee s = malloc(rc + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate user function name");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
4b65bfac5998e1c60d0a7606c2ea2d298f1d42a6tomee (void) dtrace_uaddr2str(dtp, pid, addr, s, rc + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jfunc = (*jenv)->NewStringUTF(jenv, s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jfunc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jobject JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1getAggregate(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jobject spec)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject aggregate = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_java_consumer_init(env, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_aggregate_spec = spec;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Must set the thread-specific java consumer before calling any
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * function that triggers callbacks to the bufhandler set by
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtrace_handle_buffered(). The bufhandler needs access to the correct
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * JNI state specific to either the consumer loop or the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * getAggregate() call.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) pthread_setspecific(g_dtj_consumer_key, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee aggregate = dtj_get_aggregate(&jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!aggregate) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_interrupt = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Cleans up only references created by this JNI invocation. Leaves
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * cached per-consumer state untouched.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_fini(env, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (aggregate);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns the pid of the created process, or -1 in case of an error (java
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * exception pending).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT int JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1createProcess(JNIEnv *jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject caller, jstring command)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee struct ps_prochandle *P;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **argv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int argc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(jenv, caller, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jc.dtjj_consumer->dtjc_process_list == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_process_list = dtj_pointer_list_create();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jc.dtjj_consumer->dtjc_process_list) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Could not allocate process list");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv = dtj_make_argv(jenv, command, &argc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee P = dtrace_proc_create(dtp, argv[0], argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!P) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc, dtrace_errmsg(dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_pointer_list_add(jc.dtjj_consumer->dtjc_process_list, P)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add process to process list");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proc_release(dtp, P);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (Pstatus(P)->pr_pid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1grabProcess(JNIEnv *jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject caller, jint pid)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee struct ps_prochandle *P;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(jenv, caller, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jc.dtjj_consumer->dtjc_process_list == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_process_list = dtj_pointer_list_create();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jc.dtjj_consumer->dtjc_process_list == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Could not allocate process list");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee P = dtrace_proc_grab(dtp, (pid_t)pid, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!P) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc, dtrace_errmsg(dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_pointer_list_add(jc.dtjj_consumer->dtjc_process_list, P)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add process to process list");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_proc_release(dtp, P);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Lists all probes, or lists matching probes (using the matching rules from
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Table 4-1 of the DTrace manual).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * In the future it may be desirable to support an array of probe filters rather
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * than a single filter. It could be that if a probe matched any of the given
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * filters, it would be included (implied logical OR).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * param list: an empty list to populate (this function empties the list if it
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * is not empty already)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * param filter: a ProbeDescription instance; the list will include only probes
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * that match the filter (match all probes if filter is null)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1listProbes(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jobject list, jobject filter)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_probes(env, obj, list, filter, dtj_list_probe);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1listProbeDetail(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jobject list, jobject filter)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_probes(env, obj, list, filter, dtj_list_probe_detail);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_probes(JNIEnv *env, jobject obj, jobject list, jobject filter,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probe_f *func)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probedesc_t probe;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probedesc_t *pdp = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *probestr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int rc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_probelist = list;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* clear in-out list parameter */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->CallVoidMethod(env, list, g_listclear_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (filter) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jprobestr = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobestr = (*env)->CallObjectMethod(env, filter,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_tostring_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee probestr = (*env)->GetStringUTFChars(env, jprobestr, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!probestr) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, jprobestr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bzero(&probe, sizeof (probe));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee rc = dtrace_str2desc(dtp, DTRACE_PROBESPEC_NAME, probestr,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee &probe);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->ReleaseStringUTFChars(env, jprobestr, probestr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->DeleteLocalRef(env, jprobestr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (rc == -1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(&jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "%s is not a valid probe description: %s",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee probestr, dtrace_errmsg(dtp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pdp = &probe;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) dtrace_probe_iter(dtp, pdp, func, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Returns 0 to indicate success, or -1 to cause dtrace_probe_iter() to return a
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * negative value prematurely (indicating no match or failure).
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_probe(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t *jc = arg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *jenv = jc->dtjj_jenv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject jprobedesc = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobedesc = dtj_new_probedesc(jc, pdp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jprobedesc) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* add probe to list */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->CallVoidMethod(jenv, jc->dtjj_probelist, g_listadd_jm,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobedesc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jprobedesc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*ARGSUSED*/
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_probe_detail(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t *jc = arg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *jenv = jc->dtjj_jenv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_probeinfo_t p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject jprobedesc = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject jprobeinfo = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject jprobe = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobedesc = dtj_new_probedesc(jc, pdp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jprobedesc) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If dtrace_probe_info() returns a non-zero value, dtrace_errno is set
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * for us. In that case, ignore the dtrace error and simply omit probe
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * info. That error is implicitly cleared the next time a call is made
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * using the same dtrace handle.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_probe_info(dtp, pdp, &p) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* create probe info instance */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobeinfo = dtj_new_probeinfo(jc, &p);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jprobeinfo) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jprobedesc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* create listed probe instance */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobe = (*jenv)->NewObject(jenv, g_probe_jc, g_probeinit_jm,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobedesc, jprobeinfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jprobedesc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jprobeinfo);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jprobe) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1); /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* add probe to list */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->CallVoidMethod(jenv, jc->dtjj_probelist, g_listadd_jm,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jprobe);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jprobe);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (-1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*ARGSUSED*/
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_stmtdesc_t *stp, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t *jc = arg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_ecbdesc_t *edp = stp->dtsd_ecbdesc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (edp == jc->dtjj_consumer->dtjc_last_probe) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtrace_probe_iter(dtp, &edp->dted_probe,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc->dtjj_consumer->dtjc_plistfunc, arg) != 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_dtrace_exception(jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "failed to match %s:%s:%s:%s: %s",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee edp->dted_probe.dtpd_provider, edp->dted_probe.dtpd_mod,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee edp->dted_probe.dtpd_func, edp->dted_probe.dtpd_name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_errmsg(dtp, dtrace_errno(dtp)));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc->dtjj_consumer->dtjc_last_probe = edp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock in Consumer.java
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1listCompiledProbes(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject obj, jobject list, jobject program)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_compiled_probes(env, obj, list, program, dtj_list_probe);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1listCompiledProbeDetail(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee JNIEnv *env, jobject obj, jobject list, jobject program)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_compiled_probes(env, obj, list, program,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_probe_detail);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_compiled_probes(JNIEnv *env, jobject obj, jobject list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jobject program, dtrace_probe_f *func)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_consumer_t jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtrace_hdl_t *dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_program_t *p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee boolean_t found;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int progid = -1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int i;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_get_java_consumer(env, obj, &jc) != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtp = jc.dtjj_consumer->dtjc_dtp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_probelist = list;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*env)->CallVoidMethod(env, list, g_listclear_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*env)->ExceptionCheck(env)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (program) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (dtj_list_empty(jc.dtjj_consumer->dtjc_program_list)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_no_such_element(env, "no compiled program");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee progid = (*env)->GetIntField(env, program, g_progid_jf);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (progid == -1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_argument(env, "invalid program");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc.dtjj_consumer->dtjc_plistfunc = func;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee found = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(jc.dtjj_consumer->dtjc_program_list, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; (p = uu_list_walk_next(itr)) != NULL; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((progid != -1) && (progid != i)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee found = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) dtrace_stmt_iter(dtp, p->dtjp_program,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (dtrace_stmt_f *)dtj_list_stmt, &jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (program && !found) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_no_such_element(env, "program not found");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Static LocalConsumer.java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jstring JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1getVersion(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Handles the case of locale-specific encoding of the user-visible
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * version string containing non-ASCII characters.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (dtj_NewStringNative(env, _dtrace_version));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Static LocalConsumer.java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Protected by global lock (LocalConsumer.class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT jstring JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1getExecutableName(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass class)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jname = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *name = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *s;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee name = dtj_getexecname();
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee len = strlen(name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee s = malloc(len + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(env, "Failed to allocate execname");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strcpy(s, name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee name = basename(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jname = (*env)->NewStringUTF(env, name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jname);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Static LocalConsumer.java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1setMaximumConsumers(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass class, jint max)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_max_consumers = max;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Static LocalConsumer.java method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1setDebug(JNIEnv *env,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass class, jboolean debug)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_dtj_util_debug = debug;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJNIEXPORT void JNICALL
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeJava_org_opensolaris_os_dtrace_LocalConsumer__1destroy(JNIEnv *env, jobject obj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_t *c;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c = dtj_remove_consumer(env, obj);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* java exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_consumer_destroy(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}