xref: /illumos-gate/usr/src/lib/libdtrace_jni/java/src/org/opensolaris/os/dtrace/Consumer.java (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  *
26  * ident	"%Z%%M%	%I%	%E% SMI"
27  */
28 package org.opensolaris.os.dtrace;
29 
30 import java.io.*;
31 import java.util.*;
32 
33 /**
34  * Interface to the native DTrace library, each instance is a single
35  * DTrace consumer.  To consume the output of DTrace program actions,
36  * {@link #addConsumerListener(ConsumerListener l) register a probe data
37  * listener}.  To get a snapshot of all aggregations in a D program on
38  * your own programmatic interval without relying on DTrace actions to
39  * generate that output, use the {@link #getAggregate()} method.
40  *
41  * @see ProbeData
42  * @see Aggregate
43  *
44  * @author Tom Erickson
45  */
46 public interface Consumer {
47 
48     /**
49      * Optional flags passed to {@link #open(Consumer.OpenFlag[] flags)
50      * open()}.
51      */
52     public enum OpenFlag {
53 	/**
54 	 * Generate 32-bit D programs.  {@code ILP32} and {@link
55 	 * Consumer.OpenFlag#LP64 LP64} are mutually exclusive.
56 	 */
57 	ILP32,
58 	/**
59 	 * Generate 64-bit D programs.  {@code LP64} and {@link
60 	 * Consumer.OpenFlag#ILP32 ILP32} are mutually exclusive.
61 	 */
62 	LP64,
63     };
64 
65     /**
66      * Opens this DTrace consumer.  Optional flags indicate behaviors
67      * that can only be set at the time of opening.  Most optional
68      * behaviors are set using {@link #setOption(String option, String
69      * value) setOption()} after opening the consumer.  In the great
70      * majority of cases, the consumer is opened without specifying any
71      * flags:
72      * <pre>		{@code consumer.open();}</pre>
73      * Subsequent calls to set options, compile DTrace programs, enable
74      * probes, and run this consumer may be made from any thread.
75      *
76      * @throws NullPointerException if any of the given open flags is
77      * {@code null}
78      * @throws IllegalArgumentException if any of the given flags are
79      * mutually exlusive
80      * @throws IllegalStateException if this consumer is closed or has
81      * already been opened
82      * @throws DTraceException if an exception occurs in the native
83      * DTrace library
84      * @see #compile(File program, String[] macroArgs)
85      * @see #compile(String program, String[] macroArgs)
86      * @see #enable()
87      * @see #go()
88      */
89     public void open(OpenFlag ... flags) throws DTraceException;
90 
91     /**
92      * Compiles the given D program string.  Optional macro arguments
93      * replace corresponding numbered macro variables in the D program
94      * starting at {@code $1}.
95      *
96      * @param program program string
97      * @param macroArgs macro substitutions for <i>$n</i> placeholders
98      * embedded in the given D program: {@code macroArgs[0]} replaces
99      * all occurrences of {@code $1}, {@code macroArgs[1]} replaces all
100      * occurrences of {@code $2}, and so on.  {@code $0} is
101      * automatically replaced by the executable name and should not be
102      * included in the {@code macroArgs} parameter.  See the <a
103      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidliq?a=view>
104      * <b>Macro Arguments</b></a> section of the <b>Scripting</b>
105      * chapter of the <i>Solaris Dynamic Tracing Guide</i>.
106      * @return a non-null {@code Program} identifier that may be passed
107      * to {@link #enable(Program program) enable()}
108      * @throws NullPointerException if the given program string or any
109      * of the given macro arguments is {@code null}
110      * @throws IllegalStateException if called before {@link
111      * #open(OpenFlag[] flags) open()} or after {@link #go()}, or if the
112      * consumer is closed
113      * @throws DTraceException if an exception occurs in the native
114      * DTrace library
115      * @see #compile(File program, String[] macroArgs)
116      */
117     public Program compile(String program, String ... macroArgs)
118 	    throws DTraceException;
119 
120     /**
121      * Compiles the given D program file.  Optional macro arguments
122      * replace corresponding numbered macro variables in the D program
123      * starting at {@code $1}.
124      *
125      * @param program program file
126      * @param macroArgs macro substitutions for <i>$n</i> placeholders
127      * embedded in the given D program: {@code macroArgs[0]} replaces
128      * all occurrences of {@code $1}, {@code macroArgs[1]} replaces all
129      * occurrences of {@code $2}, and so on.  {@code $0} is
130      * automatically set to the name of the given file and should not be
131      * included in the {@code macroArgs} parameter.  See the <a
132      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidliq?a=view>
133      * <b>Macro Arguments</b></a> section of the <b>Scripting</b>
134      * chapter of the <i>Solaris Dynamic Tracing Guide</i>.
135      * @return a non-null {@code Program} identifier that may be passed
136      * to {@link #enable(Program program) enable()}
137      * @throws NullPointerException if the given program file or any of
138      * the given macro arguments is {@code null}
139      * @throws IllegalStateException if called before {@link
140      * #open(OpenFlag[] flags) open()} or after {@link #go()}, or if the
141      * consumer is closed
142      * @throws DTraceException if an exception occurs in the native
143      * DTrace library
144      * @throws FileNotFoundException if the given program file cannot be
145      * opened
146      * @throws IOException if an I/O error occurs while reading the
147      * contents of the given program file
148      * @throws SecurityException if a security manager exists and its
149      * {@code checkRead()} method denies read access to the file
150      * @see #compile(String program, String[] macroArgs)
151      */
152     public Program compile(File program, String ... macroArgs)
153 	    throws DTraceException, IOException, SecurityException;
154 
155     /**
156      * Enables all DTrace probes compiled by this consumer.  Call {@code
157      * enable()} with no argument to enable everything this consumer has
158      * compiled so far (most commonly a single program, the only one to
159      * be compiled).  Call with one {@link Program} at a time if you
160      * need information about enabled probes specific to each program.
161      *
162      * @throws IllegalStateException if called before compiling at least
163      * one program, or if any compiled program is already enabled, or if
164      * {@link #go()} was already called, or if this consumer is closed
165      * @throws DTraceException if an exception occurs in the native
166      * DTrace library
167      * @see #enable(Program program)
168      */
169     public void enable() throws DTraceException;
170 
171     /**
172      * Enables DTrace probes matching the given program and attaches
173      * information about those probes to the given program.  A probe
174      * matched multiple times (within the same D program or in multiple
175      * D programs) triggers the actions associated with each matching
176      * occurrence every time that probe fires.
177      *
178      * @param program  A {@code Program} identifier returned by {@link
179      * #compile(String program, String[] macroArgs) compile(String
180      * program, ...)} or {@link #compile(File program, String[]
181      * macroArgs) compile(File program, ...)}:  If the given program is
182      * {@code null}, the call has the same behavior as {@link #enable()}
183      * with no argument; if the given program is non-null, the call
184      * enables only those probes matching that program.  In the latter
185      * case, the {@code Program} parameter is modified as a way of
186      * passing back information about the given program and its matching
187      * probes, including program stability.
188      * @throws IllegalArgumentException if the given program is non-null
189      * and not compiled by this {@code Consumer}
190      * @throws IllegalStateException if the given program is already
191      * enabled (or if the given program is {@code null} and <i>any</i>
192      * program is already enabled), or if {@link #go()} was already
193      * called, or if this consumer is closed
194      * @throws DTraceException if an exception occurs in the native
195      * DTrace library
196      * @see #compile(String program, String[] macroArgs)
197      * @see #compile(File program, String[] macroArgs)
198      * @see #enable()
199      * @see #getProgramInfo(Program program)
200      */
201     public void enable(Program program) throws DTraceException;
202 
203     /**
204      * Attaches information about matching DTrace probes to the given
205      * program.  Attaches the same information to the given program as
206      * that attached by {@link #enable(Program program)} but without
207      * enabling the probes.
208      *
209      * @throws NullPointerException if the given program is {@code null}
210      * @throws IllegalArgumentException if the given program was not
211      * compiled by this {@code Consumer}
212      * @throws IllegalStateException if called after {@link #close()}
213      * @throws DTraceException if an exception occurs in the native
214      * DTrace library
215      * @see #compile(String program, String[] macroArgs)
216      * @see #compile(File program, String[] macroArgs)
217      * @see #enable(Program program)
218      */
219     public void getProgramInfo(Program program) throws DTraceException;
220 
221     /**
222      * Sets a boolean option.
223      *
224      * @throws NullPointerException if the given option is {@code null}
225      * @throws DTraceException if a value is expected for the given
226      * option, or if the option is otherwise invalid
227      * @throws IllegalStateException if called before {@link
228      * #open(OpenFlag[] flags) open()} or after {@link #close()}, or if
229      * the given option is a boolean compile-time option and {@link
230      * #go()} has already been called (see {@link Option} for a
231      * breakdown of runtime and compile-time options)
232      * @see #setOption(String option, String value)
233      * @see #unsetOption(String option)
234      */
235     public void setOption(String option) throws DTraceException;
236 
237     /**
238      * Unsets a boolean option.
239      *
240      * @throws NullPointerException if the given option is {@code null}
241      * @throws DTraceException if the given option is not a boolean
242      * option, or if the option is otherwise invalid
243      * @throws IllegalStateException if called before {@link
244      * #open(OpenFlag[] flags) open()} or after {@link #close()}, or if
245      * the given option is a boolean compile-time option and {@link
246      * #go()} has already been called (see {@link Option} for a
247      * breakdown of runtime and compile-time options)
248      * @see #setOption(String option)
249      */
250     public void unsetOption(String option) throws DTraceException;
251 
252     /**
253      * Sets the value of a DTrace option.  If the given option affects
254      * compile-time behavior, it must be set before calling {@link
255      * #compile(String program, String[] macroArgs) compile(String
256      * program, ...)} or {@link #compile(File program, String[]
257      * macroArgs) compile(File program, ...)} in order to have an effect
258      * on compilation.  Some runtime options including {@link
259      * Option#switchrate switchrate} and {@link Option#aggrate aggrate}
260      * are settable while a consumer is running; others must be set
261      * before calling {@link #go()}.  See the <a
262      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlis?a=view>
263      * <b>Options and Tunables</b></a> chapter of the <i>Solaris Dynamic
264      * Guide</i> for information about specific options.
265      *
266      * @throws NullPointerException if the given option or value is
267      * {@code null}
268      * @throws IllegalStateException if called before {@link
269      * #open(OpenFlag[] flags) open()} or after {@link #close()}, or if
270      * the given option is a boolean compile-time option and {@code
271      * go()} has already been called (see {@link Option} for a breakdown
272      * of runtime and compile-time options)
273      * @throws DTraceException for any of the following:
274      * <ul><li>The option is invalid</li>
275      * <li>The value is invalid for the given option</li>
276      * <li>{@code go()} has been called to start this consumer, and the
277      * option is not settable on a running consumer (some runtime
278      * options, including {@link Option#switchrate switchrate} and
279      * {@link Option#aggrate aggrate} are settable while the consumer is
280      * running)</li></ul>
281      *
282      * @see #open(OpenFlag[] flags)
283      * @see #getOption(String option)
284      * @see Option
285      */
286     public void setOption(String option, String value) throws DTraceException;
287 
288     /**
289      * Gets the value of a DTrace option.
290      *
291      * @throws NullPointerException if the given option is {@code null}
292      * @throws IllegalStateException if called before {@link
293      * #open(OpenFlag[] flags) open()} or after {@link #close()}
294      * @throws DTraceException if the given option is invalid
295      * @return the value of the given DTrace option: If the given option
296      * is a boolean option and is currently unset, the returned value is
297      * {@link Option#UNSET}.  If the given option is a <i>size</i>
298      * option, the returned value is in bytes.  If the given option is a
299      * <i>time</i> option, the returned value is in nanoseconds.  If the
300      * given option is {@link Option#bufpolicy bufpolicy}, the returned
301      * value is one of {@link Option#BUFPOLICY_RING BUFPOLICY_RING},
302      * {@link Option#BUFPOLICY_FILL BUFPOLICY_FILL}, or {@link
303      * Option#BUFPOLICY_SWITCH BUFPOLICY_SWITCH}.  If the given option
304      * is {@link Option#bufresize bufresize}, the returned value is one
305      * of {@link Option#BUFRESIZE_AUTO BUFRESIZE_AUTO} or {@link
306      * Option#BUFRESIZE_MANUAL BUFRESIZE_MANUAL}.
307      *
308      * @see #setOption(String option)
309      * @see #unsetOption(String option)
310      * @see #setOption(String option, String value)
311      * @see Option
312      */
313     public long getOption(String option) throws DTraceException;
314 
315     /**
316      * Reports whether or not this consumer is open.
317      *
318      * @return {@code true} if and only if {@link #open(OpenFlag[]
319      * flags) open()} has been called on this consumer and {@link
320      * #close()} has not
321      */
322     public boolean isOpen();
323 
324     /**
325      * Reports whether or not it is valid to call {@link #go()}.
326      *
327      * @return {@code true} if and only if at least one program has been
328      * compiled, all compiled programs have been enabled, {@code go()}
329      * has not already been called, and {@link #close()} has not been
330      * called
331      */
332     public boolean isEnabled();
333 
334     /**
335      * Reports whether or not this consumer is running.  There may be a
336      * delay after calling {@link #go()} before this consumer actually
337      * starts running (listeners are notified by the {@link
338      * ConsumerListener#consumerStarted(ConsumerEvent e)
339      * consumerStarted()} method).
340      *
341      * @return {@code true} if this consumer is running, {@code false}
342      * otherwise
343      */
344     public boolean isRunning();
345 
346     /**
347      * Reports whether or not this consumer is closed.  A closed
348      * consumer cannot be reopened.
349      * <p>
350      * Note that a closed consumer is different from a consumer that has
351      * not yet been opened.
352      *
353      * @return {@code true} if {@link #close()} has been called on this
354      * consumer, {@code false} otherwise
355      */
356     public boolean isClosed();
357 
358     /**
359      * Begin tracing and start a background thread to consume generated
360      * probe data.
361      *
362      * @throws IllegalStateException if not {@link #isEnabled()}
363      * @throws DTraceException if an exception occurs in the native
364      * DTrace library
365      * @see #go(ExceptionHandler h)
366      * @see #open(OpenFlag[] flags)
367      * @see #compile(String program, String[] macroArgs)
368      * @see #compile(File program, String[] macroArgs)
369      * @see #enable()
370      * @see #stop()
371      * @see #close()
372      */
373     public void go() throws DTraceException;
374 
375     /**
376      * Begin tracing and start a background thread to consume generated
377      * probe data.  Handle any exception thrown in the consumer thread
378      * with the given handler.
379      *
380      * @throws IllegalStateException if not {@link #isEnabled()}
381      * @throws DTraceException if an exception occurs in the native
382      * DTrace library
383      * @see #go()
384      */
385     public void go(ExceptionHandler h) throws DTraceException;
386 
387     /**
388      * Stops all tracing, as well as the background thread started by
389      * {@link #go()} to consume generated probe data.  A stopped
390      * consumer cannot be restarted.  It is necessary to {@code close()}
391      * a stopped consumer to release the system resources it holds.
392      * <p>
393      * A consumer may stop on its own in response to the {@code exit()}
394      * action (see <b>{@code exit()}</b> in the <a
395      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlhm?a=view>
396      * <b>Special Actions</b></a> section of the <b>Actions and
397      * Subroutines</b> chapter of the <i>Solaris Dynamic Tracing
398      * Guide</i>).  Similarly, a consumer stops automatically if it has
399      * at least one target process and all its target processes have
400      * completed (see {@link #createProcess(String command)
401      * createProcess()} and {@link #grabProcess(int pid)
402      * grabProcess()}).  A consumer also stops automatically if it
403      * encounters an exception while consuming probe data.  In these
404      * cases it is not necessary to call {@code stop()}.  If a consumer
405      * stops for any reason (an explicit call to {@code stop()} or any
406      * of the reasons just given), listeners are notified through the
407      * {@link ConsumerListener#consumerStopped(ConsumerEvent e)
408      * consumerStopped()} method.
409      * <p>
410      * Note that a call to {@code stop()} blocks until the background
411      * thread started by {@code go()} actually stops.  After {@code
412      * stop()} returns, a call to {@link #isRunning()} returns {@code
413      * false}.  If a {@code DTraceException} is thrown while stopping
414      * this consumer, it is handled by the handler passed to {@link
415      * #go(ExceptionHandler h)} (or a default handler if none is
416      * specified).
417      *
418      * @throws IllegalStateException if called before {@link #go()} or
419      * if {@code stop()} was already called
420      * @see #go()
421      * @see #abort()
422      * @see #close()
423      */
424     public void stop();
425 
426     /**
427      * Aborts the background thread started by {@link #go()}.  {@code
428      * abort()} is effectively the same as {@link #stop()} except that
429      * it does not block (i.e. it does not wait until the background
430      * thread actually stops).  {@link #isRunning()} is likely {@code
431      * true} immediately after a call to {@code abort()}, since an
432      * aborted consumer stops at a time specified as later.
433      * Specifically, a call to {@code abort()} stops tracing just before
434      * the next {@link ConsumerListener#intervalBegan(ConsumerEvent e)
435      * intervalBegan()} event and stops consuming probe data by the
436      * subsequent {@link ConsumerListener#intervalEnded(ConsumerEvent e)
437      * intervalEnded()} event.  When the aborted consumer actually
438      * stops, listeners are notified in the {@link
439      * ConsumerListener#consumerStopped(ConsumerEvent e)
440      * consumerStopped()} method, where it is convenient to {@link
441      * #close()} the stopped consumer after requesting the final
442      * aggregate.
443      * <p>
444      * The {@code abort()} and {@code stop()} methods have slightly
445      * different behavior when called <i>just after</i> {@code go()} but
446      * <i>before</i> the consumer actually starts running:  It is
447      * possible to {@code stop()} a consumer before it starts running
448      * (resulting in a {@code consumerStopped()} event without a
449      * matching {@code consumerStarted()} event), whereas an aborted
450      * consumer will not stop until after it starts running, when it
451      * completes a single interval (that interval does not include
452      * sleeping to wait for traced probe data).  Calling {@code abort()}
453      * before {@code go()} is legal and has the same effect as calling
454      * it after {@code go()} and before the consumer starts running.
455      * The last behavior follows from the design: You do not know the
456      * state of a consumer after calling {@code abort()}, nor is it
457      * necessary to know the state of a consumer before calling {@code
458      * abort()}.  That may be preferable, for example, when you want to
459      * abort a consumer opened and started in another thread.
460      *
461      * @see #stop()
462      */
463     public void abort();
464 
465     /**
466      * Closes an open consumer and releases the system resources it was
467      * holding.  If the consumer is running, {@code close()} will {@link
468      * #stop()} it automatically.  A closed consumer cannot be
469      * reopened.  Closing a consumer that has not yet been opened makes
470      * it illegal to open that consumer afterwards.  It is a no-op to
471      * call {@code close()} on a consumer that is already closed.
472      *
473      * @see #open(OpenFlag[] flags)
474      */
475     public void close();
476 
477     /**
478      * Adds a listener for probe data generated by this consumer.
479      */
480     public void addConsumerListener(ConsumerListener l);
481 
482     /**
483      * Removes a listener for probe data generated by this consumer.
484      */
485     public void removeConsumerListener(ConsumerListener l);
486 
487     /**
488      * Gets a snapshot of all aggregations except those that have
489      * already been captured in a {@link PrintaRecord}.  Does not clear
490      * any aggregation.
491      * <p>
492      * Provides a programmatic alternative to the {@code printa(})
493      * action (see <a
494      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlhv?a=view>
495      * <b>{@code printa()}</b></a> in the <b>Output Formatting</b>
496      * chapter of the <i>Solaris Dynamic Tracing Guide</i>).
497      *
498      * @throws IllegalStateException if called before {@link #go()} or
499      * after {@link #close()}
500      * @throws DTraceException if an exception occurs in the native
501      * DTrace library
502      * @see #getAggregate(Set includedAggregationNames, Set
503      * clearedAggregationNames)
504      */
505     public Aggregate getAggregate() throws DTraceException;
506 
507     /**
508      * Gets a snapshot of all the specified aggregations except those
509      * that have already been captured in a {@link PrintaRecord}.  Does
510      * not clear any aggregation.
511      * <p>
512      * Provides a programmatic alternative to the {@code printa(})
513      * action (see <a
514      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlhv?a=view>
515      * <b>{@code printa()}</b></a> in the <b>Output Formatting</b>
516      * chapter of the <i>Solaris Dynamic Tracing Guide</i>).
517      *
518      * @param includedAggregationNames  if {@code null}, all available
519      * aggregations are included; if non-null, only those aggregations
520      * specifically named by the given set are included
521      * @throws IllegalStateException if called before {@link #go()} or
522      * after {@link #close()}
523      * @throws DTraceException if an exception occurs in the native
524      * DTrace library
525      * @see #getAggregate(Set includedAggregationNames, Set
526      * clearedAggregationNames)
527      */
528     public Aggregate getAggregate(Set <String> includedAggregationNames)
529             throws DTraceException;
530 
531     /**
532      * Gets a snapshot of all the specified aggregations except those
533      * that have already been captured in a {@link PrintaRecord}, with
534      * the side effect of atomically clearing any subset of those
535      * aggregations.  Clearing an aggregation resets all of its values
536      * to zero without removing any of its keys.  Leave aggregations
537      * uncleared to get running totals, otherwise specify that an
538      * aggregation be cleared to get values per time interval.  Note
539      * that once an aggregation is captured in a {@code PrintaRecord}
540      * (as a result of the {@code printa()} action), it is no longer
541      * available to the {@code getAggregate()} method.
542      * <p>
543      * Provides a programmatic alternative to the {@code printa(}) (see
544      * <a
545      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlhv?a=view>
546      * <b>{@code printa()}</b></a> in the <b>Output Formatting</b>
547      * chapter of the <i>Solaris Dynamic Tracing Guide</i>) and {@code
548      * clear()} actions.
549      *
550      * @param includedAggregationNames  if {@code null}, all available
551      * aggregations are included; if non-null, only those aggregations
552      * specifically named by the given set are included
553      * @param clearedAggregationNames  if {@code null}, all available
554      * aggregations are cleared; if non-null, only those aggregations
555      * specifically named by the given set are cleared
556      * @throws IllegalStateException if called before {@link #go()} or
557      * after {@link #close()}
558      * @throws DTraceException if an exception occurs in the native
559      * DTrace library
560      */
561     public Aggregate getAggregate(Set <String> includedAggregationNames,
562 	    Set <String> clearedAggregationNames) throws DTraceException;
563 
564     /**
565      * Creates a process by executing the given command on the system
566      * and returns the created process ID.  The created process is
567      * suspended until calling {@link #go()} so that the process waits
568      * to do anything until this consumer has started tracing (allowing
569      * a process to be traced from the very beginning of its execution).
570      * The macro variable {@code $target} in a D program will be
571      * replaced by the process ID of the created process.  When the
572      * created process exits, this consumer notifies listeners through
573      * the {@link ConsumerListener#processStateChanged(ProcessEvent e)
574      * processStateChanged()} method.
575      * <p>
576      * See the <a
577      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlir?a=view>
578      * <b>Target Process ID</b></a> section of the <b>Scripting</b>
579      * chapter of the <i>Solaris Dynamic Tracing Guide</i>.
580      *
581      * @param command  a string whose first token is assumed to be the
582      * name of the command and whose subsequent tokens are the arguments
583      * to that command.
584      * @return ID of the created process (pid)
585      * @throws NullPointerException if the given command is {@code nul}l
586      * @throws IllegalArgumentException if the given command is empty or
587      * contains only whitespace
588      * @throws IllegalStateException if called before {@link
589      * #open(Consumer.OpenFlag[] flags) open()} or after {@link #go()},
590      * or if the consumer is closed
591      * @throws DTraceException if the process cannot be created
592      * @see #grabProcess(int pid)
593      */
594     public int createProcess(String command) throws DTraceException;
595 
596     /**
597      * Grabs the specified process and caches its symbol tables.  The
598      * macro variable {@code $target} in a D program will be replaced by
599      * the process ID of the grabbed process.  When the specified
600      * process exits, this consumer notifies listeners through the
601      * {@link ConsumerListener#processStateChanged(ProcessEvent e)
602      * processStateChanged()} method.
603      * <p>
604      * See the <a
605      * href=http://docs.sun.com/app/docs/doc/817-6223/6mlkidlir?a=view>
606      * <b>Target Process ID</b></a> section of the <b>Scripting</b>
607      * chapter of the <i>Solaris Dynamic Tracing Guide</i>.
608      *
609      * @param pid  process ID of the process to be grabbed
610      * @throws IllegalStateException if called before {@link
611      * #open(Consumer.OpenFlag[] flags) open()} or after {@link #go()},
612      * or if the consumer is closed
613      * @throws DTraceException if the process cannot be grabbed
614      * @see #createProcess(String command)
615      */
616     public void grabProcess(int pid) throws DTraceException;
617 
618     /**
619      * Lists probes that match the given probe description.  See {@link
620      * ProbeDescription} for information about pattern syntax and
621      * wildcarding.
622      *
623      * @param filter use {@link ProbeDescription#EMPTY} to get all
624      * probes, otherwise get only those probes that match the given
625      * filter
626      * @return a non-null list of probe descriptions
627      * @throws IllegalStateException if called before {@link
628      * #open(Consumer.OpenFlag[] flags) open()} or after {@link #go()},
629      * or if the consumer is closed
630      * @throws DTraceException if an exception occurs in the native
631      * DTrace library
632      * @see #open(OpenFlag[] flags)
633      * @see #close()
634      * @see #listProbeDetail(ProbeDescription filter)
635      * @see #listProgramProbes(Program program)
636      */
637     public List <ProbeDescription> listProbes(ProbeDescription filter)
638 	    throws DTraceException;
639 
640     /**
641      * Lists probes that match the given probe description and includes
642      * detail such as stability information about each listed probe.
643      *
644      * @param filter use {@link ProbeDescription#EMPTY} to get all
645      * probes, otherwise get only those probes that match the given
646      * filter
647      * @return a non-null list of probe detail
648      * @throws IllegalStateException if called before {@link
649      * #open(Consumer.OpenFlag[] flags) open()} or after {@link #go()},
650      * or if the consumer is closed
651      * @throws DTraceException if an exception occurs in the native
652      * DTrace library
653      * @see #listProbes(ProbeDescription filter)
654      * @see #listProgramProbeDetail(Program program)
655      */
656     public List <Probe> listProbeDetail(ProbeDescription filter)
657 	    throws DTraceException;
658 
659     /**
660      * Lists probes that match the given compiled program.  A probe
661      * matches a D program if that program contains any matching probe
662      * description.
663      *
664      * @param program  a {@code Program} identifier returned by {@link
665      * #compile(String program, String[] macroArgs) compile(String
666      * program, ...)} or {@link #compile(File program, String[]
667      * macroArgs) compile(File program, ...)}
668      * @return a non-null list of probe descriptions
669      * @throws NullPointerException if the given program identifier is
670      * {@code null}
671      * @throws IllegalArgumentException if the specified program was not
672      * compiled by this consumer
673      * @throws IllegalStateException if called before {@link
674      * #open(Consumer.OpenFlag[] flags) open()} or after {@link #go()},
675      * or if the consumer is closed
676      * @throws DTraceException if an exception occurs in the native
677      * DTrace library
678      * @see #listProbes(ProbeDescription filter)
679      */
680     public List <ProbeDescription> listProgramProbes(Program program)
681 	    throws DTraceException;
682 
683     /**
684      * Lists probes that match the given compiled program and includes
685      * detail such as stability information about each listed probe.
686      *
687      * @param program  a {@code Program} identifier returned by {@link
688      * #compile(String program, String[] macroArgs) compile(String
689      * program, ...)} or {@link #compile(File program, String[]
690      * macroArgs) compile(File program, ...)}
691      * @return a non-null list of probe detail
692      * @throws NullPointerException if the given program identifier is
693      * {@code null}
694      * @throws IllegalArgumentException if the specified program was not
695      * compiled by this consumer
696      * @throws IllegalStateException if called before {@link
697      * #open(Consumer.OpenFlag[] flags) open()} or after {@link #go()},
698      * or if the consumer is closed
699      * @throws DTraceException if an exception occurs in the native
700      * DTrace library
701      * @see #listProgramProbes(Program program)
702      * @see #listProbeDetail(ProbeDescription filter)
703      */
704     public List <Probe> listProgramProbeDetail(Program program)
705 	    throws DTraceException;
706 
707     /**
708      * Gets the kernel function name for the given 32-bit kernel
709      * address.
710      *
711      * @param  address 32-bit kernel function address, such as the value
712      * of a {@link Tuple} member in an {@link AggregationRecord} to be
713      * converted for display
714      * @return the result of kernel function lookup as one of the
715      * following:<ul><li>{@code module`function}</li>
716      * <li>{@code module`function+offset}</li>
717      * <li>{@code module`address}</li>
718      * <li>{@code address}</li></ul> where {@code module} and {@code
719      * function} are names, and {@code offset} and {@code address} are
720      * integers in hexadecimal format preceded by "{@code 0x}".  {@code
721      * offset} is the number of bytes from the beginning of the
722      * function, included when non-zero.  {@code address} is simply the
723      * hex form of the input paramater, returned when function lookup
724      * fails.  The exact details of this format are subject to change.
725      * @throws IllegalStateException if called before {@link #go()} or
726      * after {@link #close()}
727      * @see #lookupKernelFunction(long address)
728      */
729     public String lookupKernelFunction(int address);
730 
731     /**
732      * Gets the kernel function name for the given 64-bit kernel
733      * address.
734      *
735      * @param  address 64-bit kernel function address
736      * @return kernel function name
737      * @throws IllegalStateException if called before {@link #go()} or
738      * after {@link #close()}
739      * @see #lookupKernelFunction(int address)
740      */
741     public String lookupKernelFunction(long address);
742 
743     /**
744      * Gets the user function name for the given 32-bit user address and
745      * process ID.
746      *
747      * @param  pid ID of the user process containing the addressed
748      * function
749      * @param  address 32-bit user function address, such as the value
750      * of a {@link Tuple} member in an {@link AggregationRecord} to be
751      * converted for display.
752      * @return result of user function lookup as one of the
753      * following:<ul> <li>{@code module`function}</li>
754      * <li>{@code module`function+offset}</li>
755      * <li>{@code module`address}</li>
756      * <li>{@code address}</li></ul> where {@code module} and {@code
757      * function} are names, and {@code offset} and {@code address} are
758      * integers in hexadecimal format preceded by "{@code 0x}".  {@code
759      * offset} is the number of bytes from the beginning of the
760      * function, included when non-zero.  {@code address} is simply the
761      * hex form of the input paramater, returned when function lookup
762      * fails.  The exact details of this format are subject to change.
763      * @throws IllegalStateException if called before {@link #go()} or
764      * after {@link #close()}
765      * @see #lookupUserFunction(int pid, long address)
766      */
767     public String lookupUserFunction(int pid, int address);
768 
769     /**
770      * Gets the user function name for the given 64-bit user address and
771      * process ID.
772      *
773      * @param  pid ID of the user process containing the addressed
774      * function
775      * @param  address 64-bit user function address
776      * @return user function name
777      * @throws IllegalStateException if called before {@link #go()} or
778      * after {@link #close()}
779      * @see #lookupUserFunction(int pid, int address)
780      */
781     public String lookupUserFunction(int pid, long address);
782 
783     /**
784      * Gets the version of the native DTrace library.
785      *
786      * @return version string generated by the native DTrace library
787      * (same as the output of {@code dtrace(1M)} with the {@code -V}
788      * option)
789      */
790     public String getVersion();
791 }
792