xserver: Branch 'server-1.14-branch' - 15 commits

Matt Dew marcoz at kemper.freedesktop.org
Tue Oct 22 18:07:00 PDT 2013


 Xext/saver.c          |    6 --
 Xext/sync.c           |  121 +++++++++++++++++++++++++++++++++-----------------
 Xi/xiallowev.c        |    2 
 dix/events.c          |  120 ++++++++++++++++++++++++++++++++++++-------------
 dix/globals.c         |    1 
 dix/window.c          |    4 -
 include/dix.h         |   11 ++++
 include/dixstruct.h   |    1 
 include/input.h       |    6 +-
 os/WaitFor.c          |    2 
 os/xdmcp.c            |    2 
 test/signal-logging.c |    3 -
 12 files changed, 191 insertions(+), 88 deletions(-)

New commits:
commit 07069f5d71dd0869fe9a6f9ab87c467e7ec75011
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Oct 17 12:02:27 2013 +1000

    sync: split updating and triggering a counter up
    
    Now that the brackets are always the nearest change points (regardless of
    transition) we need to update the counters whenever we check for any updates.
    
    Otherwise we end up with a situation where counter->value is out of date and
    an alarm doesn't trigger because we're still using the value from last time
    something actually triggered.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit 2523a445a09a75a8baf642608d099a5e12d5437f)

diff --git a/Xext/sync.c b/Xext/sync.c
index 7d6b4e0..9b4d0a4 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -699,6 +699,14 @@ SyncAwaitTriggerFired(SyncTrigger * pTrigger)
     FreeResource(pAwaitUnion->header.delete_id, RT_NONE);
 }
 
+static CARD64
+SyncUpdateCounter(SyncCounter *pCounter, CARD64 newval)
+{
+    CARD64 oldval = pCounter->value;
+    pCounter->value = newval;
+    return oldval;
+}
+
 /*  This function should always be used to change a counter's value so that
  *  any triggers depending on the counter will be checked.
  */
@@ -708,8 +716,7 @@ SyncChangeCounter(SyncCounter * pCounter, CARD64 newval)
     SyncTriggerList *ptl, *pnext;
     CARD64 oldval;
 
-    oldval = pCounter->value;
-    pCounter->value = newval;
+    oldval = SyncUpdateCounter(pCounter, newval);
 
     /* run through triggers to see if any become true */
     for (ptl = pCounter->sync.pTriglist; ptl; ptl = pnext) {
@@ -2712,6 +2719,8 @@ IdleTimeCheckBrackets(SyncCounter *counter, XSyncValue idle, XSyncValue *less, X
         (less && XSyncValueLessOrEqual(idle, *less))) {
         SyncChangeCounter(counter, idle);
     }
+    else
+        SyncUpdateCounter(counter, idle);
 }
 
 static void
commit fa5e4dcfb6236b8be0bf57edd1ff4f59cb2f8f6b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Oct 16 16:31:15 2013 +1000

    sync: always set the brackets (#59644)
    
    The current code sets bracket_greater to the first trigger after the current
    value, and bracket_less to the last trigger before the current value.
    
    For example, the idle timer with three negative and three positive transitions
    would set this:
    
             nt1       nt2                 nt3
    |--------|------|--|------- idle --|---|--|-----> t
                   pt1                pt2    pt3
    bracket_less == nt2
    bracket_greater == pt2
    
    This is an optimization so we can skip code paths in the block/wakeup handlers
    if the current value doesn't meet any of the trigger requirements. Those
    handlers largely do a
       if (bracket_less is less than current value &&
           bracket_greater is greater than current value)
            return, nothing to do
    
    However, unless the bracket values are updated at the correct time, the
    following may happen:
    
                                          nt
    |--------------|---------- idle ------|--------> t
                   pt
    
    In this case, neither bracket is set, we're past the pos transition and not
    yet at the neg transition. idle may now go past nt, but the brackets are not
    updated. If idle is then reset to 0, no alarm is triggered for nt. Likewise,
    idle may now go past pt and no alarm is triggered.
    
    Changing an alarm or triggering an alarm will re-calculate the brackets, so
    this bug is somewhat random. If any other client triggers an alarm when the
    brackets are wrongly NULL, the recalculation will set them this bug may not
    appear.
    
    This patch changes the behavior, so that the brackets are always the nearest
    positive or negative transitions to the current counter value. In the example
    above, nt will trigger a wakeup and a re-calculation of the brackets, so that
    going past it in the negative direction will then cause the proper alarm
    triggers.
    
    Or, in Keith's words:
    
      Timer currently past a positive trigger
          No bracket values, because no trigger in range
    
      Timer moves backwards before the positive trigger
          Brackets not reset, even though there is now a trigger in range
    
      Timer moves forward past the positive trigger
          Trigger doesn't fire because brackets not set
    
    Setting the LT bracket in this case will cause everything to get
    re-evaluated when the sync value moves backwards before the trigger
    value.
    
    X.Org Bug 59644 <http://bugs.freedesktop.org/show_bug.cgi?id=59644>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit e57ec99b03b2ad840c384a97ab2766ce9da0f5cc)

diff --git a/Xext/sync.c b/Xext/sync.c
index 2b8a794..7d6b4e0 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -1019,6 +1019,11 @@ SyncComputeBracketValues(SyncCounter * pCounter)
                 psci->bracket_greater = pTrigger->test_value;
                 pnewgtval = &psci->bracket_greater;
             }
