135c4bbdfSmrg<?xml version="1.0" encoding="ISO-8859-1"?>
235c4bbdfSmrg<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
335c4bbdfSmrg "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
435c4bbdfSmrg <!ENTITY % defs SYSTEM "/xserver/doc/xml/xserver.ent"> %defs;
535c4bbdfSmrg]>
635c4bbdfSmrg
735c4bbdfSmrg<article id="Xserver-DTrace">
835c4bbdfSmrg  <articleinfo>
935c4bbdfSmrg    <title>Xserver Provider for DTrace</title>
1035c4bbdfSmrg    <author>
1135c4bbdfSmrg      <firstname>Alan</firstname><surname>Coopersmith</surname>
1235c4bbdfSmrg      <affiliation>
1335c4bbdfSmrg	<orgname>Oracle Corporation</orgname>
1435c4bbdfSmrg	<orgdiv>Solaris Engineering</orgdiv>
1535c4bbdfSmrg      </affiliation>
1635c4bbdfSmrg    </author>
1735c4bbdfSmrg    <releaseinfo>X Server Version &xserver.version;</releaseinfo>
185a7dfde8Smrg    <copyright><year>2005</year><year>2006</year><year>2007</year><year>2010</year><year>2020</year>
195a7dfde8Smrg      <holder>Oracle and/or its affiliates.</holder>
2035c4bbdfSmrg    </copyright>
2135c4bbdfSmrg    <legalnotice id="copyright">
2235c4bbdfSmrg      <para>
2335c4bbdfSmrgPermission is hereby granted, free of charge, to any person obtaining a
2435c4bbdfSmrgcopy of this software and associated documentation files (the "Software"),
2535c4bbdfSmrgto deal in the Software without restriction, including without limitation
2635c4bbdfSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense,
2735c4bbdfSmrgand/or sell copies of the Software, and to permit persons to whom the
2835c4bbdfSmrgSoftware is furnished to do so, subject to the following conditions:
2935c4bbdfSmrg      </para><para>
3035c4bbdfSmrgThe above copyright notice and this permission notice (including the next
3135c4bbdfSmrgparagraph) shall be included in all copies or substantial portions of the
3235c4bbdfSmrgSoftware.
3335c4bbdfSmrg      </para><para>
3435c4bbdfSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3535c4bbdfSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3635c4bbdfSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
3735c4bbdfSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3835c4bbdfSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3935c4bbdfSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4035c4bbdfSmrgDEALINGS IN THE SOFTWARE.
4135c4bbdfSmrg      </para>
4235c4bbdfSmrg    </legalnotice>
4335c4bbdfSmrg  </articleinfo>
4435c4bbdfSmrg
4535c4bbdfSmrg  <sect1 id="introduction">
4635c4bbdfSmrg    <title>Introduction</title>
4735c4bbdfSmrg    <para>
4835c4bbdfSmrg      This page provides details on a
495a7dfde8Smrg      <ulink url="http://dtrace.org/guide/chp-usdt.html">statically defined user application tracing provider</ulink>
5035c4bbdfSmrg      for the
515a7dfde8Smrg      <ulink url="http://dtrace.org/blogs/about/">DTrace</ulink>
5235c4bbdfSmrg      facility in <productname>Solaris</productname> 10,
5335c4bbdfSmrg      <productname>MacOS X</productname> 10.5, and later releases.  This
5435c4bbdfSmrg      provider instruments various points in the X server, to allow
5535c4bbdfSmrg      tracing what client applications are up to. DTrace probes may be used
5635c4bbdfSmrg      with <ulink url="http://sourceware.org/systemtap/">SystemTap</ulink>
5735c4bbdfSmrg      on GNU/Linux systems.
5835c4bbdfSmrg    </para>
5935c4bbdfSmrg
6035c4bbdfSmrg    <para>
61ed6184dfSmrg      The provider was integrated into the X.Org code base
6235c4bbdfSmrg      with Solaris 10 &amp; OpenSolaris support for the Xserver 1.4 release,
6335c4bbdfSmrg      released in 2007 with X11R7.3.   Support for DTrace on MacOS X
6435c4bbdfSmrg      was added in Xserver 1.7.
6535c4bbdfSmrg    </para>
6635c4bbdfSmrg
6735c4bbdfSmrg    <para>
6835c4bbdfSmrg      These probes expose the request and reply structure of the X protocol
6935c4bbdfSmrg      between clients and the X server, so an understanding of that basic
7035c4bbdfSmrg      nature will aid in learning how to use these probes.
7135c4bbdfSmrg    </para>
7235c4bbdfSmrg  </sect1>
7335c4bbdfSmrg
7435c4bbdfSmrg  <sect1 id="probes">
7535c4bbdfSmrg    <title>Available probes</title>
7635c4bbdfSmrg
7735c4bbdfSmrg    <para>
7835c4bbdfSmrg      Due to the way User-Defined DTrace probes work, arguments to
7935c4bbdfSmrg      these probes all bear undistinguished names of
8035c4bbdfSmrg      <parameter>arg0</parameter>, <parameter>arg1</parameter>,
8135c4bbdfSmrg      <parameter>arg2</parameter>, etc.  These tables should help you
8235c4bbdfSmrg      determine what the real data is for each of the probe arguments.
8335c4bbdfSmrg
8435c4bbdfSmrg    <table id="Probes_and_their_arguments">
8535c4bbdfSmrg      <title>Probes and their arguments</title>
8635c4bbdfSmrg      <tgroup cols='9'>
8735c4bbdfSmrg	<colspec colname="probe" colwidth="2*"/>
8835c4bbdfSmrg	<colspec colname="desc" colwidth="3*"/>
8935c4bbdfSmrg	<colspec colname="arg0" colwidth="1*"/>
9035c4bbdfSmrg	<colspec colname="arg1" colwidth="1*"/>
9135c4bbdfSmrg	<colspec colname="arg2" colwidth="1*"/>
9235c4bbdfSmrg	<colspec colname="arg3" colwidth="1*"/>
9335c4bbdfSmrg	<colspec colname="arg4" colwidth="1*"/>
9435c4bbdfSmrg	<colspec colname="arg5" colwidth="1*"/>
9535c4bbdfSmrg	<colspec colname="arg6" colwidth="1*"/>
9635c4bbdfSmrg	<spanspec spanname="all" namest="probe" nameend="arg4"/>
9735c4bbdfSmrg	<thead>
9835c4bbdfSmrg	  <row>
9935c4bbdfSmrg	    <entry>Probe name</entry>
10035c4bbdfSmrg	    <entry>Description</entry>
10135c4bbdfSmrg	    <entry>arg0</entry>
10235c4bbdfSmrg	    <entry>arg1</entry>
10335c4bbdfSmrg	    <entry>arg2</entry>
10435c4bbdfSmrg	    <entry>arg3</entry>
10535c4bbdfSmrg	    <entry>arg4</entry>
10635c4bbdfSmrg	    <entry>arg5</entry>
10735c4bbdfSmrg	    <entry>arg6</entry>
10835c4bbdfSmrg	  </row>
10935c4bbdfSmrg	</thead>
11035c4bbdfSmrg	<tbody>
11135c4bbdfSmrg	  <row>
11235c4bbdfSmrg	    <entry spanname="all" class="grouphead">Request Probes</entry>
11335c4bbdfSmrg	  </row>
11435c4bbdfSmrg	  <row>
11535c4bbdfSmrg	    <entry>request-start</entry>
11635c4bbdfSmrg	    <entry>Called just before processing each client request.</entry>
11735c4bbdfSmrg	    <entry><parameter>requestName</parameter></entry>
11835c4bbdfSmrg	    <entry><parameter>requestCode</parameter></entry>
11935c4bbdfSmrg	    <entry><parameter>requestLength</parameter></entry>
12035c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
12135c4bbdfSmrg	    <entry><parameter>requestBuffer</parameter></entry>
12235c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
12335c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
12435c4bbdfSmrg	  </row>
12535c4bbdfSmrg	  <row>
12635c4bbdfSmrg	    <entry>request-done</entry>
12735c4bbdfSmrg	    <entry>Called just after processing each client request.</entry>
12835c4bbdfSmrg	    <entry><parameter>requestName</parameter></entry>
12935c4bbdfSmrg	    <entry><parameter>requestCode</parameter></entry>
13035c4bbdfSmrg	    <entry><parameter>sequenceNumber</parameter></entry>
13135c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
13235c4bbdfSmrg	    <entry><parameter>resultCode</parameter></entry>
13335c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
13435c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
13535c4bbdfSmrg	  </row>
13635c4bbdfSmrg	  <row>
13735c4bbdfSmrg	    <entry spanname="all" class="grouphead">Event Probes</entry>
13835c4bbdfSmrg	  </row>
13935c4bbdfSmrg	  <row>
14035c4bbdfSmrg	    <entry>send-event</entry>
14135c4bbdfSmrg	    <entry>Called just before send each event to a client.</entry>
14235c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
14335c4bbdfSmrg	    <entry><parameter>eventCode</parameter></entry>
14435c4bbdfSmrg	    <entry><parameter>eventBuffer</parameter></entry>
14535c4bbdfSmrg	    <entry nameend="arg3" class="unused"/>
14635c4bbdfSmrg	    <entry nameend="arg4" class="unused"/>
14735c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
14835c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
14935c4bbdfSmrg	  </row>
15035c4bbdfSmrg	  <row>
15135c4bbdfSmrg	    <entry spanname="all" class="grouphead">Client Connection Probes</entry>
15235c4bbdfSmrg	  </row>
15335c4bbdfSmrg	  <row>
15435c4bbdfSmrg	    <entry>client-connect</entry>
15535c4bbdfSmrg	    <entry>Called when a new connection is opened from a client</entry>
15635c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
15735c4bbdfSmrg	    <entry><parameter>clientFD</parameter></entry>
15835c4bbdfSmrg	    <entry nameend="arg2" class="unused"/>
15935c4bbdfSmrg	    <entry nameend="arg3" class="unused"/>
16035c4bbdfSmrg	    <entry nameend="arg4" class="unused"/>
16135c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
16235c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
16335c4bbdfSmrg	  </row>
16435c4bbdfSmrg	  <row>
16535c4bbdfSmrg	    <entry>client-auth</entry>
16635c4bbdfSmrg	    <entry>Called when client authenticates (normally just after connection opened)</entry>
16735c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
16835c4bbdfSmrg	    <entry><parameter>clientAddr</parameter></entry>
16935c4bbdfSmrg	    <entry><parameter>clientPid</parameter></entry>
17035c4bbdfSmrg	    <entry><parameter>clientZoneId</parameter></entry>
17135c4bbdfSmrg	    <entry nameend="arg4" class="unused"/>
17235c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
17335c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
17435c4bbdfSmrg	  </row>
17535c4bbdfSmrg	  <row>
17635c4bbdfSmrg	    <entry>client-disconnect</entry>
17735c4bbdfSmrg	    <entry>Called when a client connection is closed</entry>
17835c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
17935c4bbdfSmrg	    <entry nameend="arg1" class="unused"/>
18035c4bbdfSmrg	    <entry nameend="arg2" class="unused"/>
18135c4bbdfSmrg	    <entry nameend="arg3" class="unused"/>
18235c4bbdfSmrg	    <entry nameend="arg4" class="unused"/>
18335c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
18435c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
18535c4bbdfSmrg	  </row>
18635c4bbdfSmrg	  <row>
18735c4bbdfSmrg	    <entry spanname="all" class="grouphead">Resource Allocation Probes</entry>
18835c4bbdfSmrg	  </row>
18935c4bbdfSmrg	  <row>
19035c4bbdfSmrg	    <entry>resource-alloc</entry>
19135c4bbdfSmrg	    <entry>Called when a new resource (pixmap, gc, colormap, etc.) is allocated</entry>
19235c4bbdfSmrg	    <entry><parameter>resourceId</parameter></entry>
19335c4bbdfSmrg	    <entry><parameter>resourceTypeId</parameter></entry>
19435c4bbdfSmrg	    <entry><parameter>resourceValue</parameter></entry>
19535c4bbdfSmrg	    <entry><parameter>resourceTypeName</parameter></entry>
19635c4bbdfSmrg	    <entry nameend="arg4" class="unused"/>
19735c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
19835c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
19935c4bbdfSmrg	  </row>
20035c4bbdfSmrg	  <row>
20135c4bbdfSmrg	    <entry>resource-free</entry>
20235c4bbdfSmrg	    <entry>Called when a resource is freed</entry>
20335c4bbdfSmrg	    <entry><parameter>resourceId</parameter></entry>
20435c4bbdfSmrg	    <entry><parameter>resourceTypeId</parameter></entry>
20535c4bbdfSmrg	    <entry><parameter>resourceValue</parameter></entry>
20635c4bbdfSmrg	    <entry><parameter>resourceTypeName</parameter></entry>
20735c4bbdfSmrg	    <entry nameend="arg4" class="unused"/>
20835c4bbdfSmrg	    <entry nameend="arg5" class="unused"/>
20935c4bbdfSmrg	    <entry nameend="arg6" class="unused"/>
21035c4bbdfSmrg	  </row>
21135c4bbdfSmrg	  <row>
21235c4bbdfSmrg	    <entry spanname="all" class="grouphead">Input API probes</entry>
21335c4bbdfSmrg	  </row>
21435c4bbdfSmrg	  <row>
21535c4bbdfSmrg	    <entry>input-event</entry>
21635c4bbdfSmrg	    <entry>Called when an input event was submitted for processing</entry>
21735c4bbdfSmrg	    <entry><parameter>deviceid</parameter></entry>
21835c4bbdfSmrg	    <entry><parameter>eventtype</parameter></entry>
21935c4bbdfSmrg	    <entry><parameter>button</parameter> or
22035c4bbdfSmrg		   <parameter>keycode</parameter> or
22135c4bbdfSmrg		   <parameter>touchid</parameter></entry>
22235c4bbdfSmrg	    <entry><parameter>flags</parameter></entry>
22335c4bbdfSmrg	    <entry><parameter>nvalues</parameter></entry>
22435c4bbdfSmrg	    <entry><parameter>mask</parameter></entry>
22535c4bbdfSmrg	    <entry><parameter>values</parameter></entry>
22635c4bbdfSmrg	  </row>
22735c4bbdfSmrg	</tbody>
22835c4bbdfSmrg      </tgroup>
22935c4bbdfSmrg    </table>
23035c4bbdfSmrg    </para>
23135c4bbdfSmrg  </sect1>
23235c4bbdfSmrg
23335c4bbdfSmrg  <sect1 id="arguments">
23435c4bbdfSmrg    <title>Data Available in Probe Arguments</title>
23535c4bbdfSmrg
23635c4bbdfSmrg    <para>
23735c4bbdfSmrg      To access data in arguments of type <type>string</type>, you will need
2385a7dfde8Smrg      to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyinstr"><function>copyinstr()</function></ulink>.
23935c4bbdfSmrg      To access data buffers referenced via <type>uintptr_t</type>'s, you will
2405a7dfde8Smrg      need to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyin"><function>copyin()</function></ulink>.
24135c4bbdfSmrg
24235c4bbdfSmrg    <table id="Probe_Arguments">
24335c4bbdfSmrg      <title>Probe Arguments</title>
24435c4bbdfSmrg      <tgroup cols='3'>
24535c4bbdfSmrg	<colspec colname="arg" colwidth="2*"/>
24635c4bbdfSmrg	<colspec colname="type" colwidth="1*"/>
24735c4bbdfSmrg	<colspec colname="desc" colwidth="7*"/>
24835c4bbdfSmrg	<thead>
24935c4bbdfSmrg	  <row>
25035c4bbdfSmrg	    <entry>Argument name</entry>
25135c4bbdfSmrg	    <entry>Type</entry>
25235c4bbdfSmrg	    <entry>Description</entry>
25335c4bbdfSmrg	  </row>
25435c4bbdfSmrg	</thead>
25535c4bbdfSmrg	<tbody>
25635c4bbdfSmrg	  <row>
25735c4bbdfSmrg	    <entry><parameter>clientAddr</parameter></entry>
25835c4bbdfSmrg	    <entry><type>string</type></entry>
25935c4bbdfSmrg	    <entry>String representing address client connected from</entry>
26035c4bbdfSmrg	  </row>
26135c4bbdfSmrg	  <row>
26235c4bbdfSmrg	    <entry><parameter>clientFD</parameter></entry>
26335c4bbdfSmrg	    <entry><type>int</type></entry>
26435c4bbdfSmrg	    <entry>X server's file descriptor for server side of each connection</entry>
26535c4bbdfSmrg	  </row>
26635c4bbdfSmrg	  <row>
26735c4bbdfSmrg	    <entry><parameter>clientId</parameter></entry>
26835c4bbdfSmrg	    <entry><type>int</type></entry>
26935c4bbdfSmrg	    <entry>Unique integer identifier for each connection to the
27035c4bbdfSmrg	      X server</entry>
27135c4bbdfSmrg	  </row>
27235c4bbdfSmrg	  <row>
27335c4bbdfSmrg	    <entry><parameter>clientPid</parameter></entry>
27435c4bbdfSmrg	    <entry><type>pid_t</type></entry>
27535c4bbdfSmrg	    <entry>Process id of client, if connection is local
27635c4bbdfSmrg	      (from <function>getpeerucred()</function>)</entry>
27735c4bbdfSmrg	  </row>
27835c4bbdfSmrg	  <row>
27935c4bbdfSmrg	    <entry><parameter>clientZoneId</parameter></entry>
28035c4bbdfSmrg	    <entry><type>zoneid_t</type></entry>
28135c4bbdfSmrg	    <entry>Solaris: Zone id of client, if connection is local
28235c4bbdfSmrg	      (from <function>getpeerucred()</function>)</entry>
28335c4bbdfSmrg	  </row>
28435c4bbdfSmrg	  <row>
28535c4bbdfSmrg	    <entry><parameter>eventBuffer</parameter></entry>
28635c4bbdfSmrg	    <entry><type>uintptr_t</type></entry>
28735c4bbdfSmrg	    <entry>Pointer to buffer containing X event - decode using
28835c4bbdfSmrg	      structures in
2895a7dfde8Smrg	      &lt;<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>&gt;
29035c4bbdfSmrg	      and similar headers for each extension</entry>
29135c4bbdfSmrg	  </row>
29235c4bbdfSmrg	  <row>
29335c4bbdfSmrg	    <entry><parameter>eventCode</parameter></entry>
29435c4bbdfSmrg	    <entry><type>uint8_t</type></entry>
29535c4bbdfSmrg	    <entry>Event number of X event</entry>
29635c4bbdfSmrg	  </row>
29735c4bbdfSmrg	  <row>
29835c4bbdfSmrg	    <entry><parameter>resourceId</parameter></entry>
29935c4bbdfSmrg	    <entry><type>uint32_t</type></entry>
30035c4bbdfSmrg	    <entry>X resource id (XID)</entry>
30135c4bbdfSmrg	  </row>
30235c4bbdfSmrg	  <row>
30335c4bbdfSmrg	    <entry><parameter>resourceTypeId</parameter></entry>
30435c4bbdfSmrg	    <entry><type>uint32_t</type></entry>
30535c4bbdfSmrg	    <entry>Resource type id</entry>
30635c4bbdfSmrg	  </row>
30735c4bbdfSmrg	  <row>
30835c4bbdfSmrg	    <entry><parameter>resourceTypeName</parameter></entry>
30935c4bbdfSmrg	    <entry><type>string</type></entry>
31035c4bbdfSmrg	    <entry>String representing X resource type
31135c4bbdfSmrg		(<literal>"PIXMAP"</literal>, etc.)</entry>
31235c4bbdfSmrg	  </row>
31335c4bbdfSmrg	  <row>
31435c4bbdfSmrg	    <entry><parameter>resourceValue</parameter></entry>
31535c4bbdfSmrg	    <entry><type>uintptr_t</type></entry>
31635c4bbdfSmrg	    <entry>Pointer to data for X resource</entry>
31735c4bbdfSmrg	  </row>
31835c4bbdfSmrg	  <row>
31935c4bbdfSmrg	    <entry><parameter>resultCode</parameter></entry>
32035c4bbdfSmrg	    <entry><type>int</type></entry>
32135c4bbdfSmrg	    <entry>Integer code representing result status of request</entry>
32235c4bbdfSmrg	  </row>
32335c4bbdfSmrg	  <row>
32435c4bbdfSmrg	    <entry><parameter>requestBuffer</parameter></entry>
32535c4bbdfSmrg	    <entry><type>uintptr_t</type></entry>
32635c4bbdfSmrg	    <entry>Pointer to buffer containing X request - decode using
32735c4bbdfSmrg	      structures in
3285a7dfde8Smrg	      &lt;<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>&gt;
32935c4bbdfSmrg	      and similar headers for each extension</entry>
33035c4bbdfSmrg	  </row>
33135c4bbdfSmrg	  <row>
33235c4bbdfSmrg	    <entry><parameter>requestCode</parameter></entry>
33335c4bbdfSmrg	    <entry><type>uint8_t</type></entry>
33435c4bbdfSmrg	    <entry>Request number of X request or Extension</entry>
33535c4bbdfSmrg	  </row>
33635c4bbdfSmrg	  <row>
33735c4bbdfSmrg	    <entry><parameter>requestName</parameter></entry>
33835c4bbdfSmrg	    <entry><type>string</type></entry>
33935c4bbdfSmrg	    <entry>Name of X request or Extension</entry>
34035c4bbdfSmrg	  </row>
34135c4bbdfSmrg	  <row>
34235c4bbdfSmrg	    <entry><parameter>requestLength</parameter></entry>
34335c4bbdfSmrg	    <entry><type>uint16_t</type></entry>
34435c4bbdfSmrg	    <entry>Length of X request</entry>
34535c4bbdfSmrg	  </row>
34635c4bbdfSmrg	  <row>
34735c4bbdfSmrg	    <entry><parameter>sequenceNumber</parameter></entry>
34835c4bbdfSmrg	    <entry><type>uint32_t</type></entry>
34935c4bbdfSmrg	    <entry>Number of X request in in this connection</entry>
35035c4bbdfSmrg	  </row>
35135c4bbdfSmrg	  <row>
35235c4bbdfSmrg	    <entry><parameter>deviceid</parameter></entry>
35335c4bbdfSmrg	    <entry><type>int</type></entry>
35435c4bbdfSmrg	    <entry>The device's numerical ID</entry>
35535c4bbdfSmrg	  </row>
35635c4bbdfSmrg	  <row>
35735c4bbdfSmrg	    <entry><parameter>eventtype</parameter></entry>
35835c4bbdfSmrg	    <entry><type>int</type></entry>
35935c4bbdfSmrg	    <entry>Protocol event type</entry>
36035c4bbdfSmrg	  </row>
36135c4bbdfSmrg	  <row>
36235c4bbdfSmrg	    <entry><parameter>button, keycode, touchid</parameter></entry>
36335c4bbdfSmrg	    <entry><type>uint32_t</type></entry>
36435c4bbdfSmrg	    <entry>The button number, keycode or touch ID</entry>
36535c4bbdfSmrg	  </row>
36635c4bbdfSmrg	  <row>
36735c4bbdfSmrg	    <entry><parameter>flags</parameter></entry>
36835c4bbdfSmrg	    <entry><type>uint32_t</type></entry>
36935c4bbdfSmrg	    <entry>Miscellaneous event-specific server flags</entry>
37035c4bbdfSmrg	  </row>
37135c4bbdfSmrg	  <row>
37235c4bbdfSmrg	    <entry><parameter>nvalues</parameter></entry>
37335c4bbdfSmrg	    <entry><type>int8_t</type></entry>
37435c4bbdfSmrg	    <entry>Number of bits in <parameter>mask</parameter> and number of elements
37535c4bbdfSmrg		    in <parameter>values</parameter></entry>
37635c4bbdfSmrg	  </row>
37735c4bbdfSmrg	  <row>
37835c4bbdfSmrg	    <entry><parameter>mask</parameter></entry>
37935c4bbdfSmrg	    <entry><type>uint8_t*</type></entry>
38035c4bbdfSmrg	    <entry>Binary mask indicating which indices in <parameter>values</parameter> contain
38135c4bbdfSmrg		  valid data</entry>
38235c4bbdfSmrg	  </row>
38335c4bbdfSmrg	  <row>
38435c4bbdfSmrg	    <entry><parameter>values</parameter></entry>
38535c4bbdfSmrg	    <entry><type>double*</type></entry>
38635c4bbdfSmrg	    <entry>Valuator values. Values for indices for which the
38735c4bbdfSmrg		  <parameter>mask</parameter> is not set are undefined</entry>
38835c4bbdfSmrg	  </row>
38935c4bbdfSmrg	</tbody>
39035c4bbdfSmrg      </tgroup>
39135c4bbdfSmrg    </table>
39235c4bbdfSmrg    </para>
39335c4bbdfSmrg  </sect1>
39435c4bbdfSmrg
39535c4bbdfSmrg  <sect1 id="examples">
39635c4bbdfSmrg    <title>Examples</title>
39735c4bbdfSmrg
39835c4bbdfSmrg    <example id="Counting_requests_by_request_name">
39935c4bbdfSmrg      <title>Counting requests by request name</title>
40035c4bbdfSmrg
40135c4bbdfSmrg      <para>
40235c4bbdfSmrg	This script simply increments a counter for each different request
40335c4bbdfSmrg	made, and when you exit the script (such as by hitting
40435c4bbdfSmrg	<keycombo action='simul'><keycap>Control</keycap><keycap>C</keycap>
40535c4bbdfSmrg	</keycombo>) prints the counts.
40635c4bbdfSmrg
40735c4bbdfSmrg	<programlisting>
40835c4bbdfSmrg#!/usr/sbin/dtrace -s
40935c4bbdfSmrg
41035c4bbdfSmrgXserver*:::request-start
41135c4bbdfSmrg{
41235c4bbdfSmrg    @counts[copyinstr(arg0)] = count();
41335c4bbdfSmrg}
41435c4bbdfSmrg	</programlisting>
41535c4bbdfSmrg
41635c4bbdfSmrg	The output from a short run may appear as:
41735c4bbdfSmrg	<screen>
41835c4bbdfSmrg  QueryPointer                                                      1
41935c4bbdfSmrg  CreatePixmap                                                      2
42035c4bbdfSmrg  FreePixmap                                                        2
42135c4bbdfSmrg  PutImage                                                          2
42235c4bbdfSmrg  ChangeGC                                                         10
42335c4bbdfSmrg  CopyArea                                                         10
42435c4bbdfSmrg  CreateGC                                                         14
42535c4bbdfSmrg  FreeGC                                                           14
42635c4bbdfSmrg  RENDER                                                           28
42735c4bbdfSmrg  SetClipRectangles                                                40
42835c4bbdfSmrg	</screen>
42935c4bbdfSmrg      </para>
43035c4bbdfSmrg
43135c4bbdfSmrg      <para>
43235c4bbdfSmrg	This can be rewritten slightly to cache the string containing the name
43335c4bbdfSmrg	of the request since it will be reused many times, instead of copying
43435c4bbdfSmrg	it over and over from the kernel:
43535c4bbdfSmrg
43635c4bbdfSmrg	<programlisting>
43735c4bbdfSmrg#!/usr/sbin/dtrace -s
43835c4bbdfSmrg
43935c4bbdfSmrgstring Xrequest[uintptr_t];
44035c4bbdfSmrg
44135c4bbdfSmrgXserver*:::request-start
44235c4bbdfSmrg/Xrequest[arg0] == ""/
44335c4bbdfSmrg{
44435c4bbdfSmrg    Xrequest[arg0] = copyinstr(arg0);
44535c4bbdfSmrg}
44635c4bbdfSmrg
44735c4bbdfSmrgXserver*:::request-start
44835c4bbdfSmrg{
44935c4bbdfSmrg    @counts[Xrequest[arg0]] = count();
45035c4bbdfSmrg}
45135c4bbdfSmrg	</programlisting>
45235c4bbdfSmrg      </para>
45335c4bbdfSmrg    </example>
45435c4bbdfSmrg
45535c4bbdfSmrg    <example id="Get_average_CPU_time_per_request">
45635c4bbdfSmrg      <title>Get average CPU time per request</title>
45735c4bbdfSmrg
45835c4bbdfSmrg      <para>This script records the CPU time used between the probes at
45935c4bbdfSmrg	the start and end of each request and aggregates it per request type.
46035c4bbdfSmrg
46135c4bbdfSmrg	<programlisting>
46235c4bbdfSmrg#!/usr/sbin/dtrace -s
46335c4bbdfSmrg
46435c4bbdfSmrgXserver*:::request-start
46535c4bbdfSmrg{
46635c4bbdfSmrg    reqstart = vtimestamp;
46735c4bbdfSmrg}
46835c4bbdfSmrg
46935c4bbdfSmrgXserver*:::request-done
47035c4bbdfSmrg{
47135c4bbdfSmrg    @times[copyinstr(arg0)] = avg(vtimestamp - reqstart);
47235c4bbdfSmrg}
47335c4bbdfSmrg	</programlisting>
47435c4bbdfSmrg
47535c4bbdfSmrg	The output from a sample run might look like:
47635c4bbdfSmrg
47735c4bbdfSmrg	<screen>
47835c4bbdfSmrg  ChangeGC                                                        889
47935c4bbdfSmrg  MapWindow                                                       907
48035c4bbdfSmrg  SetClipRectangles                                              1319
48135c4bbdfSmrg  PolyPoint                                                      1413
48235c4bbdfSmrg  PolySegment                                                    1434
48335c4bbdfSmrg  PolyRectangle                                                  1828
48435c4bbdfSmrg  FreeCursor                                                     1895
48535c4bbdfSmrg  FreeGC                                                         1950
48635c4bbdfSmrg  CreateGC                                                       2244
48735c4bbdfSmrg  FreePixmap                                                     2246
48835c4bbdfSmrg  GetInputFocus                                                  2249
48935c4bbdfSmrg  TranslateCoords                                                8508
49035c4bbdfSmrg  QueryTree                                                      8846
49135c4bbdfSmrg  GetGeometry                                                    9948
49235c4bbdfSmrg  CreatePixmap                                                  12111
49335c4bbdfSmrg  AllowEvents                                                   14090
49435c4bbdfSmrg  GrabServer                                                    14791
49535c4bbdfSmrg  MIT-SCREEN-SAVER                                              16747
49635c4bbdfSmrg  ConfigureWindow                                               22917
49735c4bbdfSmrg  SetInputFocus                                                 28521
49835c4bbdfSmrg  PutImage                                                     240841
49935c4bbdfSmrg
50035c4bbdfSmrg	</screen>
50135c4bbdfSmrg      </para>
50235c4bbdfSmrg    </example>
50335c4bbdfSmrg
50435c4bbdfSmrg    <example id="Monitoring_clients_that_connect_and_disconnect">
50535c4bbdfSmrg      <title>Monitoring clients that connect and disconnect</title>
50635c4bbdfSmrg
50735c4bbdfSmrg      <para>
50835c4bbdfSmrg	This script simply prints information about each client that
50935c4bbdfSmrg	connects or disconnects from the server while it is running.
51035c4bbdfSmrg	Since the provider is specified as <code>Xserver$1</code> instead
51135c4bbdfSmrg	of <code>Xserver*</code> like previous examples, it won't monitor
51235c4bbdfSmrg	all Xserver processes running on the machine, but instead expects
51335c4bbdfSmrg	the process id of the X server to monitor to be specified as the
51435c4bbdfSmrg	argument to the script.
51535c4bbdfSmrg
51635c4bbdfSmrg	<programlisting>
51735c4bbdfSmrg#!/usr/sbin/dtrace -s
51835c4bbdfSmrg
51935c4bbdfSmrgXserver$1:::client-connect
52035c4bbdfSmrg{
52135c4bbdfSmrg	printf("** Client Connect: id %d\n", arg0);
52235c4bbdfSmrg}
52335c4bbdfSmrg
52435c4bbdfSmrgXserver$1:::client-auth
52535c4bbdfSmrg{
52635c4bbdfSmrg	printf("** Client auth'ed: id %d =&gt; %s pid %d\n",
52735c4bbdfSmrg		arg0, copyinstr(arg1), arg2);
52835c4bbdfSmrg}
52935c4bbdfSmrg
53035c4bbdfSmrgXserver$1:::client-disconnect
53135c4bbdfSmrg{
53235c4bbdfSmrg	printf("** Client Disconnect: id %d\n", arg0);
53335c4bbdfSmrg}
53435c4bbdfSmrg	</programlisting>
53535c4bbdfSmrg
53635c4bbdfSmrg	A sample run:
53735c4bbdfSmrg
53835c4bbdfSmrg	<screen>
53935c4bbdfSmrg<prompt>#</prompt> <userinput>./foo.d 5790</userinput>
54035c4bbdfSmrg<computeroutput>dtrace: script './foo.d' matched 4 probes
54135c4bbdfSmrgCPU     ID                    FUNCTION:NAME
54235c4bbdfSmrg  0  15774 CloseDownClient:client-disconnect ** Client Disconnect: id 65
54335c4bbdfSmrg
54435c4bbdfSmrg  2  15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64
54535c4bbdfSmrg
54635c4bbdfSmrg  0  15773 EstablishNewConnections:client-connect ** Client Connect: id 64
54735c4bbdfSmrg
54835c4bbdfSmrg  0  15772            AuthAudit:client-auth ** Client auth'ed: id 64 =&gt; local host pid 2034
54935c4bbdfSmrg
55035c4bbdfSmrg  0  15773 EstablishNewConnections:client-connect ** Client Connect: id 65
55135c4bbdfSmrg
55235c4bbdfSmrg  0  15772            AuthAudit:client-auth ** Client auth'ed: id 65 =&gt; local host pid 2034
55335c4bbdfSmrg
55435c4bbdfSmrg  0  15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64
55535c4bbdfSmrg	  </computeroutput>
55635c4bbdfSmrg	</screen>
55735c4bbdfSmrg
55835c4bbdfSmrg      </para>
55935c4bbdfSmrg    </example>
56035c4bbdfSmrg
56135c4bbdfSmrg    <example id="Monitoring_clients_creating_Pixmaps">
56235c4bbdfSmrg      <title>Monitoring clients creating Pixmaps</title>
56335c4bbdfSmrg
56435c4bbdfSmrg      <para>
56535c4bbdfSmrg	This script can be used to determine which clients are creating
56635c4bbdfSmrg	pixmaps in the X server, printing information about each client
56735c4bbdfSmrg	as it connects to help trace it back to the program on the other
56835c4bbdfSmrg	end of the X connection.
56935c4bbdfSmrg
57035c4bbdfSmrg	<programlisting>
57135c4bbdfSmrg#!/usr/sbin/dtrace -qs
57235c4bbdfSmrg
57335c4bbdfSmrgstring Xrequest[uintptr_t];
57435c4bbdfSmrgstring Xrestype[uintptr_t];
57535c4bbdfSmrg
57635c4bbdfSmrgXserver$1:::request-start
57735c4bbdfSmrg/Xrequest[arg0] == ""/
57835c4bbdfSmrg{
57935c4bbdfSmrg	Xrequest[arg0] = copyinstr(arg0);
58035c4bbdfSmrg}
58135c4bbdfSmrg
58235c4bbdfSmrgXserver$1:::resource-alloc
58335c4bbdfSmrg/arg3 != 0 &amp;&amp; Xrestype[arg3] == ""/
58435c4bbdfSmrg{
58535c4bbdfSmrg	Xrestype[arg3] = copyinstr(arg3);
58635c4bbdfSmrg}
58735c4bbdfSmrg
58835c4bbdfSmrg
58935c4bbdfSmrgXserver$1:::request-start
59035c4bbdfSmrg/Xrequest[arg0] == "X_CreatePixmap"/
59135c4bbdfSmrg{
59235c4bbdfSmrg	printf("-&gt; %s: client %d\n", Xrequest[arg0], arg3);
59335c4bbdfSmrg}
59435c4bbdfSmrg
59535c4bbdfSmrgXserver$1:::request-done
59635c4bbdfSmrg/Xrequest[arg0] == "X_CreatePixmap"/
59735c4bbdfSmrg{
59835c4bbdfSmrg	printf("&lt;- %s: client %d\n", Xrequest[arg0], arg3);
59935c4bbdfSmrg}
60035c4bbdfSmrg
60135c4bbdfSmrgXserver$1:::resource-alloc
60235c4bbdfSmrg/Xrestype[arg3] == "PIXMAP"/
60335c4bbdfSmrg{
60435c4bbdfSmrg	printf("** Pixmap alloc: %08x\n", arg0);
60535c4bbdfSmrg}
60635c4bbdfSmrg
60735c4bbdfSmrg
60835c4bbdfSmrgXserver$1:::resource-free
60935c4bbdfSmrg/Xrestype[arg3] == "PIXMAP"/
61035c4bbdfSmrg{
61135c4bbdfSmrg	printf("** Pixmap free:  %08x\n", arg0);
61235c4bbdfSmrg}
61335c4bbdfSmrg
61435c4bbdfSmrgXserver$1:::client-connect
61535c4bbdfSmrg{
61635c4bbdfSmrg	printf("** Client Connect: id %d\n", arg0);
61735c4bbdfSmrg}
61835c4bbdfSmrg
61935c4bbdfSmrgXserver$1:::client-auth
62035c4bbdfSmrg{
62135c4bbdfSmrg	printf("** Client auth'ed: id %d =&gt; %s pid %d\n",
62235c4bbdfSmrg		arg0, copyinstr(arg1), arg2);
62335c4bbdfSmrg}
62435c4bbdfSmrg
62535c4bbdfSmrgXserver$1:::client-disconnect
62635c4bbdfSmrg{
62735c4bbdfSmrg	printf("** Client Disconnect: id %d\n", arg0);
62835c4bbdfSmrg}
62935c4bbdfSmrg	</programlisting>
63035c4bbdfSmrg
63135c4bbdfSmrg	Sample output from a run of this script:
63235c4bbdfSmrg	<screen><computeroutput>
63335c4bbdfSmrg** Client Connect: id 17
63435c4bbdfSmrg** Client auth'ed: id 17 =&gt; local host pid 20273
63535c4bbdfSmrg-&gt; X_CreatePixmap: client 17
63635c4bbdfSmrg** Pixmap alloc: 02200009
63735c4bbdfSmrg&lt;- X_CreatePixmap: client 17
63835c4bbdfSmrg-&gt; X_CreatePixmap: client 15
63935c4bbdfSmrg** Pixmap alloc: 01e00180
64035c4bbdfSmrg&lt;- X_CreatePixmap: client 15
64135c4bbdfSmrg-&gt; X_CreatePixmap: client 15
64235c4bbdfSmrg** Pixmap alloc: 01e00181
64335c4bbdfSmrg&lt;- X_CreatePixmap: client 15
64435c4bbdfSmrg-&gt; X_CreatePixmap: client 14
64535c4bbdfSmrg** Pixmap alloc: 01c004c8
64635c4bbdfSmrg&lt;- X_CreatePixmap: client 14
64735c4bbdfSmrg** Pixmap free:  02200009
64835c4bbdfSmrg** Client Disconnect: id 17
64935c4bbdfSmrg** Pixmap free:  01e00180
65035c4bbdfSmrg** Pixmap free:  01e00181
65135c4bbdfSmrg	  </computeroutput></screen>
65235c4bbdfSmrg
65335c4bbdfSmrg      </para>
65435c4bbdfSmrg
65535c4bbdfSmrg    </example>
65635c4bbdfSmrg
65735c4bbdfSmrg    <example id="Input_API_monitoring_with_systemtap">
65835c4bbdfSmrg      <title>Input API monitoring with SystemTap</title>
65935c4bbdfSmrg
66035c4bbdfSmrg      <para>
66135c4bbdfSmrg	This script can be used to monitor events submitted by drivers to
66235c4bbdfSmrg	the server for enqueuing. Due to the integration of the input API
66335c4bbdfSmrg	probes, some server-enqueued events will show up too.
66435c4bbdfSmrg	<programlisting>
66535c4bbdfSmrg  # Compile+run with
66635c4bbdfSmrg  #       stap -g xorg.stp /usr/bin/Xorg
66735c4bbdfSmrg  #
66835c4bbdfSmrg
66935c4bbdfSmrg
67035c4bbdfSmrg  function print_valuators:string(nvaluators:long, mask_in:long, valuators_in:long) %{
67135c4bbdfSmrg	  int i;
67235c4bbdfSmrg	  unsigned char *mask = (unsigned char*)THIS->mask_in;
67335c4bbdfSmrg	  double *valuators = (double*)THIS->valuators_in;
67435c4bbdfSmrg	  char str[128] = {0};
67535c4bbdfSmrg	  char *s = str;
67635c4bbdfSmrg
67735c4bbdfSmrg  #define BitIsSet(ptr, bit) (((unsigned char*)(ptr))[(bit)>>3] &amp; (1 &lt;&lt; ((bit) &amp; 7)))
67835c4bbdfSmrg
67935c4bbdfSmrg	  s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators);
68035c4bbdfSmrg	  for (i = 0; i &lt; THIS->nvaluators; i++)
68135c4bbdfSmrg	  {
68235c4bbdfSmrg		  s += sprintf(s, "	%d: ", i);
68335c4bbdfSmrg		  if (BitIsSet(mask, i))
68435c4bbdfSmrg		      s += sprintf(s, "%d", (int)valuators[i]);
68535c4bbdfSmrg	  }
68635c4bbdfSmrg
68735c4bbdfSmrg	  sprintf(THIS->__retvalue, "%s", str);
68835c4bbdfSmrg  %}
68935c4bbdfSmrg
69035c4bbdfSmrg  probe process(@1).mark("input__event")
69135c4bbdfSmrg  {
69235c4bbdfSmrg      deviceid = $arg1
69335c4bbdfSmrg      type = $arg2
69435c4bbdfSmrg      detail = $arg3
69535c4bbdfSmrg      flags = $arg4
69635c4bbdfSmrg      nvaluators = $arg5
69735c4bbdfSmrg
69835c4bbdfSmrg      str = print_valuators(nvaluators, $arg6, $arg7)
69935c4bbdfSmrg      printf("Event: device %d type %d detail %d flags %#x %s\n",
70035c4bbdfSmrg	      deviceid, type, detail, flags, str);
70135c4bbdfSmrg  }
70235c4bbdfSmrg	</programlisting>
70335c4bbdfSmrg
70435c4bbdfSmrg	Sample output from a run of this script:
70535c4bbdfSmrg	<screen><computeroutput>
70635c4bbdfSmrgEvent: device 13 type 4 detail 1 flags 0x0 nval: 0 ::
70735c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 1 ::	0: 1
70835c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -1
70935c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -1
71035c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 4	1: -3
71135c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 3	1: -3
71235c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 3	1: -2
71335c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -2
71435c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -2
71535c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -2
71635c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 	1: -1
71735c4bbdfSmrgEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 	1: -1
71835c4bbdfSmrgEvent: device 13 type 5 detail 1 flags 0x0 nval: 0 ::
71935c4bbdfSmrg	</computeroutput></screen>
72035c4bbdfSmrg
72135c4bbdfSmrg      </para>
72235c4bbdfSmrg
72335c4bbdfSmrg    </example>
72435c4bbdfSmrg
72535c4bbdfSmrg  </sect1>
72635c4bbdfSmrg
72735c4bbdfSmrg</article>
728