Merge branch 'dtrace-input-abi' into for-keith

This commit is contained in:
Peter Hutterer 2012-03-22 11:34:43 +10:00
commit bf876c87a9
4 changed files with 201 additions and 3 deletions

View File

@ -54,7 +54,8 @@ extern "C" {
__dtrace_Xserver___resource__free(arg0, arg1, arg2, arg3)
#define XSERVER_SEND_EVENT(arg0, arg1, arg2) \
__dtrace_Xserver___send__event(arg0, arg1, arg2)
#define XSERVER_INPUT_EVENT(arg0, arg1, arg2, arg3, arg4, arg5, arg6) \
__dtrace_Xserver___input__event(arg0, arg1, arg2, arg3, arg4, arg5, arg6)
extern void __dtrace_Xserver___client__auth(int, string, pid_t, zoneid_t);
extern void __dtrace_Xserver___client__connect(int, int);
@ -64,6 +65,8 @@ extern void __dtrace_Xserver___request__start(string, uint8_t, uint16_t, int, vo
extern void __dtrace_Xserver___resource__alloc(uint32_t, uint32_t, void *, string);
extern void __dtrace_Xserver___resource__free(uint32_t, uint32_t, void *, string);
extern void __dtrace_Xserver___send__event(int, uint8_t, void *);
extern void __dtrace_Xserver___input__event(int, uint16_t, uint32_t, uint32_t, int8_t, uint8_t *, double *);
#else
@ -75,6 +78,7 @@ extern void __dtrace_Xserver___send__event(int, uint8_t, void *);
#define XSERVER_RESOURCE_ALLOC(arg0, arg1, arg2, arg3)
#define XSERVER_RESOURCE_FREE(arg0, arg1, arg2, arg3)
#define XSERVER_SEND_EVENT(arg0, arg1, arg2)
#define XSERVER_INPUT_EVENT(arg0, arg1, arg2, arg3, arg4, arg5, arg6)
#endif
@ -86,6 +90,7 @@ extern void __dtrace_Xserver___send__event(int, uint8_t, void *);
#define XSERVER_RESOURCE_ALLOC_ENABLED() (1)
#define XSERVER_RESOURCE_FREE_ENABLED() (1)
#define XSERVER_SEND_EVENT_ENABLED() (1)
#define XSERVER_INPUT_EVENT_ENABLED() (1)
#ifdef __cplusplus
}

View File

@ -48,6 +48,8 @@ provider Xserver {
probe resource__free(uint32_t, uint32_t, void *, string);
/* client id, event type, event* */
probe send__event(int, uint8_t, void *);
/* deviceid, type, button/keycode/touchid, flags, nvalues, mask, values */
probe input__event(int, int, uint32_t, uint32_t, int8_t, uint8_t*, double*);
};
#pragma D attributes Unstable/Unstable/Common provider Xserver provider

View File

@ -68,6 +68,12 @@
#include "extnsionst.h"
#include "listdev.h" /* for sizing up DeviceClassesChangedEvent */
#if XSERVER_DTRACE
#include <sys/types.h>
typedef const char *string;
#include <Xserver-dtrace.h>
#endif
/* Number of motion history events to store. */
#define MOTION_HISTORY_SIZE 256
@ -1026,6 +1032,15 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
RawDeviceEvent *raw;
ValuatorMask mask;
#if XSERVER_DTRACE
if (XSERVER_INPUT_EVENT_ENABLED()) {
XSERVER_INPUT_EVENT(pDev->id, type, key_code, 0,
mask_in ? mask_in->last_bit + 1 : 0,
mask_in ? mask_in->mask : NULL,
mask_in ? mask_in->valuators : NULL);
}
#endif
/* refuse events from disabled devices */
if (!pDev->enabled)
return 0;
@ -1503,6 +1518,15 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
int i;
int realtype = type;
#if XSERVER_DTRACE
if (XSERVER_INPUT_EVENT_ENABLED()) {
XSERVER_INPUT_EVENT(pDev->id, type, buttons, flags,
mask_in ? mask_in->last_bit + 1 : 0,
mask_in ? mask_in->mask : NULL,
mask_in ? mask_in->valuators : NULL);
}
#endif
/* refuse events from disabled devices */
if (!pDev->enabled)
return 0;
@ -1628,6 +1652,15 @@ GetProximityEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
DeviceEvent *event;
ValuatorMask mask;
#if XSERVER_DTRACE
if (XSERVER_INPUT_EVENT_ENABLED()) {
XSERVER_INPUT_EVENT(pDev->id, type, 0, 0,
mask_in ? mask_in->last_bit + 1 : 0,
mask_in ? mask_in->mask : NULL,
mask_in ? mask_in->valuators : NULL);
}
#endif
/* refuse events from disabled devices */
if (!pDev->enabled)
return 0;
@ -1752,6 +1785,15 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
Bool emulate_pointer = FALSE;
int client_id = 0;
#if XSERVER_DTRACE
if (XSERVER_INPUT_EVENT_ENABLED()) {
XSERVER_INPUT_EVENT(dev->id, type, ddx_touchid, flags,
mask_in ? mask_in->last_bit + 1 : 0,
mask_in ? mask_in->mask : NULL,
mask_in ? mask_in->valuators : NULL);
}
#endif
if (!dev->enabled || !t || !v)
return 0;

View File

@ -52,7 +52,9 @@ DEALINGS IN THE SOFTWARE.
facility in <productname>Solaris</productname> 10,
<productname>MacOS X</productname> 10.5, and later releases. This
provider instruments various points in the X server, to allow
tracing what client applications are up to.
tracing what client applications are up to. DTrace probes may be used
with <ulink url="http://sourceware.org/systemtap/">SystemTap</ulink>
on GNU/Linux systems.
</para>
<para>
@ -81,7 +83,7 @@ DEALINGS IN THE SOFTWARE.
<table id="Probes_and_their_arguments">
<title>Probes and their arguments</title>
<tgroup cols='7'>
<tgroup cols='9'>
<colspec colname="probe" colwidth="2*"/>
<colspec colname="desc" colwidth="3*"/>
<colspec colname="arg0" colwidth="1*"/>
@ -89,6 +91,8 @@ DEALINGS IN THE SOFTWARE.
<colspec colname="arg2" colwidth="1*"/>
<colspec colname="arg3" colwidth="1*"/>
<colspec colname="arg4" colwidth="1*"/>
<colspec colname="arg5" colwidth="1*"/>
<colspec colname="arg6" colwidth="1*"/>
<spanspec spanname="all" namest="probe" nameend="arg4"/>
<thead>
<row>
@ -99,6 +103,8 @@ DEALINGS IN THE SOFTWARE.
<entry>arg2</entry>
<entry>arg3</entry>
<entry>arg4</entry>
<entry>arg5</entry>
<entry>arg6</entry>
</row>
</thead>
<tbody>
@ -113,6 +119,8 @@ DEALINGS IN THE SOFTWARE.
<entry><parameter>requestLength</parameter></entry>
<entry><parameter>clientId</parameter></entry>
<entry><parameter>requestBuffer</parameter></entry>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry>request-done</entry>
@ -122,6 +130,8 @@ DEALINGS IN THE SOFTWARE.
<entry><parameter>sequenceNumber</parameter></entry>
<entry><parameter>clientId</parameter></entry>
<entry><parameter>resultCode</parameter></entry>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry spanname="all" class="grouphead">Event Probes</entry>
@ -132,7 +142,10 @@ DEALINGS IN THE SOFTWARE.
<entry><parameter>clientId</parameter></entry>
<entry><parameter>eventCode</parameter></entry>
<entry><parameter>eventBuffer</parameter></entry>
<entry nameend="arg3" class="unused"/>
<entry nameend="arg4" class="unused"/>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry spanname="all" class="grouphead">Client Connection Probes</entry>
@ -142,7 +155,11 @@ DEALINGS IN THE SOFTWARE.
<entry>Called when a new connection is opened from a client</entry>
<entry><parameter>clientId</parameter></entry>
<entry><parameter>clientFD</parameter></entry>
<entry nameend="arg2" class="unused"/>
<entry nameend="arg3" class="unused"/>
<entry nameend="arg4" class="unused"/>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry>client-auth</entry>
@ -152,12 +169,19 @@ DEALINGS IN THE SOFTWARE.
<entry><parameter>clientPid</parameter></entry>
<entry><parameter>clientZoneId</parameter></entry>
<entry nameend="arg4" class="unused"/>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry>client-disconnect</entry>
<entry>Called when a client connection is closed</entry>
<entry><parameter>clientId</parameter></entry>
<entry nameend="arg1" class="unused"/>
<entry nameend="arg2" class="unused"/>
<entry nameend="arg3" class="unused"/>
<entry nameend="arg4" class="unused"/>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry spanname="all" class="grouphead">Resource Allocation Probes</entry>
@ -170,6 +194,8 @@ DEALINGS IN THE SOFTWARE.
<entry><parameter>resourceValue</parameter></entry>
<entry><parameter>resourceTypeName</parameter></entry>
<entry nameend="arg4" class="unused"/>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry>resource-free</entry>
@ -179,6 +205,24 @@ DEALINGS IN THE SOFTWARE.
<entry><parameter>resourceValue</parameter></entry>
<entry><parameter>resourceTypeName</parameter></entry>
<entry nameend="arg4" class="unused"/>
<entry nameend="arg5" class="unused"/>
<entry nameend="arg6" class="unused"/>
</row>
<row>
<entry spanname="all" class="grouphead">Input API probes</entry>
</row>
<row>
<entry>input-event</entry>
<entry>Called when an input event was submitted for processing</entry>
<entry><parameter>deviceid</parameter></entry>
<entry><parameter>eventtype</parameter></entry>
<entry><parameter>button</parameter> or
<parameter>keycode</parameter> or
<parameter>touchid</parameter></entry>
<entry><parameter>flags</parameter></entry>
<entry><parameter>nvalues</parameter></entry>
<entry><parameter>mask</parameter></entry>
<entry><parameter>values</parameter></entry>
</row>
</tbody>
</tgroup>
@ -304,6 +348,44 @@ DEALINGS IN THE SOFTWARE.
<entry><type>uint32_t</type></entry>
<entry>Number of X request in in this connection</entry>
</row>
<row>
<entry><parameter>deviceid</parameter></entry>
<entry><type>int</type></entry>
<entry>The device's numerical ID</entry>
</row>
<row>
<entry><parameter>eventtype</parameter></entry>
<entry><type>int</type></entry>
<entry>Protocol event type</entry>
</row>
<row>
<entry><parameter>button, keycode, touchid</parameter></entry>
<entry><type>uint32_t</type></entry>
<entry>The button number, keycode or touch ID</entry>
</row>
<row>
<entry><parameter>flags</parameter></entry>
<entry><type>uint32_t</type></entry>
<entry>Miscellaneous event-specific server flags</entry>
</row>
<row>
<entry><parameter>nvalues</parameter></entry>
<entry><type>int8_t</type></entry>
<entry>Number of bits in <parameter>mask</parameter> and number of elements
in <parameter>values</parameter></entry>
</row>
<row>
<entry><parameter>mask</parameter></entry>
<entry><type>uint8_t*</type></entry>
<entry>Binary mask indicating which indices in <parameter>values</parameter> contain
valid data</entry>
</row>
<row>
<entry><parameter>values</parameter></entry>
<entry><type>double*</type></entry>
<entry>Valuator values. Values for indices for which the
<parameter>mask</parameter> is not set are undefined</entry>
</row>
</tbody>
</tgroup>
</table>
@ -572,6 +654,73 @@ Xserver$1:::client-disconnect
</example>
<example id="Input_API_monitoring_with_systemtap">
<title>Input API monitoring with SystemTap</title>
<para>
This script can be used to monitor events submitted by drivers to
the server for enqueuing. Due to the integration of the input API
probes, some server-enqueued events will show up too.
<programlisting>
# Compile+run with
# stap -g xorg.stp /usr/bin/Xorg
#
function print_valuators:string(nvaluators:long, mask_in:long, valuators_in:long) %{
int i;
unsigned char *mask = (unsigned char*)THIS->mask_in;
double *valuators = (double*)THIS->valuators_in;
char str[128] = {0};
char *s = str;
#define BitIsSet(ptr, bit) (((unsigned char*)(ptr))[(bit)>>3] &amp; (1 &lt;&lt; ((bit) &amp; 7)))
s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators);
for (i = 0; i &lt; THIS->nvaluators; i++)
{
s += sprintf(s, " %d: ", i);
if (BitIsSet(mask, i))
s += sprintf(s, "%d", (int)valuators[i]);
}
sprintf(THIS->__retvalue, "%s", str);
%}
probe process(@1).mark("input__event")
{
deviceid = $arg1
type = $arg2
detail = $arg3
flags = $arg4
nvaluators = $arg5
str = print_valuators(nvaluators, $arg6, $arg7)
printf("Event: device %d type %d detail %d flags %#x %s\n",
deviceid, type, detail, flags, str);
}
</programlisting>
Sample output from a run of this script:
<screen><computeroutput>
Event: device 13 type 4 detail 1 flags 0x0 nval: 0 ::
Event: device 13 type 6 detail 0 flags 0xa nval: 1 :: 0: 1
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 4 1: -3
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -3
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -2
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1
Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1
Event: device 13 type 5 detail 1 flags 0x0 nval: 0 ::
</computeroutput></screen>
</para>
</example>
</sect1>