+            else if (XSyncValueGreaterThan(pCounter->value, pTrigger->test_value) &&
+                     XSyncValueGreaterThan(pTrigger->test_value, psci->bracket_less)) {
+                    psci->bracket_less = pTrigger->test_value;
+                    pnewltval = &psci->bracket_less;
+            }
         }
         else if (pTrigger->test_type == XSyncNegativeComparison &&
                  ct != XSyncCounterNeverDecreases) {
@@ -1028,6 +1033,11 @@ SyncComputeBracketValues(SyncCounter * pCounter)
                 psci->bracket_less = pTrigger->test_value;
                 pnewltval = &psci->bracket_less;
             }
+            else if (XSyncValueLessThan(pCounter->value, pTrigger->test_value) &&
+                     XSyncValueLessThan(pTrigger->test_value, psci->bracket_greater)) {
+                    psci->bracket_greater = pTrigger->test_value;
+                    pnewgtval = &psci->bracket_greater;
+            }
         }
         else if (pTrigger->test_type == XSyncNegativeTransition &&
                  ct != XSyncCounterNeverIncreases) {
@@ -1041,6 +1051,11 @@ SyncComputeBracketValues(SyncCounter * pCounter)
                     psci->bracket_less = pTrigger->test_value;
                     pnewltval = &psci->bracket_less;
             }
+            else if (XSyncValueLessThan(pCounter->value, pTrigger->test_value) &&
+                     XSyncValueLessThan(pTrigger->test_value, psci->bracket_greater)) {
+                    psci->bracket_greater = pTrigger->test_value;
+                    pnewgtval = &psci->bracket_greater;
+            }
         }
         else if (pTrigger->test_type == XSyncPositiveTransition &&
                  ct != XSyncCounterNeverDecreases) {
@@ -1055,6 +1070,11 @@ SyncComputeBracketValues(SyncCounter * pCounter)
                     psci->bracket_greater = pTrigger->test_value;
                     pnewgtval = &psci->bracket_greater;
             }
+            else if (XSyncValueGreaterThan(pCounter->value, pTrigger->test_value) &&
+                     XSyncValueGreaterThan(pTrigger->test_value, psci->bracket_less)) {
+                    psci->bracket_less = pTrigger->test_value;
+                    pnewltval = &psci->bracket_less;
+            }
         }
     }                           /* end for each trigger */
 
