1#!/usr/sbin/dtrace -Zs
2/*
3 * js_stat.d - JavaScript operation stats using DTrace.
4 *             Written for the JavaScript DTrace provider.
5 *
6 * $Id: js_stat.d 63 2007-10-04 04:34:38Z brendan $
7 *
8 * This traces activity from all browsers on the system that are
9 * running with JavaScript provider support.
10 *
11 * USAGE: js_stat.d [interval [count]]
12 *
13 * FIELDS:
14 *		EXEC/s		JavaScript programs executed per second
15 *		FUNCS/s		Functions called, per second
16 *		OBJNEW/s	Objects created, per second
17 *		OBJFRE/s	Objects freed (finalize), per second
18 *
19 * The numbers are counts for the interval specified. The default interval
20 * is 1 second.
21 *
22 * Filename and function names are printed if available.
23 *
24 * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
25 *
26 * CDDL HEADER START
27 *
28 *  The contents of this file are subject to the terms of the
29 *  Common Development and Distribution License, Version 1.0 only
30 *  (the "License").  You may not use this file except in compliance
31 *  with the License.
32 *
33 *  You can obtain a copy of the license at Docs/cddl1.txt
34 *  or http://www.opensolaris.org/os/licensing.
35 *  See the License for the specific language governing permissions
36 *  and limitations under the License.
37 *
38 * CDDL HEADER END
39 *
40 * 09-Sep-2007	Brendan Gregg	Created this.
41 */
42
43#pragma D option quiet
44#pragma D option defaultargs
45
46inline int SCREEN = 21;
47
48dtrace:::BEGIN
49{
50	execs = funcs = objnew = objfree = 0;
51	lines = SCREEN + 1;
52	interval = $1 ? $1 : 1;
53	counts = $2 ? $2 : -1;
54	secs = interval;
55	first = 1;
56}
57
58profile:::tick-1sec
59{
60	secs--;
61}
62
63/*
64 * Print Header
65 */
66dtrace:::BEGIN,
67profile:::tick-1sec
68/first || (secs == 0 && lines > SCREEN)/
69{
70	printf("%-20s %8s %8s %8s %8s\n", "TIME", "EXEC/s", "FUNC/s",
71	    "OBJNEW/s", "OBJFRE/s");
72	lines = 0;
73	first = 0;
74}
75
76/*
77 * Tally Data
78 */
79javascript*:::execute-start
80{
81	execs++;
82}
83
84javascript*:::function-entry
85{
86	funcs++;
87}
88
89javascript*:::object-create-start
90{
91	objnew++;
92}
93
94javascript*:::object-finalize
95{
96	objfree++;
97}
98
99/*
100 * Print Output
101 */
102profile:::tick-1sec
103/secs == 0/
104{
105	printf("%-20Y %8d %8d %8d %8d\n", walltimestamp, execs / interval,
106	    funcs / interval, objnew / interval, objfree / interval);
107	execs = funcs = objnew = objfree = 0;
108	secs = interval;
109	lines++;
110	counts--;
111}
112
113/*
114 * End
115 */
116profile:::tick-1sec
117/counts == 0/
118{
119        exit(0);
120}
121