Cool beans! Acked-by: Jeremy Huddleston <[email protected]>
On Mar 7, 2012, at 9:47 PM, Peter Hutterer <[email protected]> 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 <[email protected]> > --- > 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 > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
