[PATCH] dix: add dtrace probes to input API

Jeremy Huddleston jeremyhu at apple.com
Thu Mar 8 09:00:59 PST 2012


Cool beans!

Acked-by: Jeremy Huddleston <jeremyhu at apple.com>

On Mar 7, 2012, at 9:47 PM, Peter Hutterer <peter.hutterer at who-t.net> wrote:

> For driver debugging, it is helpful to know whether the driver has actually
> submitted an event to the server. dtrace hook can help here.
> 
> Note that GetPointerEvents and friends may also be triggerd by the server
> for other emulated devices, some care must be taken when analysing the
> results.
> 
> Additional difficulty: proximity events have a run-time assigned type, so
> this may make automatic detection a tad harder. If in doubt, go for any
> event > 64 since the only two that can have that value are ProximityIn and
> ProximityOut.
> 
> An example systemtap script is below:
> 
>  # 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] & (1 << ((bit) & 7)))
> 
>          s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators);
>          for (i = 0; i < 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("T: device %d type %d detail %d flags %#x %s\n",
>              deviceid, type, detail, flags, str);
>  }
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> I'd have preferred an xf86Post*Event integration, but this way other DDXs
> get use of it too. Plus, the patch is _a lot_ smaller.
> 
> dix/Xserver-dtrace.h.in |    7 ++++++-
> dix/Xserver.d           |    2 ++
> dix/getevents.c         |   40 ++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 48 insertions(+), 1 deletions(-)
> 
> diff --git a/dix/Xserver-dtrace.h.in b/dix/Xserver-dtrace.h.in
> index daf3faf..3060190 100644
> --- a/dix/Xserver-dtrace.h.in
> +++ b/dix/Xserver-dtrace.h.in
> @@ -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, void *, void *);
> +
> 
> #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
> }
> diff --git a/dix/Xserver.d b/dix/Xserver.d
> index 2ad3373..8debd28 100644
> --- a/dix/Xserver.d
> +++ b/dix/Xserver.d
> @@ -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, lastbit, (double*)mask, (double*)values */
> +	probe input__event(int, int, uint32_t, uint32_t, int8_t, void*, void *);
> };
> 
> #pragma D attributes Unstable/Unstable/Common provider Xserver provider
> diff --git a/dix/getevents.c b/dix/getevents.c
> index 306d0ff..3c27aef 100644
> --- a/dix/getevents.c
> +++ b/dix/getevents.c
> @@ -68,6 +68,10 @@
> #include "extnsionst.h"
> #include "listdev.h" /* for sizing up DeviceClassesChangedEvent */
> 
> +#if XSERVER_DTRACE
> +#include <Xserver-dtrace.h>
> +#endif
> +
> /* Number of motion history events to store. */
> #define MOTION_HISTORY_SIZE 256
> 
> @@ -1022,6 +1026,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 +1516,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;
> @@ -1630,6 +1652,15 @@ GetProximityEvents(InternalEvent *events, DeviceIntPtr pDev, int type, const Val
>     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;
> @@ -1753,6 +1784,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;
> 
> -- 
> 1.7.7.6
> 



More information about the xorg-devel mailing list