commit 7b7753e97f0dfadfdcf28ce18b17a759b57f6be1
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Oct 16 10:08:46 2013 +1000

    sync: if the idle time was reset, force alarms to trigger (#70476)
    
    The time between the idle reset and the IdleTimeWakeupHandler to be called is
    indeterminate. Clients with an PositiveTransition or NegativeTransition alarm
    on a low threshold may miss an alarm.
    
    Work around this by keeping a reset flag for each device. When the
    WakeupHandler triggers and the reset flag is set, we force a re-calculation of
    everything and pretend the current idle time is zero. Immediately after is the
    next calculation with the real idle time.
    
    Relatively reproducible test case: Set up a XSyncNegativeTransition alarm for
    a threshold of 1 ms. May trigger, may not.
    
    X.Org Bug 70476 <http://bugs.freedesktop.org/show_bug.cgi?id=70476>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit 06b87aa528d7a739ba20101a1f83b1a428691a01)

diff --git a/Xext/sync.c b/Xext/sync.c
index e289361..2b8a794 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -2686,6 +2686,15 @@ IdleTimeBlockHandler(pointer pCounter, struct timeval **wt, pointer LastSelectMa
 }
 
 static void
+IdleTimeCheckBrackets(SyncCounter *counter, XSyncValue idle, XSyncValue *less, XSyncValue *greater)
+{
+    if ((greater && XSyncValueGreaterOrEqual(idle, *greater)) ||
+        (less && XSyncValueLessOrEqual(idle, *less))) {
+        SyncChangeCounter(counter, idle);
+    }
+}
+
+static void
 IdleTimeWakeupHandler(pointer pCounter, int rc, pointer LastSelectMask)
 {
     SyncCounter *counter = pCounter;
@@ -2699,10 +2708,24 @@ IdleTimeWakeupHandler(pointer pCounter, int rc, pointer LastSelectMask)
 
     IdleTimeQueryValue(pCounter, &idle);
 
-    if ((greater && XSyncValueGreaterOrEqual(idle, *greater)) ||
-        (less && XSyncValueLessOrEqual(idle, *less))) {
-        SyncChangeCounter(counter, idle);
+    /*
+      There is no guarantee for the WakeupHandler to be called within a specific
+      timeframe. Idletime may go to 0, but by the time we get here, it may be
+      non-zero and alarms for a pos. transition on 0 won't get triggered.
+      https://bugs.freedesktop.org/show_bug.cgi?id=70476
+      */
+    if (LastEventTimeWasReset(priv->deviceid)) {
+        LastEventTimeToggleResetFlag(priv->deviceid, FALSE);
+        if (!XSyncValueIsZero(idle)) {
+            XSyncValue zero;
+            XSyncIntsToValue(&zero, 0, 0);
+            IdleTimeCheckBrackets(counter, zero, less, greater);
+            less = priv->value_less;
+            greater = priv->value_greater;
+        }
     }
+
+    IdleTimeCheckBrackets(counter, idle, less, greater);
 }
 
 static void
@@ -2720,6 +2743,9 @@ IdleTimeBracketValues(pointer pCounter, CARD64 * pbracket_less,
                                      IdleTimeWakeupHandler, pCounter);
     }
     else if (!registered && (pbracket_less || pbracket_greater)) {
+        /* Reset flag must be zero so we don't force a idle timer reset on
+           the first wakeup */
+        LastEventTimeToggleResetAll(FALSE);
         RegisterBlockAndWakeupHandlers(IdleTimeBlockHandler,
                                        IdleTimeWakeupHandler, pCounter);
     }
diff --git a/dix/events.c b/dix/events.c
index 8bcc6bf..e3c0edf 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -262,7 +262,10 @@ InputInfo inputInfo;
 
 EventSyncInfoRec syncEvents;
 
-static TimeStamp lastDeviceEventTime[MAXDEVICES];
+static struct DeviceEventTime {
+    Bool reset;
+    TimeStamp time;
+} lastDeviceEventTime[MAXDEVICES];
 
 /**
  * The root window the given device is currently on.
@@ -1060,8 +1063,11 @@ MonthChangedOrBadTime(CARD32 *ms)
 void
 NoticeTime(const DeviceIntPtr dev, TimeStamp time)
 {
-    lastDeviceEventTime[XIAllDevices] = currentTime;
-    lastDeviceEventTime[dev->id] = currentTime;
+    lastDeviceEventTime[XIAllDevices].time = currentTime;
+    lastDeviceEventTime[dev->id].time = currentTime;
+
+    LastEventTimeToggleResetFlag(dev->id, TRUE);
+    LastEventTimeToggleResetFlag(XIAllDevices, TRUE);
 }
 
 static void
@@ -1085,7 +1091,30 @@ NoticeEventTime(InternalEvent *ev, DeviceIntPtr dev)
 TimeStamp
 LastEventTime(int deviceid)
 {
-    return lastDeviceEventTime[deviceid];
+    return lastDeviceEventTime[deviceid].time;
+}
+
+Bool
+LastEventTimeWasReset(int deviceid)
+{
+    return lastDeviceEventTime[deviceid].reset;
+}
+
+void
+LastEventTimeToggleResetFlag(int deviceid, Bool state)
+{
+    lastDeviceEventTime[deviceid].reset = state;
+}
+
+void
+LastEventTimeToggleResetAll(Bool state)
+{
+    DeviceIntPtr dev;
+    nt_list_for_each_entry(dev, inputInfo.devices, next) {
+        LastEventTimeToggleResetFlag(dev->id, FALSE);
+    }
+    LastEventTimeToggleResetFlag(XIAllDevices, FALSE);
+    LastEventTimeToggleResetFlag(XIAllMasterDevices, FALSE);
 }
 
 /**************************************************************************
@@ -5294,6 +5323,7 @@ InitEvents(void)
 
         dummy.id = i;
         NoticeTime(&dummy, currentTime);
+        LastEventTimeToggleResetFlag(i, FALSE);
     }
 
     syncEvents.replayDev = (DeviceIntPtr) NULL;
diff --git a/include/dix.h b/include/dix.h
index fd2490f..fa7ccd4 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -322,6 +322,12 @@ NoticeEventTime(InternalEvent *ev,
                 DeviceIntPtr dev);
 extern _X_EXPORT TimeStamp
 LastEventTime(int deviceid);
+extern _X_EXPORT Bool
+LastEventTimeWasReset(int deviceid);
+extern _X_EXPORT void
+LastEventTimeToggleResetFlag(int deviceid, Bool state);
+extern _X_EXPORT void
+LastEventTimeToggleResetAll(Bool state);
 
 extern void
 EnqueueEvent(InternalEvent * /* ev */ ,
commit 3866624a45074ba37a2e605d00df602c0222cd85
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Oct 16 09:36:01 2013 +1000

    dix: provide accessor methods for the last device event time
    
    And now that we have the accessors, localize it. No functional changes, just
    preparing for a future change.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit efc1035ca958f2c9d266338a308518a0834b1773)

