[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