diff --git a/Xext/saver.c b/Xext/saver.c
index fe81bc4..e06f408 100644
--- a/Xext/saver.c
+++ b/Xext/saver.c
@@ -392,9 +392,7 @@ ScreenSaverFreeSuspend(pointer value, XID id)
             DeviceIntPtr dev;
             UpdateCurrentTimeIf();
             nt_list_for_each_entry(dev, inputInfo.devices, next)
-                lastDeviceEventTime[dev->id] = currentTime;
-            lastDeviceEventTime[XIAllDevices] = currentTime;
-            lastDeviceEventTime[XIAllMasterDevices] = currentTime;
+                NoticeTime(dev, currentTime);
             SetScreenSaverTimer();
         }
     }
@@ -681,7 +679,7 @@ ProcScreenSaverQueryInfo(ClientPtr client)
     pPriv = GetScreenPrivate(pDraw->pScreen);
 
     UpdateCurrentTime();
-    lastInput = GetTimeInMillis() - lastDeviceEventTime[XIAllDevices].milliseconds;
+    lastInput = GetTimeInMillis() - LastEventTime(XIAllDevices).milliseconds;
 
     rep = (xScreenSaverQueryInfoReply) {
         .type = X_Reply,
diff --git a/Xext/sync.c b/Xext/sync.c
index 02fcbd1..e289361 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -2605,7 +2605,7 @@ IdleTimeQueryValue(pointer pCounter, CARD64 * pValue_return)
     }
     else
         deviceid = XIAllDevices;
-    idle = GetTimeInMillis() - lastDeviceEventTime[deviceid].milliseconds;
+    idle = GetTimeInMillis() - LastEventTime(deviceid).milliseconds;
     XSyncIntsToValue(pValue_return, idle, 0);
 }
 
diff --git a/dix/events.c b/dix/events.c
index e126549..8bcc6bf 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -262,6 +262,8 @@ InputInfo inputInfo;
 
 EventSyncInfoRec syncEvents;
 
+static TimeStamp lastDeviceEventTime[MAXDEVICES];
+
 /**
  * The root window the given device is currently on.
  */
@@ -1043,33 +1045,47 @@ XineramaGetCursorScreen(DeviceIntPtr pDev)
 #define TIMESLOP (5 * 60 * 1000)        /* 5 minutes */
 
 static void
-MonthChangedOrBadTime(InternalEvent *ev)
+MonthChangedOrBadTime(CARD32 *ms)
 {
     /* If the ddx/OS is careless about not processing timestamped events from
      * different sources in sorted order, then it's possible for time to go
      * backwards when it should not.  Here we ensure a decent time.
      */
-    if ((currentTime.milliseconds - ev->any.time) > TIMESLOP)
+    if ((currentTime.milliseconds - *ms) > TIMESLOP)
         currentTime.months++;
     else
-        ev->any.time = currentTime.milliseconds;
+        *ms = currentTime.milliseconds;
 }
 
-static void
-NoticeTime(InternalEvent *ev, DeviceIntPtr dev)
+void
+NoticeTime(const DeviceIntPtr dev, TimeStamp time)
 {
-    if (ev->any.time < currentTime.milliseconds)
-        MonthChangedOrBadTime(ev);
-    currentTime.milliseconds = ev->any.time;
     lastDeviceEventTime[XIAllDevices] = currentTime;
     lastDeviceEventTime[dev->id] = currentTime;
 }
 
+static void
+NoticeTimeMillis(const DeviceIntPtr dev, CARD32 *ms)
+{
+    TimeStamp time;
+    if (*ms < currentTime.milliseconds)
+        MonthChangedOrBadTime(ms);
+    time.months = currentTime.months;
+    time.milliseconds = *ms;
+    NoticeTime(dev, time);
+}
+
 void
 NoticeEventTime(InternalEvent *ev, DeviceIntPtr dev)
 {
     if (!syncEvents.playingEvents)
-        NoticeTime(ev, dev);
+        NoticeTimeMillis(dev, &ev->any.time);
+}
+
+TimeStamp
+LastEventTime(int deviceid)
+{
+    return lastDeviceEventTime[deviceid];
 }
 
 /**************************************************************************
@@ -1093,7 +1109,7 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
     if (!xorg_list_is_empty(&syncEvents.pending))
         tail = xorg_list_last_entry(&syncEvents.pending, QdEventRec, next);
 
-    NoticeTime((InternalEvent *)event, device);
+    NoticeTimeMillis(device, &ev->any.time);
 
     /* Fix for key repeating bug. */
     if (device->key != NULL && device->key->xkbInfo != NULL &&
@@ -5273,8 +5289,11 @@ InitEvents(void)
     inputInfo.pointer = (DeviceIntPtr) NULL;
 
     for (i = 0; i < MAXDEVICES; i++) {
+        DeviceIntRec dummy;
         memcpy(&event_filters[i], default_filter, sizeof(default_filter));
-        lastDeviceEventTime[i] = currentTime;
+
+        dummy.id = i;
+        NoticeTime(&dummy, currentTime);
     }
 
     syncEvents.replayDev = (DeviceIntPtr) NULL;
diff --git a/dix/globals.c b/dix/globals.c
index 332b91f..ad9145b 100644
--- a/dix/globals.c
+++ b/dix/globals.c
@@ -122,7 +122,6 @@ Bool party_like_its_1989 = FALSE;
 Bool whiteRoot = FALSE;
 
 TimeStamp currentTime;
-TimeStamp lastDeviceEventTime[MAXDEVICES];
 
 int defaultColorVisualClass = -1;
 int monitorResolution = 0;
diff --git a/dix/window.c b/dix/window.c
index 1cf46dc..19cfcd6 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -3093,9 +3093,7 @@ dixSaveScreens(ClientPtr client, int on, int mode)
             DeviceIntPtr dev;
             UpdateCurrentTimeIf();
             nt_list_for_each_entry(dev, inputInfo.devices, next)
-                lastDeviceEventTime[dev->id] = currentTime;
-            lastDeviceEventTime[XIAllDevices] = currentTime;
-            lastDeviceEventTime[XIAllMasterDevices] = currentTime;
+                NoticeTime(dev, currentTime);
         }
         SetScreenSaverTimer();
     }
diff --git a/include/dix.h b/include/dix.h
index 171e56e..fd2490f 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -315,8 +315,13 @@ extern _X_EXPORT WindowPtr
 GetSpriteWindow(DeviceIntPtr pDev);
 
 extern _X_EXPORT void
+NoticeTime(const DeviceIntPtr dev,
+           TimeStamp time);
+extern _X_EXPORT void
 NoticeEventTime(InternalEvent *ev,
                 DeviceIntPtr dev);
+extern _X_EXPORT TimeStamp
+LastEventTime(int deviceid);
 
 extern void
 EnqueueEvent(InternalEvent * /* ev */ ,
diff --git a/include/dixstruct.h b/include/dixstruct.h
index aef822c..492f960 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -155,7 +155,6 @@ typedef struct _WorkQueue {
 } WorkQueueRec;
 
 extern _X_EXPORT TimeStamp currentTime;
-extern _X_EXPORT TimeStamp lastDeviceEventTime[MAXDEVICES];
 
 extern _X_EXPORT int
 CompareTimeStamps(TimeStamp /*a */ ,
diff --git a/os/WaitFor.c b/os/WaitFor.c
index 393890f..c5f4cd7 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -561,7 +561,7 @@ NextDPMSTimeout(INT32 timeout)
 static CARD32
 ScreenSaverTimeoutExpire(OsTimerPtr timer, CARD32 now, pointer arg)
 {
-    INT32 timeout = now - lastDeviceEventTime[XIAllDevices].milliseconds;
+    INT32 timeout = now - LastEventTime(XIAllDevices).milliseconds;
     CARD32 nextTimeout = 0;
 
 #ifdef DPMSExtension
diff --git a/os/xdmcp.c b/os/xdmcp.c
index 0538ac5..11f1133 100644
--- a/os/xdmcp.c
+++ b/os/xdmcp.c
@@ -1391,7 +1391,7 @@ recv_alive_msg(unsigned length)
         if (SessionRunning && AliveSessionID == SessionID) {
             /* backoff dormancy period */
             state = XDM_RUN_SESSION;
-            if ((GetTimeInMillis() - lastDeviceEventTime[XIAllDevices].milliseconds) >
+            if ((GetTimeInMillis() - LastEventTime(XIAllDevices).milliseconds) >
                 keepaliveDormancy * 1000) {
                 keepaliveDormancy <<= 1;
                 if (keepaliveDormancy > XDM_MAX_DORMANCY)
commit 47e30b3649fc15efbc8cf06c604254d84652ede0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Oct 16 09:21:47 2013 +1000

    sync: supply the counter from IdleTimeBlockHandler
    
    The main idletime counter has an initialized deviceid, might as well be
    supplying it properly. Without this, we'd only ever check the XIAllDevices
    counter, so the wait would never be adjusted for the device-specific triggers.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit b7c9bd9cf276e92a73be57ff2ed32b47a80f13fb)

diff --git a/Xext/sync.c b/Xext/sync.c
index fa7a5c9..02fcbd1 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -2624,7 +2624,7 @@ IdleTimeBlockHandler(pointer pCounter, struct timeval **wt, pointer LastSelectMa
         return;
 
     old_idle = counter->value;
-    IdleTimeQueryValue(NULL, &idle);
+    IdleTimeQueryValue(counter, &idle);
     counter->value = idle;      /* push, so CheckTrigger works */
 
     if (less && XSyncValueLessOrEqual(idle, *less)) {
commit b47c02f21660bd99a5af5aa374294a22813d6679
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Oct 16 13:01:01 2013 +1000

    sync: always call BracketValues when recalculating upper/lower brackets
    
    Both ServertimeBracketValues and IdleTimeBracketValues copy the value into
    there SysCounter privates. Call it for a NULL set as well, so we don't end up
    with stale pointers and we can remove the block/wakeup handlers.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit 2efe49c1029f959fe80879bcf50df42e8b80451d)

diff --git a/Xext/sync.c b/Xext/sync.c
index 17826c2..fa7a5c9 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -1058,9 +1058,8 @@ SyncComputeBracketValues(SyncCounter * pCounter)
         }
     }                           /* end for each trigger */
 
-    if (pnewgtval || pnewltval) {
-        (*psci->BracketValues) ((pointer) pCounter, pnewltval, pnewgtval);
-    }
+    (*psci->BracketValues) ((pointer) pCounter, pnewltval, pnewgtval);
+
 }
 
 /*
commit 0033e969f4de84aa08ae321bc268a1461e12824b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Oct 15 10:11:20 2013 +1000

    sync: compress two if statements
    
    No functional changes, just merges a > and == condition into a >= condition.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Reviewed-by: Keith Packard <keithp at keithp.com>
    (cherry picked from commit 5c7cfd4c6978834551848e1be62af240102e39b5)

diff --git a/Xext/sync.c b/Xext/sync.c
index 4d11992..17826c2 100644
--- a/Xext/sync.c
+++ b/Xext/sync.c
@@ -1031,42 +1031,29 @@ SyncComputeBracketValues(SyncCounter * pCounter)
         }
         else if (pTrigger->test_type == XSyncNegativeTransition &&
                  ct != XSyncCounterNeverIncreases) {
-            if (XSyncValueGreaterThan(pCounter->value, pTrigger->test_value) &&
-                XSyncValueGreaterThan(pTrigger->test_value, psci->bracket_less))
-            {
-                psci->bracket_less = pTrigger->test_value;
-                pnewltval = &psci->bracket_less;
-            }
-            else if (XSyncValueEqual(pCounter->value, pTrigger->test_value) &&
-                     XSyncValueGreaterThan(pTrigger->test_value,
-                                           psci->bracket_less)) {
-                /*
-                 * The value is exactly equal to our threshold.  We want one
-                 * more event in the negative direction to ensure we pick up
-                 * when the value is less than this threshold.
-                 */
-                psci->bracket_less = pTrigger->test_value;
-                pnewltval = &psci->bracket_less;
+            if (XSyncValueGreaterOrEqual(pCounter->value, pTrigger->test_value) &&
+                XSyncValueGreaterThan(pTrigger->test_value, psci->bracket_less)) {
+                    /*
+                     * If the value is exactly equal to our threshold, we want one
+                     * more event in the negative direction to ensure we pick up
+                     * when the value is less than this threshold.
+                     */
+                    psci->bracket_less = pTrigger->test_value;
+                    pnewltval = &psci->bracket_less;
             }
         }
         else if (pTrigger->test_type == XSyncPositiveTransition &&
                  ct != XSyncCounterNeverDecreases) {
-            if (XSyncValueLessThan(pCounter->value, pTrigger->test_value) &&
-                XSyncValueLessThan(pTrigger->test_value, psci->bracket_greater))
-            {
-                psci->bracket_greater = pTrigger->test_value;
-                pnewgtval = &psci->bracket_greater;
-            }
-            else if (XSyncValueEqual(pCounter->value, pTrigger->test_value) &&
-                     XSyncValueLessThan(pTrigger->test_value,
-                                        psci->bracket_greater)) {
-                /*
-                 * The value is exactly equal to our threshold.  We want one
-                 * more event in the positive direction to ensure we pick up
-                 * when the value *exceeds* this threshold.
-                 */
-                psci->bracket_greater = pTrigger->test_value;
-                pnewgtval = &psci->bracket_greater;
+            if (XSyncValueLessOrEqual(pCounter->value, pTrigger->test_value) &&
+                XSyncValueLessThan(pTrigger->test_value, psci->bracket_greater)) {
+                    /*
+                     * If the value is exactly equal to our threshold, we
+                     * want one more event in the positive direction to
+                     * ensure we pick up when the value *exceeds* this
+                     * threshold.
+                     */
+                    psci->bracket_greater = pTrigger->test_value;
+                    pnewgtval = &psci->bracket_greater;
             }
         }
     }                           /* end for each trigger */
commit 0c809f459c9997f743961081bc089fd2999fdcdb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Sep 4 15:34:29 2013 +1000

    dix: only deliver for the current grab type
    
    Use the grabtype to determine which type of event to send - all other events
    are pointless and may result in erroneous events being delivered.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit 7cf1b595c8c8f9776a39559d2878cf90af3f2859)

diff --git a/dix/events.c b/dix/events.c
index 5a2d0a8..e126549 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4253,17 +4253,8 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 
         sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
         /* try core event */
-        if (sendCore && grab->grabtype == CORE) {
-            deliveries = DeliverOneGrabbedEvent(event, thisDev, CORE);
-        }
-
-        if (!deliveries) {
-            deliveries = DeliverOneGrabbedEvent(event, thisDev, XI2);
-        }
-
-        if (!deliveries) {
-            deliveries = DeliverOneGrabbedEvent(event, thisDev, XI);
-        }
+        if ((sendCore && grab->grabtype == CORE) || grab->grabtype != CORE)
+            deliveries = DeliverOneGrabbedEvent(event, thisDev, grab->grabtype);
 
         if (deliveries && (event->any.type == ET_Motion))
             thisDev->valuator->motionHintWindow = grab->window;
commit acb447ef69bdfcae4fe7de4eef880c3bae0f7d4c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Sep 4 15:34:28 2013 +1000

    dix: don't attempt to deliver an event for a different grabtype
    
    For an active grab, grab->eventMask can be either the core or the XI1 mask.
    With the overlap of event filters, calling DeliverOneGrabbedEvent(XI1) for a
    ProximityOut event will trigger if the client has selected for enter events -
    the filter is the same for both.
    
    Thus, we end up delivering a proximity event to a client not expecting one.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit 78944d62ffc7fec6f75b6f514ab7a139ba9bc77b)

diff --git a/dix/events.c b/dix/events.c
index 63d24da..5a2d0a8 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4139,6 +4139,9 @@ DeliverOneGrabbedEvent(InternalEvent *event, DeviceIntPtr dev,
     GrabPtr grab = grabinfo->grab;
     Mask filter;
 
+    if (grab->grabtype != level)
+        return 0;
+
     switch (level) {
     case XI2:
         rc = EventToXI2(event, &xE);
commit f5b22ee8ba829aa095df3d091ec0a74e0aa42778
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Sep 4 15:34:27 2013 +1000

    include: change grabtypes to start at 1
    
    Avoid erroneous detection of an unset grabtype as CORE
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit 6159811a1aaf848016dbfa7bde68df097027870c)

diff --git a/include/input.h b/include/input.h
index 7eed60b..bff7ffe 100644
--- a/include/input.h
+++ b/include/input.h
@@ -113,9 +113,9 @@ SOFTWARE.
 #endif
 
 enum InputLevel {
-    CORE,
-    XI,
-    XI2,
+    CORE = 1,
+    XI = 2,
+    XI2 = 3,
 };
 
 typedef unsigned long Leds;
commit d409cc884c53e7f66ee9266c85cdb7c100365c8f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Sep 4 15:34:26 2013 +1000

    dix: only allow button and key events to freeze a sync'd pointer
    
    If a client calls XAllowEvents(SyncPointer) it expects events as normal until
    the next button press or release event - that freezes the device. An e.g.
    proximity event must thus not freeze the pointer.
    
    As per the spec, only button and key events may do so, so narrow it to these
    cases.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit be6ea80b79b3d6eb97106ea142e01acbdf059995)

diff --git a/dix/events.c b/dix/events.c
index 5027a72..63d24da 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4265,7 +4265,11 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
         if (deliveries && (event->any.type == ET_Motion))
             thisDev->valuator->motionHintWindow = grab->window;
     }
-    if (deliveries && !deactivateGrab && event->any.type != ET_Motion) {
+    if (deliveries && !deactivateGrab &&
+        (event->any.type == ET_KeyPress ||
+         event->any.type == ET_KeyRelease ||
+         event->any.type == ET_ButtonPress ||
+         event->any.type == ET_ButtonRelease)) {
         switch (grabinfo->sync.state) {
         case FREEZE_BOTH_NEXT_EVENT:
             dev = GetPairedDevice(thisDev);
commit 551dbf744b38a3da3d39b9154cb30d1197297eb1
Author: Egbert Eich <eich at freedesktop.org>
Date:   Fri Aug 16 19:52:16 2013 +0200

    DIX/Xi: Pass correct client to CheckDeviceGrabAndHintWindow()
    
    If we have a client which has registered for a DeviceButton grab
    be sure to pass this to CheckDeviceGrabAndHintWindow(). Since the
    order of clients is arbitrary there is no guarantee that the last
    client in the list is the one that belongs to this class.
    
    Signed-off-by: Egbert Eich <eich at freedesktop.org>
    Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit 05ea6307fa4f0bee3d3bf536396059f3906791a0)

diff --git a/dix/events.c b/dix/events.c
index c53a648..5027a72 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2102,6 +2102,7 @@ DeliverEventToInputClients(DeviceIntPtr dev, InputClients * inputclients,
 {
     int attempt;
     enum EventDeliveryState rc = EVENT_NOT_DELIVERED;
+    Bool have_device_button_grab_class_client = FALSE;
 
     for (; inputclients; inputclients = inputclients->next) {
         Mask mask;
@@ -2121,13 +2122,21 @@ DeliverEventToInputClients(DeviceIntPtr dev, InputClients * inputclients,
                                             events, count,
                                             mask, filter, grab))) {
             if (attempt > 0) {
-                rc = EVENT_DELIVERED;
-                *client_return = client;
-                *mask_return = mask;
-                /* Success overrides non-success, so if we've been
-                 * successful on one client, return that */
-            }
-            else if (rc == EVENT_NOT_DELIVERED)
+                /*
+                 * The order of clients is arbitrary therefore if one
+                 * client belongs to DeviceButtonGrabClass make sure to
+                 * catch it.
+                 */
+                if (!have_device_button_grab_class_client) {
+                    rc = EVENT_DELIVERED;
+                    *client_return = client;
+                    *mask_return = mask;
+                    /* Success overrides non-success, so if we've been
+                     * successful on one client, return that */
+                    if (mask & DeviceButtonGrabMask)
+                        have_device_button_grab_class_client = TRUE;
+                }
+            } else if (rc == EVENT_NOT_DELIVERED)
                 rc = EVENT_REJECTED;
         }
     }
commit cc7084af0d61e88ec0a62e14d6eef10c0b2b8b38
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Aug 26 15:51:46 2013 +1000

    Xi: allow for XIAllowEvent requests larger than XI < 2.2 size (#68554)
    
    XIAllowEvents changed length in XI 2.2 (for the touchid). A bug in libXi
    causes libXi to always use the new request length if the server supports
    2.2, regardless of the client's XIQueryVersion request.
    
    The server takes the client's XIQueryVersion request into account though,
    resulting in a BadLength error if a 2.[0,1] client calls XIAllowEvents on a
    XI 2.2+ server.
    
    Can't fix this in libXi, so work around this in the server.
    
    X.Org Bug 68554 <http://bugs.freedesktop.org/show_bug.cgi?id=68554>
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    (cherry picked from commit 94d4e29aedc69431fa9b299ca1b67947173d7a24)

diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c
index 62a0727..ebef233 100644
--- a/Xi/xiallowev.c
+++ b/Xi/xiallowev.c
@@ -81,7 +81,7 @@ ProcXIAllowEvents(ClientPtr client)
         have_xi22 = TRUE;
     }
     else {
-        REQUEST_SIZE_MATCH(xXIAllowEventsReq);
+        REQUEST_AT_LEAST_SIZE(xXIAllowEventsReq);
     }
 
     ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
commit 2ac257d845e7f52975123741292056b3df02f908
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Aug 16 15:30:59 2013 +1000

    dix: check for grab type before checking XI2 mask
    
    if the grab type isn't XI2, grab->xi2mask is random. That random data may
    have the enter/leave mask set, leading to events sent to the client that the
    client can't handler.
    
    Source of these errors:
      _xgeWireToEvent: Unknown extension 131, this should never happen.
    
    Simplest reproducer:
       Start Xephyr, press button inside window, move out. As the pointer leaves
       the Xephyr window, the errors appear.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    (cherry picked from commit 82939e02392cbb880313fe92957091ff89ce2f2b)

diff --git a/dix/events.c b/dix/events.c
index c079f97..c53a648 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4641,7 +4641,7 @@ DeviceEnterLeaveEvent(DeviceIntPtr mouse,
 
     filter = GetEventFilter(mouse, (xEvent *) event);
 
-    if (grab) {
+    if (grab && grab->type == XI2) {
         Mask mask;
 
         mask = xi2mask_isset(grab->xi2mask, mouse, type);
commit 3ac50dca8b4b9b6b3a7e16c5855ca246a70c9232
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Aug 23 09:04:01 2013 +1000

    test: fix the gcc diagnostics pragma
    
    pop without push restores the commandline options. The proper way is to
    push, then ignore, then pop.
    
    And while we're at it, change the pop argument to a comment - pop ignores
    the argument, but be proper about it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
    (cherry picked from commit d803f296c616ccf55711cf0af9e7d3eae2edda16)

diff --git a/test/signal-logging.c b/test/signal-logging.c
index f6bc85c..a03c5ac 100644
--- a/test/signal-logging.c
+++ b/test/signal-logging.c
@@ -150,6 +150,7 @@ number_formatting(void)
         assert(check_float_format_test(float_tests[i]));
 }
 
+#pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat-security"
 static void logging_format(void)
 {
@@ -378,7 +379,7 @@ static void logging_format(void)
 
 #undef read_log_msg
 }
-#pragma GCC diagnostic pop "-Wformat-security"
+#pragma GCC diagnostic pop /* "-Wformat-security" */
 
 int
 main(int argc, char **argv)


More information about the xorg-commit mailing list